diff --git a/bundles/org.eclipse.core.boot/.classpath b/bundles/org.eclipse.core.boot/.classpath
deleted file mode 100644
index ddf0f40..0000000
--- a/bundles/org.eclipse.core.boot/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.boot/.cvsignore b/bundles/org.eclipse.core.boot/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.core.boot/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.core.boot/.project b/bundles/org.eclipse.core.boot/.project
deleted file mode 100644
index cd0e722..0000000
--- a/bundles/org.eclipse.core.boot/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.boot</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.boot/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.boot/META-INF/MANIFEST.MF
deleted file mode 100644
index 01c3d02..0000000
--- a/bundles/org.eclipse.core.boot/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.core.boot
-Bundle-Version: 3.1.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Eclipse-AutoStart: true
diff --git a/bundles/org.eclipse.core.boot/about.html b/bundles/org.eclipse.core.boot/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/bundles/org.eclipse.core.boot/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.boot/build.properties b/bundles/org.eclipse.core.boot/build.properties
deleted file mode 100644
index fea56fc..0000000
--- a/bundles/org.eclipse.core.boot/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .,\
-               plugin.properties,\
-               about.html,\
-               META-INF/,\
-               readme.txt
-src.includes=about.html
diff --git a/bundles/org.eclipse.core.boot/plugin.properties b/bundles/org.eclipse.core.boot/plugin.properties
deleted file mode 100644
index f91a5c2..0000000
--- a/bundles/org.eclipse.core.boot/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# Boot strings
-pluginName = Core Boot
-providerName = Eclipse.org
diff --git a/bundles/org.eclipse.core.boot/readme.txt b/bundles/org.eclipse.core.boot/readme.txt
deleted file mode 100644
index 2d2cf7b..0000000
--- a/bundles/org.eclipse.core.boot/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-The features provided by this plug-in moved to org.eclipse.core.runtime, org.eclipse.core.runtime.compatiblilty or org.eclipse.update.configurator.
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.contenttype/.classpath b/bundles/org.eclipse.core.contenttype/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/bundles/org.eclipse.core.contenttype/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.contenttype/.cvsignore b/bundles/org.eclipse.core.contenttype/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.core.contenttype/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.core.contenttype/.options b/bundles/org.eclipse.core.contenttype/.options
deleted file mode 100644
index c36e0d8..0000000
--- a/bundles/org.eclipse.core.contenttype/.options
+++ /dev/null
@@ -1,5 +0,0 @@
-# Debugging options for the org.eclipse.core.contenttype plugin
-
-# Turn on debugging for content types
-org.eclipse.core.contenttype/debug=false
-
diff --git a/bundles/org.eclipse.core.contenttype/.project b/bundles/org.eclipse.core.contenttype/.project
deleted file mode 100644
index 9c05d5c..0000000
--- a/bundles/org.eclipse.core.contenttype/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.contenttype</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.contenttype/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.core.contenttype/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index ec50f8d..0000000
--- a/bundles/org.eclipse.core.contenttype/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri Jan 06 15:50:24 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=;
-org.eclipse.jdt.ui.ondemandthreshold=3
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="New classes and interfaces" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2006 IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n *******************************************************************************/\r\n${package_declaration}\r\n\r\n/**\r\n * \r\n */\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">fail("4.99", ${exception_var});</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.core.contenttype/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.contenttype/META-INF/MANIFEST.MF
deleted file mode 100644
index 03c92a9..0000000
--- a/bundles/org.eclipse.core.contenttype/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,15 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.core.contenttype; singleton:=true
-Bundle-Version: 3.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.equinox.preferences,
- org.eclipse.equinox.registry,
- org.eclipse.equinox.common,
- system.bundle
-Export-Package: org.eclipse.core.internal.content;x-internal:=true,
- org.eclipse.core.runtime.content
-Bundle-Activator: org.eclipse.core.internal.content.Activator
-Eclipse-LazyStart: true
diff --git a/bundles/org.eclipse.core.contenttype/about.html b/bundles/org.eclipse.core.contenttype/about.html
deleted file mode 100644
index cdc1e50..0000000
--- a/bundles/org.eclipse.core.contenttype/about.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<p>September 26, 2005</p> 
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html" target="_blank">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<small>Java and all Java-based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries.</small>
-
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.contenttype/build.properties b/bundles/org.eclipse.core.contenttype/build.properties
deleted file mode 100644
index 38e4647..0000000
--- a/bundles/org.eclipse.core.contenttype/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               .options,\
-               plugin.properties,\
-               about.html
-src.includes = about.html
diff --git a/bundles/org.eclipse.core.contenttype/plugin.properties b/bundles/org.eclipse.core.contenttype/plugin.properties
deleted file mode 100644
index c54e7d8..0000000
--- a/bundles/org.eclipse.core.contenttype/plugin.properties
+++ /dev/null
@@ -1,16 +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
-###############################################################################
-pluginName = Eclipse Content Mechanism
-providerName = Eclipse.org
-textContentTypeName = Text
-xmlContentTypeName = XML
-propertiesContentTypeName = Properties
-contentTypesName = Content Types
diff --git a/bundles/org.eclipse.core.contenttype/plugin.xml b/bundles/org.eclipse.core.contenttype/plugin.xml
deleted file mode 100644
index 3a85336..0000000
--- a/bundles/org.eclipse.core.contenttype/plugin.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="contentTypes" name="%contentTypesName" schema="schema/contentTypes.exsd"/>
-   
-	<extension point="org.eclipse.core.contenttype.contentTypes">
-		<content-type id="org.eclipse.core.runtime.text" name="%textContentTypeName" 
-			priority="high"
-			file-extensions="txt">
-			<describer class="org.eclipse.core.internal.content.TextContentDescriber"/>			
-			<property name="org.eclipse.core.runtime.bom"/>
-			<property name="org.eclipse.core.runtime.charset"/>
-		</content-type>
-		<content-type id="org.eclipse.core.runtime.xml" name="%xmlContentTypeName" 	
-			base-type="org.eclipse.core.runtime.text"
-			priority="high"
-			file-extensions="xml">			
-			<property name="org.eclipse.core.runtime.charset" default="UTF-8"/>
-			<describer class="org.eclipse.core.internal.content.XMLContentDescriber"/>
-		</content-type>
-		<!-- a placeholder for setups where JDT's official type is not available -->			
-		<content-type id="org.eclipse.core.runtime.properties" name="%propertiesContentTypeName" 
-			base-type="org.eclipse.core.runtime.text"
-			alias-for="org.eclipse.jdt.core.javaProperties"
-			file-extensions="properties">
-			<property name="org.eclipse.core.runtime.charset" default="ISO-8859-1"/>
-		</content-type>			
-	</extension>		 
-</plugin>
diff --git a/bundles/org.eclipse.core.contenttype/schema/contentTypes.exsd b/bundles/org.eclipse.core.contenttype/schema/contentTypes.exsd
deleted file mode 100644
index a5289ae..0000000
--- a/bundles/org.eclipse.core.contenttype/schema/contentTypes.exsd
+++ /dev/null
@@ -1,360 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.runtime">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.runtime" id="contentTypes" name="Content Types"/>
-      </appInfo>
-      <documentation>
-         The content types extension point allows plug-ins to contribute to the platform content type catalog. There are two forms of contributions: &lt;cite&gt;content types&lt;/cite&gt; and &lt;cite&gt;file associations&lt;/cite&gt;.
-&lt;ul&gt;
-&lt;li&gt;
-a content type represents a file format and its naming conventions. Content types can be defined from scratch, or can inherit from existing ones, specializing them. Also, a content type can be made into an alias for another content type (see the &lt;code&gt;alias-for&lt;/code&gt; attribute). When this feature is used:
-  &lt;ul&gt;&lt;li&gt;if the target is absent, the alias content type is processed 
-  as a normal content type;&lt;/li&gt;
-  &lt;li&gt;if the target is present, all references to the alias type are automatically
-  transformed into references to the target type, and the alias type cannot be 
-  accessed nor is exposed through the API.&lt;/li&gt;&lt;/ul&gt;
-&lt;/li&gt;
-&lt;li&gt;
-a file association extends an existing content type by associating new file names and/or extensions to it&lt;/li&gt;
-&lt;/ul&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="content-type" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="file-association" 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="content-type">
-      <complexType>
-         <sequence>
-            <element ref="describer" minOccurs="0" maxOccurs="1"/>
-            <element ref="property" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the identifier for this content type (either a simple id unique for content types within the extension namespace, or a fully qualified id). The token cannot contain whitespace
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="base-type" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified identifier of this content type&apos;s base type. This content type will inherit its base type&apos;s file associations, content describer and default charset, unless they are redefined
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the human-readable name of this content type
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="file-extensions" type="string">
-            <annotation>
-               <documentation>
-                  a comma-separated list of file extensions to be associated with this content type
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="file-names" type="string">
-            <annotation>
-               <documentation>
-                  a comma-separated list of file names to be associated with this content type
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="priority" use="default" value="normal">
-            <annotation>
-               <documentation>
-                  the priority for this content type. Priorities are used to solve conflicts (when two content types are associated to the same file name/extension)
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="low">
-                  </enumeration>
-                  <enumeration value="normal">
-                  </enumeration>
-                  <enumeration value="high">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="default-charset" type="string">
-            <annotation>
-               <documentation>
-                  the default charset for this content type, or an empty string, if this content type should not have a default charset even if the parent has one. This is a convenience attribute, equivalent to specifying:
-&lt;pre&gt;
-  &lt;content-type&gt;
-    &lt;property name=&quot;org.eclipse.core.runtime.charset&quot; default=&quot;charset-name&quot;/&gt;
-  &lt;/content-type&gt;
-&lt;/pre&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="describer" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified name of a class that implements &lt;samp&gt;org.eclipse.core.runtime.content.IContentDescriber&lt;/samp&gt; or &lt;samp&gt;org.eclipse.core.runtime.content.ITextContentDescriber&lt;/samp&gt;, or an empty string, if this content type should not have a describer even if the parent has one
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="alias-for" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified identifier of the content type this content type is an alias for
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="describer">
-      <annotation>
-         <documentation>
-            If the describer attribute is used in the content-type element, this element is ignored.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the fully qualified name of a class that implements &lt;samp&gt;org.eclipse.core.runtime.content.IContentDescriber&lt;/samp&gt; or &lt;samp&gt;org.eclipse.core.runtime.content.ITextContentDescriber&lt;/samp&gt;, or an empty string, if this content type should not have a describer even if the parent has one
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.runtime.content.IContentDescriber"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="plugin" type="string">
-            <annotation>
-               <documentation>
-                  the id for the plug-in providing the describer class
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="file-association">
-      <complexType>
-         <attribute name="content-type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the fully qualified identifier for the content type this file association contributes to
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="file-names" type="string">
-            <annotation>
-               <documentation>
-                  a comma-separated list of file names to be associated with the target content type
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="file-extensions" type="string">
-            <annotation>
-               <documentation>
-                  a comma-separated list of file extensions to be associated with the target content type
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of this parameter made available to instances of the specified content describer class
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  an arbitrary value associated with the given name and made available to instances of the specified content describer class
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="property">
-      <annotation>
-         <documentation>
-            Declares a property related to this content type, optionally assigning a default value. See &lt;samp&gt;org.eclipse.core.runtime.content.IContentDescription&lt;/samp&gt; for more information on properties.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the property. If the property is being overriden and has been originally defined in a different namespace, a fully qualified property name must be used
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="default" type="string">
-            <annotation>
-               <documentation>
-                  the default value of the property, or an empty string, if this content type should not have a default value for this property even if a parent has one
-               </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>
-         Following is an example of a XML-based content type declaration using &lt;code&gt;org.eclipse.core.runtime.content.XMLRootElementContentDescriber&lt;/code&gt;, 
-a built-in describer: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.core.runtime.contentTypes&quot;&gt; 
-      &lt;content-type id=&quot;ABC&quot;
-       base-type=&quot;org.eclipse.core.runtime.xml&quot;      
-       file-extensions=&quot;a,b,c&quot;&gt;
-       &lt;describer class=&quot;org.eclipse.core.runtime.content.XMLRootElementContentDescriber&quot;&gt;
-        &lt;parameter name=&quot;element&quot; value=&quot;abc&quot;/&gt;
-       &lt;/describer&gt;
-      &lt;/content-type&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-Here is an example of a simple text-based content type that has a specific file extension:
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.core.runtime.contentTypes&quot;&gt; 
-      &lt;content-type id=&quot;MyText&quot;
-       base-type=&quot;org.eclipse.core.runtime.text&quot;
-       file-extensions=&quot;mytxt&quot;/&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-When there is need to associate new file names/extensions to an existing content type (as opposed to defining a new content type), a plug-in can contribute a file association as seen below. This has the effect of enhancing the definition of the text content type to include files with names following the &quot;*.mytxt&quot; pattern.
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.core.runtime.contentTypes&quot;&gt; 
-      &lt;file-association 
-       content-type=&quot;org.eclipse.core.runtime.text&quot;
-       file-extensions=&quot;mytxt&quot;/&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-Here is an example of a content type that defines properties:
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.core.runtime.contentTypes&quot;&gt; 
-      &lt;content-type id=&quot;MyContentType&quot;
-       file-extensions=&quot;dat&quot;&gt;
-         &lt;property name=&quot;file-format&quot; value=&quot;1&quot;/&gt;
-      &lt;/content-type&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The value of the class attribute in the describer element must represent an 
-implementor of 
-&lt;samp&gt;org.eclipse.core.runtime.content.IContentDescriber&lt;/samp&gt; or &lt;samp&gt;org.eclipse.core.runtime.content.ITextContentDescriber&lt;/samp&gt;.
-
-&lt;samp&gt;org.eclipse.core.runtime.content.IContentDescription&lt;/samp&gt; objects returned by the &lt;samp&gt;org.eclipse.core.runtime.content&lt;/samp&gt; API
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;The org.eclipse.core.runtime plug-in provides the following content types:&lt;ul&gt;
-&lt;li&gt;org.eclipse.core.runtime.text&lt;/li&gt;
-&lt;li&gt;org.eclipse.core.runtime.xml&lt;/li&gt;
-&lt;/ul&gt;
-Other plug-ins in the platform contribute other content types.
-&lt;/p&gt;
-&lt;p&gt;
-Also, the org.eclipse.core.runtime plug-in provides ready-to-use implementations of content describers:&lt;ul&gt;
-&lt;li&gt;org.eclipse.core.runtime.content.XMLRootElementContentDescriber&lt;/li&gt;
-&lt;li&gt;org.eclipse.core.runtime.content.BinarySignatureDescriber&lt;/li&gt;
-&lt;/ul&gt;
-&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/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/Activator.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/Activator.java
deleted file mode 100644
index ad83123..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/Activator.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.util.Hashtable;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.osgi.framework.*;
-
-/**
- * The runtime contents plugin class.
- */
-public class Activator implements BundleActivator {
-
-	/**
-	 * The bundle associated this plug-in
-	 */
-	private static BundleContext bundleContext;
-
-	/**
-	 * This plugin provides a JobManager service.
-	 */
-	private ServiceRegistration contentManagerService = null;
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		bundleContext = context;
-		ContentTypeManager.startup();
-		registerServices();
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		unregisterServices();
-		ContentTypeManager.shutdown();
-		ContentOSGiUtils.getDefault().closeServices();
-		bundleContext = null;
-	}
-
-	static BundleContext getContext() {
-		return bundleContext;
-	}
-
-	private void registerServices() {
-		// ContentTypeManager should be started first
-		contentManagerService = bundleContext.registerService(IContentTypeManager.class.getName(), ContentTypeManager.getInstance(), new Hashtable());
-	}
-
-	private void unregisterServices() {
-		if (contentManagerService != null) {
-			contentManagerService.unregister();
-			contentManagerService = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/BasicDescription.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/BasicDescription.java
deleted file mode 100644
index cbcbc8d..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/BasicDescription.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-
-public abstract class BasicDescription implements IContentDescription {
-
-	protected IContentTypeInfo contentTypeInfo;
-
-	public BasicDescription(IContentTypeInfo contentTypeInfo) {
-		this.contentTypeInfo = contentTypeInfo;
-	}
-
-	/**
-	 * @see IContentDescription
-	 */
-	public IContentType getContentType() {
-		ContentType contentType = contentTypeInfo.getContentType();
-		//TODO performance: potential creation of garbage		
-		return new ContentTypeHandler(contentType, contentType.getCatalog().getGeneration());
-	}
-
-	public IContentTypeInfo getContentTypeInfo() {
-		return contentTypeInfo;
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentDescription.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentDescription.java
deleted file mode 100644
index 14f6109..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentDescription.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescription;
-
-public final class ContentDescription extends BasicDescription {
-
-	private static final String CHARSET_UTF_16 = "UTF-16"; //$NON-NLS-1$
-	private static final String CHARSET_UTF_8 = "UTF-8"; //$NON-NLS-1$
-	private static final byte FLAG_ALL_OPTIONS = 0x01;
-	private static final byte FLAG_IMMUTABLE = 0x02;
-	private byte flags;
-	private Object keys;
-	private Object values;
-
-	public ContentDescription(QualifiedName[] requested, IContentTypeInfo contentTypeInfo) {
-		super(contentTypeInfo);
-		if (requested == IContentDescription.ALL) {
-			flags |= FLAG_ALL_OPTIONS;
-			return;
-		}
-		if (requested.length > 1) {
-			keys = requested;
-			values = new Object[requested.length];
-		} else if (requested.length == 1)
-			keys = requested[0];
-		// if requested.length == 0 then keys == null (no options to describe!)
-	}
-
-	private void assertMutable() {
-		if ((flags & FLAG_IMMUTABLE) != 0)
-			throw new IllegalStateException("Content description is immutable"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see IContentDescription
-	 */
-	public String getCharset() {
-		byte[] bom = (byte[]) getProperty(BYTE_ORDER_MARK);
-		if (bom == BOM_UTF_8)
-			return CHARSET_UTF_8;
-		else if (bom == BOM_UTF_16BE || bom == BOM_UTF_16LE)
-			// UTF-16 will properly recognize the BOM
-			return CHARSET_UTF_16;
-		return (String) getProperty(CHARSET);
-	}
-
-	private Object getDescribedProperty(QualifiedName key) {
-		// no values have been set
-		if (values == null)
-			return null;
-		// a single property may have been set
-		if (keys instanceof QualifiedName)
-			return keys.equals(key) ? values : null;
-		// multiple properties may have been set
-		QualifiedName[] tmpKeys = (QualifiedName[]) this.keys;
-		for (int i = 0; i < tmpKeys.length; i++)
-			if (tmpKeys[i].equals(key))
-				return ((Object[]) values)[i];
-		return null;
-	}
-
-	/**
-	 * @see IContentDescription
-	 */
-	public Object getProperty(QualifiedName key) {
-		Object describedProperty = getDescribedProperty(key);
-		if (describedProperty != null)
-			return describedProperty;
-		return contentTypeInfo.getDefaultProperty(key);
-	}
-
-	/**
-	 * @see IContentDescription
-	 */
-	public boolean isRequested(QualifiedName propertyKey) {
-		// all options requested
-		if ((flags & FLAG_ALL_OPTIONS) != 0)
-			return true;
-		// no options requested
-		if (keys == null)
-			return false;
-		// a single option requested
-		if (keys instanceof QualifiedName)
-			return keys.equals(propertyKey);
-		// some (but not all) options requested
-		QualifiedName[] tmpKeys = (QualifiedName[]) this.keys;
-		for (int i = 0; i < tmpKeys.length; i++)
-			if (tmpKeys[i].equals(propertyKey))
-				return true;
-		return false;
-	}
-
-	boolean isSet() {
-		if (keys == null || values == null)
-			return false;
-		if (keys instanceof QualifiedName)
-			return true;
-		Object[] tmpValues = (Object[]) this.values;
-		for (int i = 0; i < tmpValues.length; i++)
-			if (tmpValues[i] != null)
-				return true;
-		return false;
-	}
-
-	public void markImmutable() {
-		assertMutable();
-		flags |= FLAG_IMMUTABLE;
-	}
-
-	/** Overrides content type info object. */
-	void setContentTypeInfo(IContentTypeInfo info) {
-		this.contentTypeInfo = info;
-	}
-
-	/**
-	 * @see IContentDescription
-	 */
-	public void setProperty(QualifiedName newKey, Object newValue) {
-		assertMutable();
-		if (keys == null) {
-			if ((flags & FLAG_ALL_OPTIONS) != 0) {
-				keys = newKey;
-				values = newValue;
-			}
-			return;
-		}
-		if (keys.equals(newKey)) {
-			values = newValue;
-			return;
-		}
-		if (keys instanceof QualifiedName) {
-			if ((flags & FLAG_ALL_OPTIONS) != 0) {
-				keys = new QualifiedName[] {(QualifiedName) keys, newKey};
-				values = new Object[] {values, newValue};
-			}
-			return;
-		}
-		QualifiedName[] tmpKeys = (QualifiedName[]) this.keys;
-		for (int i = 0; i < tmpKeys.length; i++)
-			if (tmpKeys[i].equals(newKey)) {
-				((Object[]) values)[i] = newValue;
-				return;
-			}
-		if ((flags & FLAG_ALL_OPTIONS) == 0)
-			return;
-		// need to resize arrays 		
-		int currentSize = tmpKeys.length;
-		tmpKeys = new QualifiedName[currentSize + 1];
-		System.arraycopy(keys, 0, tmpKeys, 0, currentSize);
-		Object[] tmpValues = new Object[currentSize + 1];
-		System.arraycopy(values, 0, tmpValues, 0, currentSize);
-		tmpKeys[tmpKeys.length - 1] = newKey;
-		tmpValues[tmpValues.length - 1] = newValue;
-		keys = tmpKeys;
-		values = tmpValues;
-	}
-
-	public String toString() {
-		StringBuffer result = new StringBuffer("{"); //$NON-NLS-1$
-		if (keys != null)
-			if (keys instanceof QualifiedName) {
-				if (values != null)
-					result.append(keys + "=" + values); //$NON-NLS-1$
-			} else {
-				QualifiedName[] tmpKeys = (QualifiedName[]) keys;
-				Object[] tmpValues = (Object[]) values;
-				boolean any = false;
-				for (int i = 0; i < tmpKeys.length; i++)
-					if (tmpValues[i] != null) {
-						result.append(tmpKeys[i] + "=" + tmpValues[i] + ","); //$NON-NLS-1$ //$NON-NLS-2$
-						any = true;
-					}
-				if (any)
-					result.deleteCharAt(result.length() - 1);
-			}
-		result.append("} : "); //$NON-NLS-1$
-		result.append(contentTypeInfo.getContentType());
-		return result.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentMessages.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentMessages.java
deleted file mode 100644
index 19a4775..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentMessages.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.util.Date;
-import org.eclipse.osgi.util.NLS;
-
-// Runtime plugin message catalog
-public class ContentMessages extends NLS {
-
-	/**
-	 * The unique identifier constant of this plug-in.
-	 */
-	public static final String OWNER_NAME = "org.eclipse.core.contenttype"; //$NON-NLS-1$
-
-	private static final String BUNDLE_NAME = "org.eclipse.core.internal.content.messages"; //$NON-NLS-1$
-
-	// Content type manager
-	public static String content_badInitializationData;
-	public static String content_errorReadingContents;
-	public static String content_errorLoadingSettings;
-	public static String content_errorSavingSettings;
-	public static String content_invalidContentDescriber;
-	public static String content_invalidProperty;
-	public static String content_missingIdentifier;
-	public static String content_missingName;
-	public static String content_parserConfiguration;
-
-	static {
-		// load message values from bundle file
-		reloadMessages();
-	}
-
-	public static void reloadMessages() {
-		NLS.initializeMessages(BUNDLE_NAME, ContentMessages.class);
-	}
-
-	/**
-	 * Print a debug message to the console. 
-	 * Pre-pend the message with the current date and the name of the current thread.
-	 */
-	public static void message(String message) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(new Date(System.currentTimeMillis()));
-		buffer.append(" - ["); //$NON-NLS-1$
-		buffer.append(Thread.currentThread().getName());
-		buffer.append("] "); //$NON-NLS-1$
-		buffer.append(message);
-		System.out.println(buffer.toString());
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentOSGiUtils.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentOSGiUtils.java
deleted file mode 100644
index 5caa7ec..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentOSGiUtils.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import javax.xml.parsers.SAXParserFactory;
-import org.eclipse.osgi.service.debug.DebugOptions;
-import org.osgi.framework.BundleContext;
-import org.osgi.util.tracker.ServiceTracker;
-
-/**
- * This class contains a set of OSGi-related helper methods for the Content plugin.
- * The closeServices() method should be called before the plugin is stopped. 
- * 
- * @since org.eclipse.core.contenttype 3.2
- */
-public class ContentOSGiUtils {
-	private ServiceTracker parserTracker = null;
-	private ServiceTracker debugTracker = null;
-
-	private static final ContentOSGiUtils singleton = new ContentOSGiUtils();
-
-	public static ContentOSGiUtils getDefault() {
-		return singleton;
-	}
-
-	/**
-	 * Private constructor to block instance creation.
-	 */
-	private ContentOSGiUtils() {
-		super();
-		initServices();
-	}
-
-	private void initServices() {
-		BundleContext context = Activator.getContext();
-		if (context == null) {
-			ContentMessages.message("ContentOSGiUtils called before plugin started"); //$NON-NLS-1$
-			return;
-		}
-
-		parserTracker = new ServiceTracker(context, "javax.xml.parsers.SAXParserFactory", null); //$NON-NLS-1$
-		parserTracker.open();
-
-		debugTracker = new ServiceTracker(context, DebugOptions.class.getName(), null);
-		debugTracker.open();
-	}
-
-	void closeServices() {
-		if (parserTracker != null) {
-			parserTracker.close();
-			parserTracker = null;
-		}
-		if (debugTracker != null) {
-			debugTracker.close();
-			debugTracker = null;
-		}
-	}
-
-	public SAXParserFactory getFactory() {
-		if (parserTracker == null) {
-			ContentMessages.message("SAX tracker is not set"); //$NON-NLS-1$
-			return null;
-		}
-		SAXParserFactory theFactory = (SAXParserFactory) parserTracker.getService();
-		if (theFactory != null)
-			theFactory.setNamespaceAware(true);
-		return theFactory;
-	}
-
-	public boolean getBooleanDebugOption(String option, boolean defaultValue) {
-		if (debugTracker == null) {
-			ContentMessages.message("Debug tracker is not set"); //$NON-NLS-1$
-			return defaultValue;
-		}
-		DebugOptions options = (DebugOptions) debugTracker.getService();
-		if (options != null) {
-			String value = options.getOption(option);
-			if (value != null)
-				return value.equalsIgnoreCase("true"); //$NON-NLS-1$
-		}
-		return defaultValue;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentType.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentType.java
deleted file mode 100644
index e1b4871..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentType.java
+++ /dev/null
@@ -1,632 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.io.*;
-import java.util.*;
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.content.*;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
-
-/**
- * @see IContentType
- */
-public final class ContentType implements IContentType, IContentTypeInfo {
-
-	/* A placeholder for missing/invalid binary/text describers. */
-	private class InvalidDescriber implements IContentDescriber, ITextContentDescriber {
-		public int describe(InputStream contents, IContentDescription description) {
-			return INVALID;
-		}
-
-		public int describe(Reader contents, IContentDescription description) {
-			return INVALID;
-		}
-
-		public QualifiedName[] getSupportedOptions() {
-			return new QualifiedName[0];
-		}
-	}
-
-	final static byte ASSOCIATED_BY_EXTENSION = 2;
-	final static byte ASSOCIATED_BY_NAME = 1;
-	private static final String DESCRIBER_ELEMENT = "describer"; //$NON-NLS-1$
-	private static ArrayList EMPTY_LIST = new ArrayList(0);
-	private static final Object INHERITED_DESCRIBER = "INHERITED DESCRIBER"; //$NON-NLS-1$
-
-	private static final Object NO_DESCRIBER = "NO DESCRIBER"; //$NON-NLS-1$
-	final static byte NOT_ASSOCIATED = 0;
-	public final static String PREF_DEFAULT_CHARSET = "charset"; //$NON-NLS-1$	
-	public final static String PREF_FILE_EXTENSIONS = "file-extensions"; //$NON-NLS-1$
-	public final static String PREF_FILE_NAMES = "file-names"; //$NON-NLS-1$
-	final static byte PRIORITY_HIGH = 1;
-	final static byte PRIORITY_LOW = -1;
-	final static byte PRIORITY_NORMAL = 0;
-	final static int SPEC_PRE_DEFINED = IGNORE_PRE_DEFINED;
-	final static int SPEC_USER_DEFINED = IGNORE_USER_DEFINED;
-	final static byte STATUS_INVALID = 2;
-	final static byte STATUS_UNKNOWN = 0;
-	final static byte STATUS_VALID = 1;
-	private String aliasTargetId;
-	private String baseTypeId;
-	private boolean builtInAssociations = false;
-	private ContentTypeCatalog catalog;
-	private IConfigurationElement contentTypeElement;
-	private DefaultDescription defaultDescription;
-	private Map defaultProperties;
-	private Object describer;
-	// we need a Cloneable list
-	private ArrayList fileSpecs = EMPTY_LIST;
-	String id;
-	private ContentTypeManager manager;
-	private String name;
-	private byte priority;
-	private ContentType target;
-	private String userCharset;
-	private byte validation = STATUS_UNKNOWN;
-	private ContentType baseType;
-	// -1 means unknown
-	private byte depth = -1;
-
-	public static ContentType createContentType(ContentTypeCatalog catalog, String uniqueId, String name, byte priority, String[] fileExtensions, String[] fileNames, String baseTypeId, String aliasTargetId, Map defaultProperties, IConfigurationElement contentTypeElement) {
-		ContentType contentType = new ContentType(catalog.getManager());
-		contentType.catalog = catalog;
-		contentType.defaultDescription = new DefaultDescription(contentType);
-		contentType.id = uniqueId;
-		contentType.name = name;
-		contentType.priority = priority;
-		if ((fileExtensions != null && fileExtensions.length > 0) || (fileNames != null && fileNames.length > 0)) {
-			contentType.builtInAssociations = true;
-			contentType.fileSpecs = new ArrayList(fileExtensions.length + fileNames.length);
-			for (int i = 0; i < fileNames.length; i++)
-				contentType.internalAddFileSpec(fileNames[i], FILE_NAME_SPEC | SPEC_PRE_DEFINED);
-			for (int i = 0; i < fileExtensions.length; i++)
-				contentType.internalAddFileSpec(fileExtensions[i], FILE_EXTENSION_SPEC | SPEC_PRE_DEFINED);
-		}
-		contentType.defaultProperties = defaultProperties;
-		contentType.contentTypeElement = contentTypeElement;
-		contentType.baseTypeId = baseTypeId;
-		contentType.aliasTargetId = aliasTargetId;
-		return contentType;
-	}
-
-	static FileSpec createFileSpec(String fileSpec, int type) {
-		return new FileSpec(fileSpec, type);
-	}
-
-	static String getPreferenceKey(int flags) {
-		if ((flags & FILE_EXTENSION_SPEC) != 0)
-			return PREF_FILE_EXTENSIONS;
-		if ((flags & FILE_NAME_SPEC) != 0)
-			return PREF_FILE_NAMES;
-		throw new IllegalArgumentException("Unknown type: " + flags); //$NON-NLS-1$
-	}
-
-	private static String getValidationString(byte validation) {
-		return validation == STATUS_VALID ? "VALID" : (validation == STATUS_INVALID ? "INVALID" : "UNKNOWN"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	public static void log(String message, Throwable reason) {
-		// don't log CoreExceptions again
-		IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, reason instanceof CoreException ? null : reason);
-		RuntimeLog.log(status);
-	}
-
-	public ContentType(ContentTypeManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public void addFileSpec(String fileSpec, int type) throws CoreException {
-		Assert.isLegal(type == FILE_EXTENSION_SPEC || type == FILE_NAME_SPEC, "Unknown type: " + type); //$NON-NLS-1$		
-		String[] userSet;
-		synchronized (this) {
-			if (!internalAddFileSpec(fileSpec, type | SPEC_USER_DEFINED))
-				return;
-			userSet = getFileSpecs(type | IGNORE_PRE_DEFINED);
-		}
-		// persist using preferences		
-		Preferences contentTypeNode = manager.getPreferences().node(id);
-		String newValue = Util.toListString(userSet);
-		// we are adding stuff, newValue must be non-null
-		Assert.isNotNull(newValue);
-		setPreference(contentTypeNode, getPreferenceKey(type), newValue);
-		try {
-			contentTypeNode.flush();
-		} catch (BackingStoreException bse) {
-			String message = NLS.bind(ContentMessages.content_errorSavingSettings, id);
-			IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, bse);
-			throw new CoreException(status);
-		}
-		// notify listeners
-		manager.fireContentTypeChangeEvent(this);
-	}
-
-	int describe(IContentDescriber selectedDescriber, ILazySource contents, ContentDescription description) throws IOException {
-		try {
-			return contents.isText() ? ((ITextContentDescriber) selectedDescriber).describe((Reader) contents, description) : selectedDescriber.describe((InputStream) contents, description);
-		} catch (RuntimeException re) {
-			// describer seems to be buggy. just disable it (logging the reason)
-			invalidateDescriber(re);
-		} catch (Error e) {
-			// describer got some serious problem. disable it (logging the reason) and throw the error again 
-			invalidateDescriber(e);
-			throw e;
-		} catch (LowLevelIOException llioe) {
-			// throw the actual exception
-			throw llioe.getActualException();
-		} catch (IOException ioe) {
-			// bugs 67841/ 62443  - non-low level IOException should be "ignored"
-			if (ContentTypeManager.DEBUGGING) {
-				String message = NLS.bind(ContentMessages.content_errorReadingContents, id);
-				ContentType.log(message, ioe);
-			}
-			// we don't know what the describer would say if the exception didn't occur
-			return IContentDescriber.INDETERMINATE;
-		} finally {
-			contents.rewind();
-		}
-		return IContentDescriber.INVALID;
-	}
-
-	public boolean equals(Object another) {
-		if (another instanceof ContentType)
-			return id.equals(((ContentType) another).id);
-		if (another instanceof ContentTypeHandler)
-			return id.equals(((ContentTypeHandler) another).id);
-		return false;
-	}
-
-	public String getAliasTargetId() {
-		return aliasTargetId;
-	}
-
-	/**
-	 * @see IContentType
-	 */
-
-	public IContentType getBaseType() {
-		return baseType;
-	}
-
-	String getBaseTypeId() {
-		return baseTypeId;
-	}
-
-	public ContentTypeCatalog getCatalog() {
-		return catalog;
-	}
-
-	public ContentType getContentType() {
-		return this;
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public String getDefaultCharset() {
-		return getDefaultProperty(IContentDescription.CHARSET);
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public IContentDescription getDefaultDescription() {
-		return defaultDescription;
-	}
-
-	/**
-	 * Returns the default value for the given property in this content type, or <code>null</code>. 
-	 */
-	public String getDefaultProperty(QualifiedName key) {
-		String propertyValue = internalGetDefaultProperty(key);
-		if ("".equals(propertyValue)) //$NON-NLS-1$
-			return null;
-		return propertyValue;
-	}
-
-	byte getDepth() {
-		byte tmpDepth = depth;
-		if (tmpDepth >= 0)
-			return tmpDepth;
-		// depth was never computed - do it now
-		if (baseType == null)
-			return depth = 0;
-		return depth = (byte) (baseType == null ? 0 : (1 + baseType.getDepth()));
-	}
-
-	/**
-	 * Public for tests only, should not be called by anyone else.
-	 */
-	public IContentDescriber getDescriber() {
-		try {
-			// thread safety
-			Object tmpDescriber = describer;
-			if (tmpDescriber != null) {
-				if (INHERITED_DESCRIBER == tmpDescriber)
-					return baseType.getDescriber();
-				return (NO_DESCRIBER == tmpDescriber) ? null : (IContentDescriber) tmpDescriber;
-			}
-			final String describerValue = contentTypeElement.getAttributeAsIs(DESCRIBER_ELEMENT);
-			if (describerValue != null || contentTypeElement.getChildren(DESCRIBER_ELEMENT).length > 0)
-				try {
-					if ("".equals(describerValue)) { //$NON-NLS-1$
-						describer = NO_DESCRIBER;
-						return null;
-					}
-					describer = tmpDescriber = contentTypeElement.createExecutableExtension(DESCRIBER_ELEMENT);
-					return (IContentDescriber) tmpDescriber;
-				} catch (CoreException ce) {
-					// the content type definition was invalid. Ensure we don't
-					// try again, and this content type does not accept any
-					// contents
-					return invalidateDescriber(ce);
-				}
-		} catch (InvalidRegistryObjectException e) {
-			/*
-			 * This should only happen if  an API call is made after the registry has changed and before
-			 * the corresponding registry change event has been broadcast.  
-			 */
-			// the configuration element is stale - need to rebuild the catalog
-			manager.invalidate();
-			// bad timing - next time the client asks for a describer, s/he will have better luck
-			return null;
-		}
-		if (baseType == null) {
-			describer = NO_DESCRIBER;
-			return null;
-		}
-		// remember so we don't have to come all the way down here next time
-		describer = INHERITED_DESCRIBER;
-		return baseType.getDescriber();
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public IContentDescription getDescriptionFor(InputStream contents, QualifiedName[] options) throws IOException {
-		return internalGetDescriptionFor(ContentTypeManager.readBuffer(contents), options);
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public IContentDescription getDescriptionFor(Reader contents, QualifiedName[] options) throws IOException {
-		return internalGetDescriptionFor(ContentTypeManager.readBuffer(contents), options);
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public String[] getFileSpecs(int typeMask) {
-		if (fileSpecs.isEmpty())
-			return new String[0];
-		// invert the last two bits so it is easier to compare
-		typeMask ^= (IGNORE_PRE_DEFINED | IGNORE_USER_DEFINED);
-		List result = new ArrayList(fileSpecs.size());
-		for (Iterator i = fileSpecs.iterator(); i.hasNext();) {
-			FileSpec spec = (FileSpec) i.next();
-			if ((spec.getType() & typeMask) == spec.getType())
-				result.add(spec.getText());
-		}
-		return (String[]) result.toArray(new String[result.size()]);
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public String getName() {
-		return name;
-	}
-
-	byte getPriority() {
-		return priority;
-	}
-
-	public IContentTypeSettings getSettings(IScopeContext context) {
-		if (context == null || context.equals(manager.getContext()))
-			return this;
-		return new ContentTypeSettings(this, context);
-	}
-
-	/*
-	 * Returns the alias target, if one is found, or this object otherwise.
-	 */
-	ContentType getAliasTarget(boolean self) {
-		return (self && target == null) ? this : target;
-	}
-
-	byte getValidation() {
-		return validation;
-	}
-
-	boolean hasBuiltInAssociations() {
-		return builtInAssociations;
-	}
-
-	boolean hasFileSpec(IScopeContext context, String text, int typeMask) {
-		if (context.equals(manager.getContext()) || (typeMask & IGNORE_USER_DEFINED) != 0)
-			return hasFileSpec(text, typeMask, false);
-		String[] fileSpecs = ContentTypeSettings.getFileSpecs(context, id, typeMask);
-		for (int i = 0; i < fileSpecs.length; i++)
-			if (text.equalsIgnoreCase(fileSpecs[i]))
-				return true;
-		// no user defined association... try built-in
-		return hasFileSpec(text, typeMask | IGNORE_PRE_DEFINED, false);
-	}
-
-	/**
-	 * Returns whether this content type has the given file spec.
-	 * 
-	 * @param text the file spec string
-	 * @param typeMask FILE_NAME_SPEC or FILE_EXTENSION_SPEC
-	 * @param strict
-	 * @return true if this file spec has already been added, false otherwise
-	 */
-	boolean hasFileSpec(String text, int typeMask, boolean strict) {
-		if (fileSpecs.isEmpty())
-			return false;
-		for (Iterator i = fileSpecs.iterator(); i.hasNext();) {
-			FileSpec spec = (FileSpec) i.next();
-			if (spec.equals(text, typeMask, strict))
-				return true;
-		}
-		return false;
-	}
-
-	public int hashCode() {
-		return id.hashCode();
-	}
-
-	/**
-	 * Adds a user-defined or pre-defined file spec.
-	 */
-	boolean internalAddFileSpec(String fileSpec, int typeMask) {
-		if (hasFileSpec(fileSpec, typeMask, false))
-			return false;
-		FileSpec newFileSpec = createFileSpec(fileSpec, typeMask);
-		if ((typeMask & ContentType.SPEC_USER_DEFINED) == 0) {
-			// plug-in defined - all that is left to be done is to add it to the list
-			if (fileSpecs.isEmpty())
-				fileSpecs = new ArrayList(3);
-			fileSpecs.add(newFileSpec);
-			return true;
-		}
-		// update file specs atomically so threads traversing the list of file specs don't have to synchronize		
-		ArrayList tmpFileSpecs = (ArrayList) fileSpecs.clone();
-		tmpFileSpecs.add(newFileSpec);
-		catalog.associate(this, newFileSpec.getText(), newFileSpec.getType());
-		// set the new file specs atomically 
-		fileSpecs = tmpFileSpecs;
-		return true;
-	}
-
-	/**
-	 * Returns the default value for a property, recursively if necessary.  
-	 */
-	String internalGetDefaultProperty(QualifiedName key) {
-		// a special case for charset - users can override
-		if (userCharset != null && key.equals(IContentDescription.CHARSET))
-			return userCharset;
-		String defaultValue = basicGetDefaultProperty(key);
-		if (defaultValue != null)
-			return defaultValue;
-		// not defined here, try base type
-		return baseType == null ? null : baseType.internalGetDefaultProperty(key);
-	}
-
-	/**
-	 * Returns the value of a built-in property defined for this content type.
-	 */
-	String basicGetDefaultProperty(QualifiedName key) {
-		return defaultProperties == null ? null : (String) defaultProperties.get(key);
-	}
-
-	BasicDescription internalGetDescriptionFor(ILazySource buffer, QualifiedName[] options) throws IOException {
-		if (buffer == null)
-			return defaultDescription;
-		// use temporary local var to avoid sync'ing
-		IContentDescriber tmpDescriber = this.getDescriber();
-		// no describer - return default description
-		if (tmpDescriber == null)
-			return defaultDescription;
-		if (buffer.isText() && !(tmpDescriber instanceof ITextContentDescriber))
-			// it is an error to provide a Reader to a non-text content type
-			throw new UnsupportedOperationException();
-		ContentDescription description = new ContentDescription(options, this);
-		if (describe(tmpDescriber, buffer, description) == IContentDescriber.INVALID)
-			// the contents were actually invalid for the content type
-			return null;
-		// the describer didn't add any details, return default description
-		if (!description.isSet())
-			return defaultDescription;
-		// description cannot be changed afterwards
-		description.markImmutable();
-		return description;
-	}
-
-	byte internalIsAssociatedWith(String fileName, IScopeContext context) {
-		if (hasFileSpec(context, fileName, FILE_NAME_SPEC))
-			return ASSOCIATED_BY_NAME;
-		String fileExtension = ContentTypeManager.getFileExtension(fileName);
-		if (hasFileSpec(context, fileExtension, FILE_EXTENSION_SPEC))
-			return ASSOCIATED_BY_EXTENSION;
-		// if does not have built-in file specs, delegate to parent (if any)
-		if (!hasBuiltInAssociations() && baseType != null)
-			return baseType.internalIsAssociatedWith(fileName, context);
-		return NOT_ASSOCIATED;
-	}
-
-	boolean internalRemoveFileSpec(String fileSpec, int typeMask) {
-		if (fileSpecs.isEmpty())
-			return false;
-		// we modify the list of file specs atomically so we don't interfere with threads doing traversals
-		ArrayList tmpFileSpecs = (ArrayList) fileSpecs.clone();
-		for (Iterator i = tmpFileSpecs.iterator(); i.hasNext();) {
-			FileSpec spec = (FileSpec) i.next();
-			if ((spec.getType() == typeMask) && fileSpec.equals(spec.getText())) {
-				i.remove();
-				catalog.dissociate(this, spec.getText(), spec.getType());
-				// update the list of file specs
-				fileSpecs = tmpFileSpecs;
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private IContentDescriber invalidateDescriber(Throwable reason) {
-		String message = NLS.bind(ContentMessages.content_invalidContentDescriber, id);
-		log(message, reason);
-		return (IContentDescriber) (describer = new InvalidDescriber());
-	}
-
-	boolean isAlias() {
-		return target != null;
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public boolean isAssociatedWith(String fileName) {
-		return isAssociatedWith(fileName, manager.getContext());
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public boolean isAssociatedWith(String fileName, IScopeContext context) {
-		return internalIsAssociatedWith(fileName, context) != NOT_ASSOCIATED;
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public boolean isKindOf(IContentType another) {
-		if (another == null)
-			return false;
-		if (this == another)
-			return true;
-		return baseType != null && baseType.isKindOf(another);
-	}
-
-	boolean isValid() {
-		return validation == STATUS_VALID;
-	}
-
-	void processPreferences(Preferences contentTypeNode) {
-		// user set default charset
-		this.userCharset = contentTypeNode.get(PREF_DEFAULT_CHARSET, null);
-		// user set file names 
-		String userSetFileNames = contentTypeNode.get(PREF_FILE_NAMES, null);
-		String[] fileNames = Util.parseItems(userSetFileNames);
-		for (int i = 0; i < fileNames.length; i++)
-			internalAddFileSpec(fileNames[i], FILE_NAME_SPEC | SPEC_USER_DEFINED);
-		// user set file extensions
-		String userSetFileExtensions = contentTypeNode.get(PREF_FILE_EXTENSIONS, null);
-		String[] fileExtensions = Util.parseItems(userSetFileExtensions);
-		for (int i = 0; i < fileExtensions.length; i++)
-			internalAddFileSpec(fileExtensions[i], FILE_EXTENSION_SPEC | SPEC_USER_DEFINED);
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public void removeFileSpec(String fileSpec, int type) throws CoreException {
-		Assert.isLegal(type == FILE_EXTENSION_SPEC || type == FILE_NAME_SPEC, "Unknown type: " + type); //$NON-NLS-1$		
-		synchronized (this) {
-			if (!internalRemoveFileSpec(fileSpec, type | SPEC_USER_DEFINED))
-				return;
-		}
-		// persist the change
-		Preferences contentTypeNode = manager.getPreferences().node(id);
-		final String[] userSet = getFileSpecs(type | IGNORE_PRE_DEFINED);
-		String preferenceKey = getPreferenceKey(type);
-		String newValue = Util.toListString(userSet);
-		setPreference(contentTypeNode, preferenceKey, newValue);
-		try {
-			contentTypeNode.flush();
-		} catch (BackingStoreException bse) {
-			String message = NLS.bind(ContentMessages.content_errorSavingSettings, id);
-			IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, bse);
-			throw new CoreException(status);
-		}
-		// notify listeners		
-		manager.fireContentTypeChangeEvent(this);
-	}
-
-	void setAliasTarget(ContentType newTarget) {
-		target = newTarget;
-	}
-
-	/**
-	 * @see IContentType
-	 */
-	public void setDefaultCharset(String newCharset) throws CoreException {
-		synchronized (this) {
-			// don't do anything if there is no actual change
-			if (userCharset == null) {
-				if (newCharset == null)
-					return;
-			} else if (userCharset.equals(newCharset))
-				return;
-			// apply change in memory
-			userCharset = newCharset;
-		}
-		// persist the change
-		Preferences contentTypeNode = manager.getPreferences().node(id);
-		setPreference(contentTypeNode, PREF_DEFAULT_CHARSET, userCharset);
-		try {
-			contentTypeNode.flush();
-		} catch (BackingStoreException bse) {
-			String message = NLS.bind(ContentMessages.content_errorSavingSettings, id);
-			IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, bse);
-			throw new CoreException(status);
-		}
-		// notify listeners
-		manager.fireContentTypeChangeEvent(this);
-	}
-
-	static void setPreference(Preferences node, String key, String value) {
-		if (value == null)
-			node.remove(key);
-		else
-			node.put(key, value);
-	}
-
-	void setValidation(byte validation) {
-		this.validation = validation;
-		if (ContentTypeManager.DEBUGGING)
-			ContentMessages.message("Validating " + this + ": " + getValidationString(validation)); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	public String toString() {
-		return id;
-	}
-
-	void setBaseType(ContentType baseType) {
-		this.baseType = baseType;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeBuilder.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeBuilder.java
deleted file mode 100644
index 9c77ed1..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeBuilder.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.util.*;
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IPreferenceNodeVisitor;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * This class is a sidekick for ContentTypeManager that provides mechanisms for 
- * creating content types from the extension registry (which ContentTypeManager
- *  is oblivious to).
- */
-public class ContentTypeBuilder {
-	public static final String PT_CONTENTTYPES = "contentTypes"; //$NON-NLS-1$	
-	private ContentTypeCatalog catalog;
-
-	private static String getUniqueId(String namespace, String baseTypeId) {
-		if (baseTypeId == null)
-			return null;
-		int separatorPosition = baseTypeId.lastIndexOf('.');
-		// base type is defined in the same namespace
-		if (separatorPosition == -1)
-			baseTypeId = namespace + '.' + baseTypeId;
-		return baseTypeId;
-	}
-
-	private static QualifiedName parseQualifiedName(String namespace, String value) {
-		if (value == null)
-			return null;
-		int separatorPosition = value.lastIndexOf('.');
-		// base type is defined in the same namespace
-		if (separatorPosition == -1)
-			return new QualifiedName(namespace, value);
-		if (separatorPosition == 0 || separatorPosition == value.length() - 1)
-			// invalid value specified
-			return null;
-		namespace = value.substring(0, separatorPosition);
-		String simpleValue = value.substring(separatorPosition + 1);
-		return new QualifiedName(namespace, simpleValue);
-	}
-
-	private static byte parsePriority(String priority) {
-		if (priority == null)
-			return ContentType.PRIORITY_NORMAL;
-		if (priority.equals("high")) //$NON-NLS-1$
-			return ContentType.PRIORITY_HIGH;
-		if (priority.equals("low")) //$NON-NLS-1$
-			return ContentType.PRIORITY_LOW;
-		if (!priority.equals("normal")) //$NON-NLS-1$
-			return ContentType.PRIORITY_NORMAL;
-		//TODO: should log - INVALID PRIORITY
-		return ContentType.PRIORITY_NORMAL;
-	}
-
-	protected ContentTypeBuilder(ContentTypeCatalog catalog) {
-		this.catalog = catalog;
-	}
-
-	private void addFileAssociation(IConfigurationElement fileAssociationElement, ContentType target) {
-		String[] fileNames = Util.parseItems(fileAssociationElement.getAttributeAsIs("file-names")); //$NON-NLS-1$
-		for (int i = 0; i < fileNames.length; i++)
-			target.internalAddFileSpec(fileNames[i], IContentType.FILE_NAME_SPEC | ContentType.SPEC_PRE_DEFINED);
-		String[] fileExtensions = Util.parseItems(fileAssociationElement.getAttributeAsIs("file-extensions")); //$NON-NLS-1$
-		for (int i = 0; i < fileExtensions.length; i++)
-			target.internalAddFileSpec(fileExtensions[i], IContentType.FILE_EXTENSION_SPEC | ContentType.SPEC_PRE_DEFINED);
-	}
-
-	/**
-	 * Builds all content types found in the extension registry.
-	 */
-	public void buildCatalog() {
-		IConfigurationElement[] allContentTypeCEs = getConfigurationElements();
-		for (int i = 0; i < allContentTypeCEs.length; i++)
-			if (allContentTypeCEs[i].getName().equals("content-type")) //$NON-NLS-1$
-				registerContentType(allContentTypeCEs[i]);
-		for (int i = 0; i < allContentTypeCEs.length; i++)
-			if (allContentTypeCEs[i].getName().equals("file-association")) //$NON-NLS-1$
-				registerFileAssociation(allContentTypeCEs[i]);
-		applyPreferences();
-	}
-
-	/**
-	 * Applies any existing preferences to content types as a batch operation.
-	 */
-	private void applyPreferences() {
-		try {
-			final ContentTypeCatalog localCatalog = catalog;
-			final IEclipsePreferences root = localCatalog.getManager().getPreferences();
-			root.accept(new IPreferenceNodeVisitor() {
-				public boolean visit(IEclipsePreferences node) {
-					if (node == root)
-						return true;
-					ContentType contentType = localCatalog.internalGetContentType(node.name());
-					if (contentType != null)
-						contentType.processPreferences(node);
-					// content type nodes don't have any children anyway
-					return false;
-				}
-			});
-		} catch (BackingStoreException bse) {
-			ContentType.log(ContentMessages.content_errorLoadingSettings, bse);
-		}
-	}
-
-	/**
-	 * @throws CoreException if mandatory attributes are missing in the markup
-	 */
-	private ContentType createContentType(IConfigurationElement contentTypeCE) throws CoreException {
-		String namespace = contentTypeCE.getContributor().getName();
-		String simpleId = contentTypeCE.getAttributeAsIs("id"); //$NON-NLS-1$
-		String name = contentTypeCE.getAttribute("name"); //$NON-NLS-1$
-
-		if (simpleId == null)
-			missingMandatoryAttribute(ContentMessages.content_missingIdentifier, namespace);
-		String uniqueId;
-		if (simpleId.lastIndexOf('.') == -1)
-			uniqueId = namespace + '.' + simpleId;
-		else
-			uniqueId = simpleId;
-		if (name == null)
-			missingMandatoryAttribute(ContentMessages.content_missingName, uniqueId);
-
-		byte priority = parsePriority(contentTypeCE.getAttributeAsIs("priority")); //$NON-NLS-1$);
-		String[] fileNames = Util.parseItems(contentTypeCE.getAttributeAsIs("file-names")); //$NON-NLS-1$
-		String[] fileExtensions = Util.parseItems(contentTypeCE.getAttributeAsIs("file-extensions")); //$NON-NLS-1$
-		String baseTypeId = getUniqueId(namespace, contentTypeCE.getAttributeAsIs("base-type")); //$NON-NLS-1$
-		String aliasTargetTypeId = getUniqueId(namespace, contentTypeCE.getAttributeAsIs("alias-for")); //$NON-NLS-1$		
-		IConfigurationElement[] propertyCEs = null;
-		Map defaultProperties = null;
-		if ((propertyCEs = contentTypeCE.getChildren("property")).length > 0) { //$NON-NLS-1$
-			defaultProperties = new HashMap();
-			for (int i = 0; i < propertyCEs.length; i++) {
-				String defaultValue = propertyCEs[i].getAttributeAsIs("default"); //$NON-NLS-1$
-				if (defaultValue == null)
-					// empty string means: default value is null
-					defaultValue = ""; //$NON-NLS-1$
-				String propertyKey = propertyCEs[i].getAttributeAsIs("name"); //$NON-NLS-1$
-				QualifiedName qualifiedKey = parseQualifiedName(namespace, propertyKey);
-				if (qualifiedKey == null) {
-					if (ContentTypeManager.DEBUGGING) {
-						String message = NLS.bind(ContentMessages.content_invalidProperty, propertyKey, getUniqueId(namespace, simpleId));
-						ContentType.log(message, null);
-					}
-					continue;
-				}
-				defaultProperties.put(qualifiedKey, defaultValue);
-			}
-		}
-		String defaultCharset = contentTypeCE.getAttributeAsIs("default-charset"); //$NON-NLS-1$
-		if (defaultCharset != null)
-			if (defaultProperties == null)
-				defaultProperties = Collections.singletonMap(IContentDescription.CHARSET, defaultCharset);
-			else if (!defaultProperties.containsKey(IContentDescription.CHARSET))
-				defaultProperties.put(IContentDescription.CHARSET, defaultCharset);
-		return ContentType.createContentType(catalog, uniqueId, name, priority, fileExtensions, fileNames, baseTypeId, aliasTargetTypeId, defaultProperties, contentTypeCE);
-	}
-
-	// Store this around for performance
-	private final static IConfigurationElement[] emptyConfArray = new IConfigurationElement[0];
-
-	/**
-	 * Gets confuguration elements for both "backward compatible" extension point
-	 * 		org.eclipse.core.runtime.contentTypes
-	 * and "new" extension point controlled by this plugin:
-	 * 		org.eclipse.core.contenttype.contentTypes
-	 */
-	protected IConfigurationElement[] getConfigurationElements() {
-		IExtensionRegistry registry = RegistryFactory.getRegistry();
-		IConfigurationElement[] oldConfigElements = emptyConfArray;
-		IConfigurationElement[] newConfigElements = emptyConfArray;
-		// "old" extenstion point
-		IExtensionPoint oldPoint = registry.getExtensionPoint(IContentConstants.RUNTIME_NAME, PT_CONTENTTYPES);
-		if (oldPoint != null)
-			oldConfigElements = oldPoint.getConfigurationElements();
-		// "new" extension point
-		IExtensionPoint newPoint = registry.getExtensionPoint(IContentConstants.CONTENT_NAME, PT_CONTENTTYPES);
-		if (newPoint != null)
-			newConfigElements = newPoint.getConfigurationElements();
-
-		IConfigurationElement[] allContentTypeCEs = new IConfigurationElement[oldConfigElements.length + newConfigElements.length];
-		System.arraycopy(oldConfigElements, 0, allContentTypeCEs, 0, oldConfigElements.length);
-		System.arraycopy(newConfigElements, 0, allContentTypeCEs, oldConfigElements.length, newConfigElements.length);
-
-		return allContentTypeCEs;
-	}
-
-	private void missingMandatoryAttribute(String messageKey, String argument) throws CoreException {
-		String message = NLS.bind(messageKey, argument);
-		throw new CoreException(new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, null));
-	}
-
-	private void registerContentType(IConfigurationElement contentTypeCE) {
-		try {
-			ContentType contentType = createContentType(contentTypeCE);
-			catalog.addContentType(contentType);
-		} catch (CoreException e) {
-			// failed validation
-			RuntimeLog.log(e.getStatus());
-		}
-	}
-
-	/* Adds extra file associations to existing content types. If the content 
-	 * type has not been added, the file association is ignored.
-	 */
-	private void registerFileAssociation(IConfigurationElement fileAssociationElement) {
-		//TODO: need to ensure the config. element is valid		
-		String contentTypeId = getUniqueId(fileAssociationElement.getContributor().getName(), fileAssociationElement.getAttribute("content-type")); //$NON-NLS-1$
-		ContentType target = catalog.internalGetContentType(contentTypeId);
-		if (target == null)
-			return;
-		addFileAssociation(fileAssociationElement, target);
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeCatalog.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeCatalog.java
deleted file mode 100644
index 775a2f6..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeCatalog.java
+++ /dev/null
@@ -1,555 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.io.*;
-import java.util.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.content.*;
-import org.eclipse.core.runtime.content.IContentTypeManager.ISelectionPolicy;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-
-public final class ContentTypeCatalog {
-	private static final IContentType[] NO_CONTENT_TYPES = new IContentType[0];
-
-	private Map allChildren = new HashMap();
-	private Map contentTypes = new HashMap();
-
-	private Map fileExtensions = new HashMap();
-
-	private Map fileNames = new HashMap();
-
-	private int generation;
-
-	private ContentTypeManager manager;
-
-	/**
-	 * A sorting policy where the more generic content type wins. Lexicographical comparison is done
-	 * as a last resort when all other criteria fail.  
-	 */
-	private Comparator policyConstantGeneralIsBetter = new Comparator() {
-		public int compare(Object o1, Object o2) {
-			ContentType type1 = (ContentType) o1;
-			ContentType type2 = (ContentType) o2;
-			// first criteria: depth - the lower, the better
-			int depthCriteria = type1.getDepth() - type2.getDepth();
-			if (depthCriteria != 0)
-				return depthCriteria;
-			// second criteria: priority - the higher, the better
-			int priorityCriteria = type1.getPriority() - type2.getPriority();
-			if (priorityCriteria != 0)
-				return -priorityCriteria;
-			// they have same depth and priority - choose one arbitrarily (stability is important)
-			return type1.getId().compareTo(type2.getId());
-		}
-	};
-
-	/**
-	 * A sorting policy where the more specific content type wins. Lexicographical comparison is done
-	 * as a last resort when all other criteria fail.  
-	 */
-	private Comparator policyConstantSpecificIsBetter = new Comparator() {
-		public int compare(Object o1, Object o2) {
-			ContentType type1 = (ContentType) o1;
-			ContentType type2 = (ContentType) o2;
-			// first criteria: depth - the higher, the better
-			int depthCriteria = type1.getDepth() - type2.getDepth();
-			if (depthCriteria != 0)
-				return -depthCriteria;
-			// second criteria: priority - the higher, the better
-			int priorityCriteria = type1.getPriority() - type2.getPriority();
-			if (priorityCriteria != 0)
-				return -priorityCriteria;
-			// they have same depth and priority - choose one arbitrarily (stability is important)
-			return type1.getId().compareTo(type2.getId());
-		}
-	};
-
-	/**
-	 * A sorting policy where the more general content type wins.  
-	 */
-	private Comparator policyGeneralIsBetter = new Comparator() {
-		public int compare(Object o1, Object o2) {
-			ContentType type1 = (ContentType) o1;
-			ContentType type2 = (ContentType) o2;
-			// first criteria: depth - the lower, the better
-			int depthCriteria = type1.getDepth() - type2.getDepth();
-			if (depthCriteria != 0)
-				return depthCriteria;
-			// second criteria: priority - the higher, the better
-			int priorityCriteria = type1.getPriority() - type2.getPriority();
-			if (priorityCriteria != 0)
-				return -priorityCriteria;
-			return 0;
-		}
-	};
-
-	/**
-	 * A sorting policy where content types are sorted by id.
-	 */
-	private Comparator policyLexicographical = new Comparator() {
-		public int compare(Object o1, Object o2) {
-			ContentType type1 = (ContentType) o1;
-			ContentType type2 = (ContentType) o2;
-			return type1.getId().compareTo(type2.getId());
-		}
-	};
-	/**
-	 * A sorting policy where the more specific content type wins.  
-	 */
-	private Comparator policySpecificIsBetter = new Comparator() {
-		public int compare(Object o1, Object o2) {
-			ContentType type1 = (ContentType) o1;
-			ContentType type2 = (ContentType) o2;
-			// first criteria: depth - the higher, the better
-			int depthCriteria = type1.getDepth() - type2.getDepth();
-			if (depthCriteria != 0)
-				return -depthCriteria;
-			// second criteria: priority - the higher, the better
-			int priorityCriteria = type1.getPriority() - type2.getPriority();
-			if (priorityCriteria != 0)
-				return -priorityCriteria;
-			return 0;
-		}
-	};
-
-	private static IContentType[] concat(IContentType[][] types) {
-		if (types[0].length == 0)
-			return types[1];
-		if (types[1].length == 0)
-			return types[0];
-		IContentType[] result = new IContentType[types[0].length + types[1].length];
-		System.arraycopy(types[0], 0, result, 0, types[0].length);
-		System.arraycopy(types[1], 0, result, types[0].length, types[1].length);
-		return result;
-	}
-
-	public ContentTypeCatalog(ContentTypeManager manager, int generation) {
-		this.manager = manager;
-		this.generation = generation;
-	}
-
-	void addContentType(IContentType contentType) {
-		contentTypes.put(contentType.getId(), contentType);
-	}
-
-	/**
-	 * Applies a client-provided selection policy. 
-	 */
-	private IContentType[] applyPolicy(final IContentTypeManager.ISelectionPolicy policy, final IContentType[] candidates, final boolean fileName, final boolean contents) {
-		final IContentType[][] result = new IContentType[][] {candidates};
-		SafeRunner.run(new ISafeRunnable() {
-			public void handleException(Throwable exception) {
-				// already logged in Platform#run()
-				// default result is the original array
-				// nothing to be done
-			}
-
-			public void run() throws Exception {
-				result[0] = policy.select(candidates, fileName, contents);
-			}
-		});
-		return result[0];
-	}
-
-	void associate(ContentType contentType) {
-		String[] builtInFileNames = contentType.getFileSpecs(IContentType.IGNORE_USER_DEFINED | IContentType.FILE_NAME_SPEC);
-		for (int i = 0; i < builtInFileNames.length; i++)
-			associate(contentType, builtInFileNames[i], IContentType.FILE_NAME_SPEC);
-		String[] builtInFileExtensions = contentType.getFileSpecs(IContentType.IGNORE_USER_DEFINED | IContentType.FILE_EXTENSION_SPEC);
-		for (int i = 0; i < builtInFileExtensions.length; i++)
-			associate(contentType, builtInFileExtensions[i], IContentType.FILE_EXTENSION_SPEC);
-	}
-
-	void associate(ContentType contentType, String text, int type) {
-		Map fileSpecMap = ((type & IContentType.FILE_NAME_SPEC) != 0) ? fileNames : fileExtensions;
-		String mappingKey = FileSpec.getMappingKeyFor(text);
-		Set existing = (Set) fileSpecMap.get(mappingKey);
-		if (existing == null)
-			fileSpecMap.put(mappingKey, existing = new HashSet());
-		existing.add(contentType);
-	}
-
-	private int collectMatchingByContents(int valid, IContentType[] subset, List destination, ILazySource contents) throws IOException {
-		for (int i = 0; i < subset.length; i++) {
-			ContentType current = (ContentType) subset[i];
-			IContentDescriber describer = current.getDescriber();
-			int status = IContentDescriber.INDETERMINATE;
-			if (describer != null) {
-				if (contents.isText() && !(describer instanceof ITextContentDescriber))
-					// for text streams we skip content types that do not provide text-based content describers
-					continue;
-				status = current.describe(describer, contents, null);
-				if (status == IContentDescriber.INVALID)
-					continue;
-			}
-			if (status == IContentDescriber.VALID)
-				destination.add(valid++, current);
-			else
-				destination.add(current);
-		}
-		return valid;
-	}
-
-	void dissociate(ContentType contentType, String text, int type) {
-		Map fileSpecMap = ((type & IContentType.FILE_NAME_SPEC) != 0) ? fileNames : fileExtensions;
-		String mappingKey = FileSpec.getMappingKeyFor(text);
-		Set existing = (Set) fileSpecMap.get(mappingKey);
-		if (existing == null)
-			return;
-		existing.remove(contentType);
-	}
-
-	/**
-	 * A content type will be valid if:
-	 * <ol>
-	 * <li>it does not designate a base type, or</li>
-	 * <li>it designates a base type that exists and is valid</li>
-	 * </ol>
-	 * <p>And</p>:
-	 * <ol>
-	 * <li>it does not designate an alias type, or</li>
-	 * <li>it designates an alias type that does not exist, or</li>
-	 * <li>it designates an alias type that exists and is valid</li>
-	 * </ol> 
-	 */
-	private boolean ensureValid(ContentType type) {
-		if (type.getValidation() != ContentType.STATUS_UNKNOWN)
-			// already processed
-			return type.isValid();
-		// set this type temporarily as invalid to prevent cycles
-		// all types in a cycle would remain as invalid
-		type.setValidation(ContentType.STATUS_INVALID);
-		if (type.isAlias())
-			// it is an alias, leave as invalid
-			return false;
-		// check base type
-		ContentType baseType = null;
-		if (type.getBaseTypeId() != null) {
-			baseType = (ContentType) contentTypes.get(type.getBaseTypeId());
-			if (baseType == null)
-				// invalid: specified base type is not known
-				return false;
-			// base type exists, ensure it is valid
-			baseType = baseType.getAliasTarget(true);
-			ensureValid(baseType);
-			if (baseType.getValidation() != ContentType.STATUS_VALID)
-				// invalid: base type was invalid
-				return false;
-		}
-		// valid: all conditions satisfied
-		type.setValidation(ContentType.STATUS_VALID);
-		type.setBaseType(baseType);
-		return true;
-	}
-
-	IContentType[] findContentTypesFor(ContentTypeMatcher matcher, InputStream contents, String fileName) throws IOException {
-		final ILazySource buffer = ContentTypeManager.readBuffer(contents);
-		IContentType[] selected = internalFindContentTypesFor(matcher, buffer, fileName, true);
-		// give the policy a chance to change the results
-		ISelectionPolicy policy = matcher.getPolicy();
-		if (policy != null)
-			selected = applyPolicy(policy, selected, fileName != null, true);
-		return selected;
-	}
-
-	IContentType[] findContentTypesFor(ContentTypeMatcher matcher, final String fileName) {
-		IContentType[] selected = concat(internalFindContentTypesFor(matcher, fileName, policyConstantGeneralIsBetter));
-		// give the policy a chance to change the results
-		ISelectionPolicy policy = matcher.getPolicy();
-		if (policy != null)
-			selected = applyPolicy(policy, selected, true, false);
-		return selected;
-	}
-
-	public IContentType[] getAllContentTypes() {
-		List result = new ArrayList(contentTypes.size());
-		for (Iterator i = contentTypes.values().iterator(); i.hasNext();) {
-			ContentType type = (ContentType) i.next();
-			if (type.isValid() && !type.isAlias())
-				result.add(type);
-		}
-		return (IContentType[]) result.toArray(new IContentType[result.size()]);
-	}
-
-	public ContentType[] getChildren(ContentType parent) {
-		ContentType[] children = (ContentType[]) allChildren.get(parent);
-		if (children != null)
-			return children;
-		List result = new ArrayList(5);
-		for (Iterator i = this.contentTypes.values().iterator(); i.hasNext();) {
-			ContentType next = (ContentType) i.next();
-			if (next.getBaseType() == parent)
-				result.add(next);
-		}
-		children = (ContentType[]) result.toArray(new ContentType[result.size()]);
-		allChildren.put(parent, children);
-		return children;
-	}
-
-	public ContentType getContentType(String contentTypeIdentifier) {
-		ContentType type = internalGetContentType(contentTypeIdentifier);
-		return (type != null && type.isValid() && !type.isAlias()) ? type : null;
-	}
-
-	private IContentDescription getDescriptionFor(ContentTypeMatcher matcher, ILazySource contents, String fileName, QualifiedName[] options) throws IOException {
-		IContentType[] selected = internalFindContentTypesFor(matcher, contents, fileName, false);
-		if (selected.length == 0)
-			return null;
-		// give the policy a chance to change the results
-		ISelectionPolicy policy = matcher.getPolicy();
-		if (policy != null) {
-			selected = applyPolicy(policy, selected, fileName != null, true);
-			if (selected.length == 0)
-				return null;
-		}
-		return matcher.getSpecificDescription(((ContentType) selected[0]).internalGetDescriptionFor(contents, options));
-	}
-
-	public IContentDescription getDescriptionFor(ContentTypeMatcher matcher, InputStream contents, String fileName, QualifiedName[] options) throws IOException {
-		return getDescriptionFor(matcher, ContentTypeManager.readBuffer(contents), fileName, options);
-	}
-
-	public IContentDescription getDescriptionFor(ContentTypeMatcher matcher, Reader contents, String fileName, QualifiedName[] options) throws IOException {
-		return getDescriptionFor(matcher, ContentTypeManager.readBuffer(contents), fileName, options);
-	}
-
-	public int getGeneration() {
-		return generation;
-	}
-
-	public ContentTypeManager getManager() {
-		return manager;
-	}
-
-	public boolean internalAccept(ContentTypeVisitor visitor, ContentType root) {
-		if (!root.isValid() || root.isAlias())
-			return true;
-		int result = visitor.visit(root);
-		switch (result) {
-			// stop traversing the tree
-			case ContentTypeVisitor.STOP :
-				return false;
-			// stop traversing this subtree
-			case ContentTypeVisitor.RETURN :
-				return true;
-		}
-		ContentType[] children = getChildren(root);
-		if (children == null)
-			// this content type has no subtypes - keep traversing the tree
-			return true;
-		for (int i = 0; i < children.length; i++)
-			if (!internalAccept(visitor, children[i]))
-				// stop the traversal
-				return false;
-		return true;
-	}
-
-	public IContentType[] internalFindContentTypesFor(ILazySource buffer, IContentType[][] subset, Comparator validPolicy, Comparator indeterminatePolicy) throws IOException {
-		final List appropriate = new ArrayList(5);
-		final int validFullName = collectMatchingByContents(0, subset[0], appropriate, buffer);
-		final int appropriateFullName = appropriate.size();
-		final int validExtension = collectMatchingByContents(validFullName, subset[1], appropriate, buffer) - validFullName;
-		final int appropriateExtension = appropriate.size() - appropriateFullName;
-		IContentType[] result = (IContentType[]) appropriate.toArray(new IContentType[appropriate.size()]);
-		if (validFullName > 1)
-			Arrays.sort(result, 0, validFullName, validPolicy);
-		if (validExtension > 1)
-			Arrays.sort(result, validFullName, validFullName + validExtension, validPolicy);
-		if (appropriateFullName - validFullName > 1)
-			Arrays.sort(result, validFullName + validExtension, appropriateFullName + validExtension, indeterminatePolicy);
-		if (appropriateExtension - validExtension > 1)
-			Arrays.sort(result, appropriateFullName + validExtension, appropriate.size(), indeterminatePolicy);
-		return result;
-	}
-
-	private IContentType[] internalFindContentTypesFor(ContentTypeMatcher matcher, ILazySource buffer, String fileName, boolean forceValidation) throws IOException {
-		final IContentType[][] subset;
-		final Comparator validPolicy;
-		Comparator indeterminatePolicy;
-		if (fileName == null) {
-			// we only have a single array, by need to provide a two-dimensional, 2-element array 
-			subset = new IContentType[][] {getAllContentTypes(), NO_CONTENT_TYPES};
-			indeterminatePolicy = policyConstantGeneralIsBetter;
-			validPolicy = policyConstantSpecificIsBetter;
-		} else {
-			subset = internalFindContentTypesFor(matcher, fileName, policyLexicographical);
-			indeterminatePolicy = policyGeneralIsBetter;
-			validPolicy = policySpecificIsBetter;
-		}
-		int total = subset[0].length + subset[1].length;
-		if (total == 0)
-			// don't do further work if subset is empty
-			return NO_CONTENT_TYPES;	
-		if (!forceValidation && total == 1) {
-			// do not do validation if not forced and only one was found (caller will validate later)
-			IContentType[] found = subset[0].length == 1 ? subset[0] : subset[1];
-			// bug 100032 - ignore binary content type if contents are text			
-			if (!buffer.isText())
-				// binary buffer, caller can call the describer with no risk
-				return found;
-			// text buffer, need to check describer			
-			IContentDescriber describer = ((ContentType) found[0]).getDescriber();			
-			if (describer == null || describer instanceof ITextContentDescriber)
-				// no describer or text describer, that is fine
-				return found;
-			// only eligible content type is binary and contents are text, ignore it
-			return NO_CONTENT_TYPES;			
-		}
-		return internalFindContentTypesFor(buffer, subset, validPolicy, indeterminatePolicy);
-	}
-
-	/**
-	 * This is the implementation for file name based content type matching. 
-	 * 
-	 * @return all matching content types in the preferred order 
-	 * @see IContentTypeManager#findContentTypesFor(String)
-	 */
-	public IContentType[][] internalFindContentTypesFor(ContentTypeMatcher matcher, final String fileName, Comparator sortingPolicy) {
-		IScopeContext context = matcher.getContext();
-		IContentType[][] result = {NO_CONTENT_TYPES, NO_CONTENT_TYPES};
-
-		final Set allByFileName;
-
-		if (context.equals(manager.getContext()))
-			allByFileName = getDirectlyAssociated(fileName, IContentTypeSettings.FILE_NAME_SPEC);
-		else {
-			allByFileName = new HashSet(getDirectlyAssociated(fileName, IContentTypeSettings.FILE_NAME_SPEC | IContentType.IGNORE_USER_DEFINED));
-			allByFileName.addAll(matcher.getDirectlyAssociated(this, fileName, IContentTypeSettings.FILE_NAME_SPEC));
-		}
-		Set selectedByName = selectMatchingByName(context, allByFileName, Collections.EMPTY_SET, fileName, IContentType.FILE_NAME_SPEC);
-		result[0] = (IContentType[]) selectedByName.toArray(new IContentType[selectedByName.size()]);
-		final String fileExtension = ContentTypeManager.getFileExtension(fileName);
-		if (fileExtension != null) {
-			final Set allByFileExtension;
-			if (context.equals(manager.getContext()))
-				allByFileExtension = getDirectlyAssociated(fileExtension, IContentTypeSettings.FILE_EXTENSION_SPEC);
-			else {
-				allByFileExtension = new HashSet(getDirectlyAssociated(fileExtension, IContentTypeSettings.FILE_EXTENSION_SPEC | IContentType.IGNORE_USER_DEFINED));
-				allByFileExtension.addAll(matcher.getDirectlyAssociated(this, fileExtension, IContentTypeSettings.FILE_EXTENSION_SPEC));
-			}
-			Set selectedByExtension = selectMatchingByName(context, allByFileExtension, selectedByName, fileExtension, IContentType.FILE_EXTENSION_SPEC);
-			if (!selectedByExtension.isEmpty())
-				result[1] = (IContentType[]) selectedByExtension.toArray(new IContentType[selectedByExtension.size()]);
-		}
-		if (result[0].length > 1)
-			Arrays.sort(result[0], sortingPolicy);
-		if (result[1].length > 1)
-			Arrays.sort(result[1], sortingPolicy);
-		return result;
-	}
-
-	/**
-	 * Returns content types directly associated with the given file spec.
-	 * 
-	 * @param text a file name or extension
-	 * @param typeMask a bit-wise or of the following flags:
-	 * <ul>
-	 * 		<li>IContentType.FILE_NAME, </li>
-	 * 		<li>IContentType.FILE_EXTENSION, </li>
-	 * 		<li>IContentType.IGNORE_PRE_DEFINED, </li>
-	 * 		<li>IContentType.IGNORE_USER_DEFINED</li>
-	 *	</ul>
-	 * @return a set of content types
-	 */
-	public Set getDirectlyAssociated(String text, int typeMask) {
-		Map associations = (typeMask & IContentTypeSettings.FILE_NAME_SPEC) != 0 ? fileNames : fileExtensions;
-		Set result = null;
-		if ((typeMask & (IContentType.IGNORE_PRE_DEFINED | IContentType.IGNORE_USER_DEFINED)) == 0)
-			// no restrictions, get everything
-			result = (Set) associations.get(FileSpec.getMappingKeyFor(text));
-		else {
-			// only those specs satisfying the the type mask should be included
-			Set initialSet = (Set) associations.get(FileSpec.getMappingKeyFor(text));
-			if (initialSet != null && !initialSet.isEmpty()) {
-				// copy so we can modify
-				result = new HashSet(initialSet);
-				// invert the last two bits so it is easier to compare
-				typeMask ^= (IContentType.IGNORE_PRE_DEFINED | IContentType.IGNORE_USER_DEFINED);
-				for (Iterator i = result.iterator(); i.hasNext();) {
-					ContentType contentType = (ContentType) i.next();
-					if (!contentType.hasFileSpec(text, typeMask, true))
-						i.remove();
-				}
-			}
-		}
-		return result == null ? Collections.EMPTY_SET : result;
-	}
-
-	ContentType internalGetContentType(String contentTypeIdentifier) {
-		return (ContentType) contentTypes.get(contentTypeIdentifier);
-	}
-
-	void makeAliases() {
-		// process all content types marking aliases appropriately
-		for (Iterator i = contentTypes.values().iterator(); i.hasNext();) {
-			ContentType type = (ContentType) i.next();
-			String targetId = type.getAliasTargetId();
-			if (targetId == null)
-				continue;
-			ContentType target = internalGetContentType(targetId);
-			if (target != null)
-				type.setAliasTarget(target);
-		}
-	}
-
-	/**
-	 * Resolves inter-content type associations (inheritance and aliasing).
-	 */
-	protected void organize() {
-		// build the aliasing
-		makeAliases();
-		// do the validation
-		for (Iterator i = contentTypes.values().iterator(); i.hasNext();) {
-			ContentType type = (ContentType) i.next();
-			if (ensureValid(type))
-				associate(type);
-		}
-		if (ContentTypeManager.DEBUGGING)
-			for (Iterator i = contentTypes.values().iterator(); i.hasNext();) {
-				ContentType type = (ContentType) i.next();
-				if (!type.isValid())
-					ContentMessages.message("Invalid: " + type); //$NON-NLS-1$
-			}
-	}
-
-	/**
-	 * Processes all content types in source, adding those matching the given file spec to the
-	 * destination collection.
-	 */
-	private Set selectMatchingByName(final IScopeContext context, Collection source, final Collection existing, final String fileSpecText, final int fileSpecType) {
-		if (source == null || source.isEmpty())
-			return Collections.EMPTY_SET;
-		final Set destination = new HashSet(5);
-		// process all content types in the given collection
-		for (Iterator i = source.iterator(); i.hasNext();) {
-			final ContentType root = (ContentType) i.next();
-			// From a given content type, check if it matches, and 
-			// include any children that match as well.
-			internalAccept(new ContentTypeVisitor() {
-				public int visit(ContentType type) {
-					if (type != root && type.hasBuiltInAssociations())
-						// this content type has built-in associations - visit it later as root						
-						return RETURN;
-					if (type == root && !type.hasFileSpec(context, fileSpecText, fileSpecType))
-						// it is the root and does not match the file name - do not add it nor look into its children						
-						return RETURN;
-					// either the content type is the root and matches the file name or 
-					// is a sub content type and does not have built-in files specs
-					if (!existing.contains(type))
-						destination.add(type);
-					return CONTINUE;
-				}
-			}, root);
-		}
-		return destination;
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeHandler.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeHandler.java
deleted file mode 100644
index 74cdad3..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeHandler.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.io.*;
-import java.lang.ref.SoftReference;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.*;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-
-/**
- * The only content types exposed to clients. Allows the content type registry to change 
- * underneath preserving handlers kept by clients.
- */
-public class ContentTypeHandler implements IContentType {
-
-	/**
-	 * A dummy description object to be returned by getDescription when this 
-	 * handler's target cannot be determined. 
-	 */
-	private class DummyContentDescription implements IContentDescription {
-		public String getCharset() {
-			return null;
-		}
-
-		public IContentType getContentType() {
-			return ContentTypeHandler.this;
-		}
-
-		public Object getProperty(QualifiedName key) {
-			return null;
-		}
-
-		public boolean isRequested(QualifiedName key) {
-			return false;
-		}
-
-		public void setProperty(QualifiedName key, Object value) {
-			// don't do anything
-		}
-	}
-
-	private int generation;
-	String id;
-	private SoftReference targetRef;
-
-	ContentTypeHandler(ContentType target, int generation) {
-		this.id = target.getId();
-		this.targetRef = new SoftReference(target);
-		this.generation = generation;
-	}
-
-	public void addFileSpec(String fileSpec, int type) throws CoreException {
-		final IContentType target = getTarget();
-		if (target != null)
-			target.addFileSpec(fileSpec, type);
-	}
-
-	public boolean equals(Object another) {
-		if (another instanceof ContentType)
-			return id.equals(((ContentType) another).id);
-		if (another instanceof ContentTypeHandler)
-			return id.equals(((ContentTypeHandler) another).id);
-		return false;
-	}
-
-	public IContentType getBaseType() {
-		final ContentType target = getTarget();
-		if (target == null)
-			return null;
-		final ContentType baseType = (ContentType) target.getBaseType();
-		return (baseType != null) ? new ContentTypeHandler(baseType, baseType.getCatalog().getGeneration()) : null;
-	}
-
-	public String getDefaultCharset() {
-		final IContentType target = getTarget();
-		return (target != null) ? target.getDefaultCharset() : null;
-	}
-
-	public IContentDescription getDefaultDescription() {
-		final IContentType target = getTarget();
-		return (target != null) ? target.getDefaultDescription() : new DummyContentDescription();
-	}
-
-	public IContentDescription getDescriptionFor(InputStream contents, QualifiedName[] options) throws IOException {
-		final IContentType target = getTarget();
-		return (target != null) ? target.getDescriptionFor(contents, options) : null;
-	}
-
-	public IContentDescription getDescriptionFor(Reader contents, QualifiedName[] options) throws IOException {
-		final IContentType target = getTarget();
-		return (target != null) ? target.getDescriptionFor(contents, options) : null;
-	}
-
-	public String[] getFileSpecs(int type) {
-		final IContentType target = getTarget();
-		return (target != null) ? target.getFileSpecs(type) : new String[0];
-	}
-
-	public String getId() {
-		return id;
-	}
-
-	public String getName() {
-		final IContentType target = getTarget();
-		return (target != null) ? target.getName() : id;
-	}
-
-	public IContentTypeSettings getSettings(IScopeContext context) throws CoreException {
-		final ContentType target = getTarget();
-		if (target == null)
-			return null;
-		// the content type may returned itself as the settings object (instance scope context)
-		final IContentTypeSettings settings = target.getSettings(context);
-		// in that case, return this same handler; otherwise, just return the settings 
-		return settings == target ? this : settings;
-	}
-
-	/**
-	 * Returns the content type this handler represents. 
-	 * Note that this handles the case of aliasing.
-	 * 
-	 * Public for testing purposes only.
-	 */
-	public ContentType getTarget() {
-		ContentType target = (ContentType) targetRef.get();
-		ContentTypeCatalog catalog = ContentTypeManager.getInstance().getCatalog();
-		if (target == null || catalog.getGeneration() != generation) {
-			target = catalog.getContentType(id);
-			targetRef = new SoftReference(target);
-			generation = catalog.getGeneration();
-		}
-		return target == null ? null : target.getAliasTarget(true);
-	}
-
-	public int hashCode() {
-		return id.hashCode();
-	}
-
-	public boolean isAssociatedWith(String fileName) {
-		final IContentType target = getTarget();
-		return (target != null) ? target.isAssociatedWith(fileName) : false;
-	}
-
-	public boolean isAssociatedWith(String fileName, IScopeContext context) {
-		final IContentType target = getTarget();
-		return (target != null) ? target.isAssociatedWith(fileName, context) : false;
-	}
-
-	public boolean isKindOf(IContentType another) {
-		if (another instanceof ContentTypeHandler)
-			another = ((ContentTypeHandler) another).getTarget();
-		final IContentType target = getTarget();
-		return (target != null) ? target.isKindOf(another) : false;
-	}
-
-	public void removeFileSpec(String fileSpec, int type) throws CoreException {
-		final IContentType target = getTarget();
-		if (target != null)
-			target.removeFileSpec(fileSpec, type);
-	}
-
-	public void setDefaultCharset(String userCharset) throws CoreException {
-		final IContentType target = getTarget();
-		if (target != null)
-			target.setDefaultCharset(userCharset);
-	}
-
-	public String toString() {
-		return id;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeManager.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeManager.java
deleted file mode 100644
index 25885bf..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeManager.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.io.InputStream;
-import java.io.Reader;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.content.*;
-import org.eclipse.core.runtime.preferences.*;
-
-public class ContentTypeManager extends ContentTypeMatcher implements IContentTypeManager, IRegistryChangeListener {
-	private static ContentTypeManager instance;
-
-	public static final int BLOCK_SIZE = 0x400;
-	public static final String CONTENT_TYPE_PREF_NODE = IContentConstants.RUNTIME_NAME + IPath.SEPARATOR + "content-types"; //$NON-NLS-1$
-	private static final String OPTION_DEBUG_CONTENT_TYPES = "org.eclipse.core.contenttype/debug"; //$NON-NLS-1$;
-	static final boolean DEBUGGING = ContentOSGiUtils.getDefault().getBooleanDebugOption(OPTION_DEBUG_CONTENT_TYPES, false);
-	private ContentTypeCatalog catalog;
-	private int catalogGeneration;
-
-	/** 
-	 * List of registered listeners (element type: 
-	 * <code>IContentTypeChangeListener</code>).
-	 * These listeners are to be informed when 
-	 * something in a content type changes.
-	 */
-	protected ListenerList contentTypeListeners = new ListenerList();
-
-	/**
-	 * Creates and initializes the platform's content type manager. A reference to the
-	 * content type manager can later be obtained by calling <code>getInstance()</code>.
-	 * <p>
-	 * Since calling this method will cause the content type manager to register a registry change listener, 
-	 * this method must be called while the extension registry is available.
-	 * </p>
-	 */
-	public static void startup() {
-		instance = new ContentTypeManager();
-		RegistryFactory.getRegistry().addRegistryChangeListener(instance, IContentConstants.RUNTIME_NAME);
-		RegistryFactory.getRegistry().addRegistryChangeListener(instance, IContentConstants.CONTENT_NAME);
-	}
-
-	/**
-	 * Shuts down the platform's content type manager. After this call returns,
-	 * the content type manager will be closed for business.
-	 * <p>
-	 * Since calling this method will cause the content type manager to unregister a registry change listener, 
-	 * this method must be called while the extension registry is available.
-	 * </p>
-	 */
-	public static void shutdown() {
-		RegistryFactory.getRegistry().removeRegistryChangeListener(instance);
-		instance = null;
-	}
-
-	/**
-	 * Obtains this platform's content type manager. 
-	 * <p>
-	 * It has to have been created first by a call to <code>create()</code>,
-	 * otherwise an <code>AssertionFailedException</code> will be thrown.
-	 * </p> 
-	 * 
-	 * @return the content type manager
-	 */
-	public static ContentTypeManager getInstance() {
-		Assert.isNotNull(instance);
-		return instance;
-	}
-
-	/*
-	 * Returns the extension for a file name (omitting the leading '.').
-	 */
-	static String getFileExtension(String fileName) {
-		int dotPosition = fileName.lastIndexOf('.');
-		return (dotPosition == -1 || dotPosition == fileName.length() - 1) ? "" : fileName.substring(dotPosition + 1); //$NON-NLS-1$
-	}
-
-	protected static ILazySource readBuffer(InputStream contents) {
-		return new LazyInputStream(contents, BLOCK_SIZE);
-	}
-
-	protected static ILazySource readBuffer(Reader contents) {
-		return new LazyReader(contents, BLOCK_SIZE);
-	}
-
-	public ContentTypeManager() {
-		super(null, new InstanceScope());
-	}
-
-	protected ContentTypeBuilder createBuilder(ContentTypeCatalog newCatalog) {
-		return new ContentTypeBuilder(newCatalog);
-	}
-
-	public IContentType[] getAllContentTypes() {
-		ContentTypeCatalog currentCatalog = getCatalog();
-		IContentType[] types = currentCatalog.getAllContentTypes();
-		IContentType[] result = new IContentType[types.length];
-		int generation = currentCatalog.getGeneration();
-		for (int i = 0; i < result.length; i++)
-			result[i] = new ContentTypeHandler((ContentType) types[i], generation);
-		return result;
-	}
-
-	protected synchronized ContentTypeCatalog getCatalog() {
-		if (catalog != null)
-			// already has one			
-			return catalog;
-		// create new catalog 
-		ContentTypeCatalog newCatalog = new ContentTypeCatalog(this, catalogGeneration++);
-		// build catalog by parsing the extension registry
-		ContentTypeBuilder builder = createBuilder(newCatalog);
-		try {
-			builder.buildCatalog();
-			// only remember catalog if building it was successful 
-			catalog = newCatalog;
-		} catch (InvalidRegistryObjectException e) {
-			// the registry has stale objects... just don't remember the returned (incomplete) catalog
-		}
-		newCatalog.organize();
-		return newCatalog;
-	}
-
-	public IContentType getContentType(String contentTypeIdentifier) {
-		ContentTypeCatalog currentCatalog = getCatalog();
-		ContentType type = currentCatalog.getContentType(contentTypeIdentifier);
-		return type == null ? null : new ContentTypeHandler(type, currentCatalog.getGeneration());
-	}
-
-	public IContentTypeMatcher getMatcher(final ISelectionPolicy customPolicy, final IScopeContext context) {
-		return new ContentTypeMatcher(customPolicy, context == null ? getContext() : context);
-	}
-
-	IEclipsePreferences getPreferences() {
-		return getPreferences(getContext());
-	}
-
-	IEclipsePreferences getPreferences(IScopeContext context) {
-		return context.getNode(CONTENT_TYPE_PREF_NODE);
-	}
-
-	public void registryChanged(IRegistryChangeEvent event) {
-		// no changes related to the content type registry
-		if (event.getExtensionDeltas(IContentConstants.RUNTIME_NAME, ContentTypeBuilder.PT_CONTENTTYPES).length == 0 && 
-			event.getExtensionDeltas(IContentConstants.CONTENT_NAME, ContentTypeBuilder.PT_CONTENTTYPES).length == 0)
-			return;
-		invalidate();
-	}
-
-	/**
-	 * Causes a new catalog to be built afresh next time an API call is made.
-	 */
-	synchronized void invalidate() {
-		if (ContentTypeManager.DEBUGGING && catalog != null)
-			ContentMessages.message("Registry discarded"); //$NON-NLS-1$		
-		catalog = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see IContentTypeManager#addContentTypeChangeListener(IContentTypeChangeListener)
-	 */
-	public void addContentTypeChangeListener(IContentTypeChangeListener listener) {
-		contentTypeListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see IContentTypeManager#removeContentTypeChangeListener(IContentTypeChangeListener)
-	 */
-	public void removeContentTypeChangeListener(IContentTypeChangeListener listener) {
-		contentTypeListeners.remove(listener);
-	}
-
-	public void fireContentTypeChangeEvent(ContentType type) {
-		Object[] listeners = this.contentTypeListeners.getListeners();
-		IContentType eventObject = new ContentTypeHandler(type, type.getCatalog().getGeneration());
-		for (int i = 0; i < listeners.length; i++) {
-			final ContentTypeChangeEvent event = new ContentTypeChangeEvent(eventObject);
-			final IContentTypeChangeListener listener = (IContentTypeChangeListener) listeners[i];
-			ISafeRunnable job = new ISafeRunnable() {
-				public void handleException(Throwable exception) {
-					// already logged in SafeRunner#run()
-				}
-
-				public void run() throws Exception {
-					listener.contentTypeChanged(event);
-				}
-			};
-			SafeRunner.run(job);
-		}
-	}
-
-	public IContentDescription getSpecificDescription(BasicDescription description) {
-		// this is the platform content type manager, no specificities
-		return description;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeMatcher.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeMatcher.java
deleted file mode 100644
index d4ad792..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeMatcher.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.io.*;
-import java.util.*;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.*;
-import org.eclipse.core.runtime.preferences.*;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * @since 3.1
- */
-public class ContentTypeMatcher implements IContentTypeMatcher {
-
-	private IScopeContext context;
-	private IContentTypeManager.ISelectionPolicy policy;
-
-	public ContentTypeMatcher(IContentTypeManager.ISelectionPolicy policy, IScopeContext context) {
-		this.policy = policy;
-		this.context = context;
-	}
-
-	/**
-	 * @see IContentTypeMatcher
-	 */
-	public IContentType findContentTypeFor(InputStream contents, String fileName) throws IOException {
-		ContentTypeCatalog currentCatalog = getCatalog();
-		IContentType[] all = currentCatalog.findContentTypesFor(this, contents, fileName);
-		return all.length > 0 ? new ContentTypeHandler((ContentType) all[0], currentCatalog.getGeneration()) : null;
-	}
-
-	/**
-	 * @see IContentTypeMatcher
-	 */
-	public IContentType findContentTypeFor(String fileName) {
-		// basic implementation just gets all content types
-		ContentTypeCatalog currentCatalog = getCatalog();
-		IContentType[] associated = currentCatalog.findContentTypesFor(this, fileName);
-		return associated.length == 0 ? null : new ContentTypeHandler((ContentType) associated[0], currentCatalog.getGeneration());
-	}
-
-	/**
-	 * @see IContentTypeMatcher
-	 */
-	public IContentType[] findContentTypesFor(InputStream contents, String fileName) throws IOException {
-		ContentTypeCatalog currentCatalog = getCatalog();
-		IContentType[] types = currentCatalog.findContentTypesFor(this, contents, fileName);
-		IContentType[] result = new IContentType[types.length];
-		int generation = currentCatalog.getGeneration();
-		for (int i = 0; i < result.length; i++)
-			result[i] = new ContentTypeHandler((ContentType) types[i], generation);
-		return result;
-	}
-
-	/**
-	 * @see IContentTypeMatcher
-	 */
-	public IContentType[] findContentTypesFor(String fileName) {
-		ContentTypeCatalog currentCatalog = getCatalog();
-		IContentType[] types = currentCatalog.findContentTypesFor(this, fileName);
-		IContentType[] result = new IContentType[types.length];
-		int generation = currentCatalog.getGeneration();
-		for (int i = 0; i < result.length; i++)
-			result[i] = new ContentTypeHandler((ContentType) types[i], generation);
-		return result;
-	}
-
-	private ContentTypeCatalog getCatalog() {
-		return ContentTypeManager.getInstance().getCatalog();
-	}
-
-	/**
-	 * @see IContentTypeMatcher
-	 */
-	public IContentDescription getDescriptionFor(InputStream contents, String fileName, QualifiedName[] options) throws IOException {
-		return getCatalog().getDescriptionFor(this, contents, fileName, options);
-	}
-
-	/**
-	 * @see IContentTypeMatcher
-	 */
-	public IContentDescription getDescriptionFor(Reader contents, String fileName, QualifiedName[] options) throws IOException {
-		return getCatalog().getDescriptionFor(this, contents, fileName, options);
-	}
-
-	public IScopeContext getContext() {
-		return context;
-	}
-
-	public IContentTypeManager.ISelectionPolicy getPolicy() {
-		return policy;
-	}
-
-	/**
-	 * Enumerates all content types whose settings satisfy the given file spec type mask.
-	 */
-	public Collection getDirectlyAssociated(final ContentTypeCatalog catalog, final String fileSpec, final int typeMask) {
-		//TODO: make sure we include built-in associations as well
-		final IEclipsePreferences root = context.getNode(ContentTypeManager.CONTENT_TYPE_PREF_NODE);
-		final Set result = new HashSet(3);
-		try {
-			root.accept(new IPreferenceNodeVisitor() {
-				public boolean visit(IEclipsePreferences node) {
-					if (node == root)
-						return true;
-					String[] fileSpecs = ContentTypeSettings.getFileSpecs(node, typeMask);
-					for (int i = 0; i < fileSpecs.length; i++)
-						if (fileSpecs[i].equalsIgnoreCase(fileSpec)) {
-							ContentType associated = catalog.getContentType(node.name());
-							if (associated != null)
-								result.add(associated);
-							break;
-						}
-					return false;
-				}
-
-			});
-		} catch (BackingStoreException bse) {
-			ContentType.log(ContentMessages.content_errorLoadingSettings, bse);
-		}
-		return result == null ? Collections.EMPTY_SET : result;
-	}
-
-	public IContentDescription getSpecificDescription(BasicDescription description) {
-		if (description == null || ContentTypeManager.getInstance().getContext().equals(getContext()))
-			// no need for specific content descriptions
-			return description;
-		// default description
-		if (description instanceof DefaultDescription)
-			// return an context specific description instead
-			return new DefaultDescription(new ContentTypeSettings((ContentType) description.getContentTypeInfo(), context));
-		// non-default description
-		// replace info object with context specific settings
-		((ContentDescription) description).setContentTypeInfo(new ContentTypeSettings((ContentType) description.getContentTypeInfo(), context));
-		return description;
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeSettings.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeSettings.java
deleted file mode 100644
index dca05a9..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeSettings.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.util.List;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentTypeSettings;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
-
-public class ContentTypeSettings implements IContentTypeSettings, IContentTypeInfo {
-
-	private ContentType contentType;
-	private IScopeContext context;
-
-	static void addFileSpec(IScopeContext context, String contentTypeId, String fileSpec, int type) throws CoreException {
-		Preferences contentTypeNode = ContentTypeManager.getInstance().getPreferences(context).node(contentTypeId);
-		String key = ContentType.getPreferenceKey(type);
-		List existingValues = Util.parseItemsIntoList(contentTypeNode.get(key, null));
-		for (int i = 0; i < existingValues.size(); i++)
-			if (((String) existingValues.get(i)).equalsIgnoreCase(fileSpec))
-				// don't do anything if already exists
-				return;
-		existingValues.add(fileSpec);
-		// set new preference value		
-		String newValue = Util.toListString(existingValues.toArray());
-		ContentType.setPreference(contentTypeNode, key, newValue);
-		try {
-			contentTypeNode.flush();
-		} catch (BackingStoreException bse) {
-			String message = NLS.bind(ContentMessages.content_errorSavingSettings, contentTypeId);
-			IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, bse);
-			throw new CoreException(status);
-		}
-	}
-
-	static String[] getFileSpecs(IScopeContext context, String contentTypeId, int type) {
-		Preferences contentTypeNode = ContentTypeManager.getInstance().getPreferences(context).node(contentTypeId);
-		return getFileSpecs(contentTypeNode, type);
-	}
-
-	static String[] getFileSpecs(Preferences contentTypeNode, int type) {
-		String key = ContentType.getPreferenceKey(type);
-		String existing = contentTypeNode.get(key, null);
-		return Util.parseItems(existing);
-	}
-
-	public static String internalGetDefaultProperty(ContentType current, final Preferences contentTypePrefs, final QualifiedName key) throws BackingStoreException {
-		String id = current.getId();
-		if (contentTypePrefs.nodeExists(id)) {
-			Preferences contentTypeNode = contentTypePrefs.node(id);
-			String propertyValue = contentTypeNode.get(key.getLocalName(), null);
-			if (propertyValue != null)
-				return propertyValue;
-		}
-		// try built-in settings
-		String propertyValue = current.basicGetDefaultProperty(key);
-		if (propertyValue != null)
-			return propertyValue;
-		// try ancestor
-		ContentType baseType = (ContentType) current.getBaseType();
-		return baseType == null ? null : internalGetDefaultProperty(baseType, contentTypePrefs, key);
-	}
-
-	static void removeFileSpec(IScopeContext context, String contentTypeId, String fileSpec, int type) throws CoreException {
-		Preferences contentTypeNode = ContentTypeManager.getInstance().getPreferences(context).node(contentTypeId);
-		String key = ContentType.getPreferenceKey(type);
-		String existing = contentTypeNode.get(key, null);
-		if (existing == null)
-			// content type has no settings - nothing to do
-			return;
-		List existingValues = Util.parseItemsIntoList(contentTypeNode.get(key, null));
-		int index = -1;
-		int existingCount = existingValues.size();
-		for (int i = 0; index == -1 && i < existingCount; i++)
-			if (((String) existingValues.get(i)).equalsIgnoreCase(fileSpec))
-				index = i;
-		if (index == -1)
-			// did not find the file spec to be removed - nothing to do
-			return;
-		existingValues.remove(index);
-		// set new preference value
-		String newValue = Util.toListString(existingValues.toArray());
-		ContentType.setPreference(contentTypeNode, key, newValue);
-		try {
-			contentTypeNode.flush();
-		} catch (BackingStoreException bse) {
-			String message = NLS.bind(ContentMessages.content_errorSavingSettings, contentTypeId);
-			IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, bse);
-			throw new CoreException(status);
-		}
-	}
-
-	public ContentTypeSettings(ContentType contentType, IScopeContext context) {
-		this.context = context;
-		this.contentType = contentType;
-	}
-
-	/*
-	 * @see IContentTypeSettings 
-	 */
-	public void addFileSpec(String fileSpec, int type) throws CoreException {
-		addFileSpec(context, contentType.getId(), fileSpec, type);
-	}
-
-	public ContentType getContentType() {
-		return contentType;
-	}
-
-	public String getDefaultCharset() {
-		return getDefaultProperty(IContentDescription.CHARSET);
-	}
-
-	public String getDefaultProperty(final QualifiedName key) {
-		final Preferences contentTypePrefs = ContentTypeManager.getInstance().getPreferences(context);
-		try {
-			String propertyValue = internalGetDefaultProperty(contentType, contentTypePrefs, key);
-			return "".equals(propertyValue) ? null : propertyValue; //$NON-NLS-1$
-		} catch (BackingStoreException e) {
-			return null;
-		}
-	}
-
-	public String[] getFileSpecs(int type) {
-		return getFileSpecs(context, contentType.getId(), type);
-	}
-
-	public String getId() {
-		return contentType.getId();
-	}
-
-	public void removeFileSpec(String fileSpec, int type) throws CoreException {
-		removeFileSpec(context, contentType.getId(), fileSpec, type);
-	}
-
-	public void setDefaultCharset(String userCharset) throws CoreException {
-		Preferences contentTypeNode = ContentTypeManager.getInstance().getPreferences(context).node(contentType.getId());
-		ContentType.setPreference(contentTypeNode, ContentType.PREF_DEFAULT_CHARSET, userCharset);
-		try {
-			contentTypeNode.flush();
-		} catch (BackingStoreException bse) {
-			String message = NLS.bind(ContentMessages.content_errorSavingSettings, contentType.getId());
-			IStatus status = new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, bse);
-			throw new CoreException(status);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeVisitor.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeVisitor.java
deleted file mode 100644
index 5b1ff55..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ContentTypeVisitor.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-public interface ContentTypeVisitor {
-	int CONTINUE = 0;
-	int RETURN = 1;
-	int STOP = 2;
-
-	/**
-	 * @return CONTINUE, RETURN or STOP
-	 */
-	public int visit(ContentType contentType);
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/DefaultDescription.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/DefaultDescription.java
deleted file mode 100644
index 6112008..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/DefaultDescription.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescription;
-
-/**
- * A content description for which all  properties have default values. 
- */
-public final class DefaultDescription extends BasicDescription {
-
-	public DefaultDescription(IContentTypeInfo contentTypeInfo) {
-		super(contentTypeInfo);
-	}
-
-	public boolean equals(Object obj) {
-		if (!(obj instanceof DefaultDescription))
-			return false;
-		// see ContentType.equals()
-		return contentTypeInfo.equals(((DefaultDescription) obj).contentTypeInfo);
-	}
-
-	/**
-	 * @see IContentDescription
-	 */
-	public String getCharset() {
-		return (String) getProperty(CHARSET);
-	}
-
-	/**
-	 * @see IContentDescription
-	 */
-	public Object getProperty(QualifiedName key) {
-		return contentTypeInfo.getDefaultProperty(key);
-	}
-
-	public int hashCode() {
-		return contentTypeInfo.getContentType().hashCode();
-	}
-
-	/**
-	 * @see IContentDescription
-	 */
-	public boolean isRequested(QualifiedName key) {
-		return false;
-	}
-
-	/**
-	 * @see IContentDescription
-	 */
-	public void setProperty(QualifiedName key, Object value) {
-		throw new IllegalStateException();
-	}
-
-	public String toString() {
-		return "{default} : " + contentTypeInfo.getContentType(); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/FileSpec.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/FileSpec.java
deleted file mode 100644
index 715f56b..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/FileSpec.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import org.eclipse.core.runtime.content.IContentType;
-
-/**
- * Provides a uniform representation for file specifications, such 
- * as file names, file extensions and regular expressions.
- */
-class FileSpec {
-	final static int BASIC_TYPE = IContentType.FILE_EXTENSION_SPEC | IContentType.FILE_NAME_SPEC;
-	private String text;
-	private int type;
-
-	public FileSpec(String text, int type) {
-		this.text = text;
-		this.type = type;
-	}
-
-	public String getText() {
-		return text;
-	}
-
-	public int getType() {
-		return type;
-	}
-
-	public static int getBasicType(int type) {
-		return BASIC_TYPE & type;
-	}
-
-	public boolean equals(Object other) {
-		if (!(other instanceof FileSpec))
-			return false;
-		FileSpec otherFileSpec = (FileSpec) other;
-		return equals(text, otherFileSpec.getType(), false);
-	}
-
-	public boolean equals(final String text, final int otherType, final boolean strict) {
-		return ((!strict && getBasicType(type) == getBasicType(otherType)) || type == otherType) && this.text.equalsIgnoreCase(text);
-	}
-
-	public int hashCode() {
-		return text.hashCode();
-	}
-
-	public static String getMappingKeyFor(String fileSpecText) {
-		return fileSpecText.toLowerCase();
-	}
-
-	public String toString() {
-		return getText();
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/IContentConstants.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/IContentConstants.java
deleted file mode 100644
index 298b149..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/IContentConstants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-/**
- * Container for the constants used by this plugin. 
- * 
- * @since org.eclipse.core.contenttype 3.2
- */
-public interface IContentConstants {
-	/**
-	 * Backward compatibility: name of the original runtime plugin
-	 */
-	public static final String RUNTIME_NAME = "org.eclipse.core.runtime"; //$NON-NLS-1$
-
-	/**
-	 * Name of this plugin
-	 */
-	public static final String CONTENT_NAME = "org.eclipse.core.contenttype"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/IContentTypeInfo.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/IContentTypeInfo.java
deleted file mode 100644
index 9d6c7e3..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/IContentTypeInfo.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import org.eclipse.core.runtime.QualifiedName;
-
-/**
- * @since 3.1
- */
-public abstract interface IContentTypeInfo {
-	/**
-	 * Returns a reference to the corresponding content type. 
-	 */
-	public abstract ContentType getContentType();
-
-	/**
-	 * Returns the default value for the given property, delegating to the
-	 * ancestor type if necessary. 
-	 */
-	public abstract String getDefaultProperty(QualifiedName key);
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ILazySource.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ILazySource.java
deleted file mode 100644
index e25c0aa..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/ILazySource.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-/**
- * A common abstract view for lazy character/binary input streams.
- * 
- * @since 3.1
- */
-public interface ILazySource {
-	/**
-	 * @return a boolean indicating whether this stream is character or byte-based 
-	 */
-	public boolean isText();
-
-	/**
-	 * Rewinds the stream.
-	 */
-	public void rewind();
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/LazyInputStream.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/LazyInputStream.java
deleted file mode 100644
index 0f48b96..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/LazyInputStream.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.content;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-public class LazyInputStream extends InputStream implements ILazySource {
-	private int blockCapacity;
-	byte[][] blocks = {};
-	private int bufferSize;
-	private InputStream in;
-	private int mark;
-	private int offset;
-
-	public LazyInputStream(InputStream in, int blockCapacity) {
-		this.in = in;
-		this.blockCapacity = blockCapacity;
-	}
-
-	public int available() throws IOException {
-		try {
-			return bufferSize - offset + in.available();
-		} catch (IOException ioe) {
-			throw new LowLevelIOException(ioe);
-		}
-	}
-
-	private int computeBlockSize(int blockIndex) {
-		if (blockIndex < blocks.length - 1)
-			return blockCapacity;
-		int blockSize = bufferSize % blockCapacity;
-		return blockSize == 0 ? blockCapacity : blockSize;
-	}
-
-	private int copyFromBuffer(byte[] userBuffer, int userOffset, int needed) {
-		int copied = 0;
-		int current = offset / blockCapacity;
-		while ((needed - copied) > 0 && current < blocks.length) {
-			int blockSize = computeBlockSize(current);
-			int offsetInBlock = offset % blockCapacity;
-			int availableInBlock = blockSize - offsetInBlock;
-			int toCopy = Math.min(availableInBlock, needed - copied);
-			System.arraycopy(blocks[current], offsetInBlock, userBuffer, userOffset + copied, toCopy);
-			copied += toCopy;
-			current++;
-			offset += toCopy;
-		}
-		return copied;
-	}
-
-	private void ensureAvailable(long bytesToRead) throws IOException {
-		int loadedBlockSize = blockCapacity;
-		while (bufferSize < offset + bytesToRead && loadedBlockSize == blockCapacity) {
-			try {
-				loadedBlockSize = loadBlock();
-			} catch (IOException e) {
-				throw new LowLevelIOException(e);
-			}
-			bufferSize += loadedBlockSize;
-		}
-	}
-
-	// for testing purposes
-	protected int getBlockCount() {
-		return blocks.length;
-	}
-
-	// for testing purposes
-	protected int getBufferSize() {
-		return bufferSize;
-	}
-
-	// for testing purposes
-	protected int getMark() {
-		return mark;
-	}
-
-	// for testing purposes
-	protected int getOffset() {
-		return offset;
-	}
-
-	public boolean isText() {
-		return false;
-	}
-
-	private int loadBlock() throws IOException {
-		// read a block from the underlying stream
-		byte[] newBlock = new byte[blockCapacity];
-		int readCount = in.read(newBlock);
-		if (readCount == -1)
-			return 0;
-		// expand blocks array
-		byte[][] tmpBlocks = new byte[blocks.length + 1][];
-		System.arraycopy(blocks, 0, tmpBlocks, 0, blocks.length);
-		blocks = tmpBlocks;
-		blocks[blocks.length - 1] = newBlock;
-		return readCount;
-	}
-
-	public void mark(int readlimit) {
-		mark = offset;
-	}
-
-	public boolean markSupported() {
-		return true;
-	}
-
-	public int read() throws IOException {
-		ensureAvailable(1);
-		if (bufferSize <= offset)
-			return -1;
-		int nextByte = 0xFF & blocks[offset / blockCapacity][offset % blockCapacity];
-		offset++;
-		return nextByte;
-	}
-
-	public int read(byte[] b) throws IOException {
-		return read(b, 0, b.length);
-	}
-
-	public int read(byte[] b, int off, int len) throws IOException {
-		ensureAvailable(len);
-		int copied = copyFromBuffer(b, off, len);
-		return copied == 0 ? -1 : copied;
-	}
-
-	public void reset() {
-		offset = mark;
-	}
-
-	public void rewind() {
-		mark = 0;
-		offset = 0;
-	}
-
-	public long skip(long toSkip) throws IOException {
-		if (toSkip <= 0)
-			return 0;
-		ensureAvailable(toSkip);
-		long skipped = Math.min(toSkip, bufferSize - offset);
-		offset += skipped;
-		return skipped;
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/LazyReader.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/LazyReader.java
deleted file mode 100644
index 241a76f..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/LazyReader.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.content;
-
-import java.io.IOException;
-import java.io.Reader;
-
-public class LazyReader extends Reader implements ILazySource {
-	private int blockCapacity;
-	char[][] blocks = {};
-	private int bufferSize;
-	private Reader in;
-	private int mark;
-	private int offset;
-
-	public LazyReader(Reader in, int blockCapacity) {
-		this.in = in;
-		this.blockCapacity = blockCapacity;
-	}
-
-	public void close() {
-		// we don't close the underlying stream
-	}
-
-	private int computeBlockSize(int blockIndex) {
-		if (blockIndex < blocks.length - 1)
-			return blockCapacity;
-		int blockSize = bufferSize % blockCapacity;
-		return blockSize == 0 ? blockCapacity : blockSize;
-	}
-
-	private int copyFromBuffer(char[] userBuffer, int userOffset, int needed) {
-		int copied = 0;
-		int current = offset / blockCapacity;
-		while ((needed - copied) > 0 && current < blocks.length) {
-			int blockSize = computeBlockSize(current);
-			int offsetInBlock = offset % blockCapacity;
-			int availableInBlock = blockSize - offsetInBlock;
-			int toCopy = Math.min(availableInBlock, needed - copied);
-			System.arraycopy(blocks[current], offsetInBlock, userBuffer, userOffset + copied, toCopy);
-			copied += toCopy;
-			current++;
-			offset += toCopy;
-		}
-		return copied;
-	}
-
-	private void ensureAvailable(long charsToRead) throws IOException {
-		int loadedBlockSize = blockCapacity;
-		while (bufferSize < offset + charsToRead && loadedBlockSize == blockCapacity) {
-			try {
-				loadedBlockSize = loadBlock();
-			} catch (IOException ioe) {
-				throw new LowLevelIOException(ioe);
-			}
-			bufferSize += loadedBlockSize;
-		}
-	}
-
-	// for testing purposes
-	protected int getBlockCount() {
-		return blocks.length;
-	}
-
-	// for testing purposes
-	protected int getBufferSize() {
-		return bufferSize;
-	}
-
-	// for testing purposes
-	protected int getMark() {
-		return mark;
-	}
-
-	// for testing purposes
-	protected int getOffset() {
-		return offset;
-	}
-
-	public boolean isText() {
-		return true;
-	}
-
-	private int loadBlock() throws IOException {
-		// read a block from the underlying stream
-		char[] newBlock = new char[blockCapacity];
-		int readCount = in.read(newBlock);
-		if (readCount == -1)
-			return 0;
-		// expand blocks array
-		char[][] tmpBlocks = new char[blocks.length + 1][];
-		System.arraycopy(blocks, 0, tmpBlocks, 0, blocks.length);
-		blocks = tmpBlocks;
-		blocks[blocks.length - 1] = newBlock;
-		return readCount;
-	}
-
-	public void mark(int readlimit) {
-		mark = offset;
-	}
-
-	public boolean markSupported() {
-		return true;
-	}
-
-	public int read() throws IOException {
-		ensureAvailable(1);
-		if (bufferSize <= offset)
-			return -1;
-		char nextChar = blocks[offset / blockCapacity][offset % blockCapacity];
-		offset++;
-		return nextChar;
-	}
-
-	public int read(char[] c) throws IOException {
-		return read(c, 0, c.length);
-	}
-
-	public int read(char[] c, int off, int len) throws IOException {
-		ensureAvailable(len);
-		int copied = copyFromBuffer(c, off, len);
-		return copied == 0 ? -1 : copied;
-	}
-
-	public boolean ready() throws IOException {
-		try {
-			return (bufferSize - offset) > 0 || in.ready();
-		} catch (IOException ioe) {
-			throw new LowLevelIOException(ioe);
-		}
-	}
-
-	public void reset() {
-		offset = mark;
-	}
-
-	public void rewind() {
-		mark = 0;
-		offset = 0;
-	}
-
-	public long skip(long toSkip) throws IOException {
-		if (toSkip <= 0)
-			return 0;
-		ensureAvailable(toSkip);
-		long skipped = Math.min(toSkip, bufferSize - offset);
-		offset += skipped;
-		return skipped;
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/LowLevelIOException.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/LowLevelIOException.java
deleted file mode 100644
index 03f5430..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/LowLevelIOException.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.content;
-
-import java.io.IOException;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A wrapper for IOExceptions, throw by LazyInputStream/Reader. 
- * Its purpose is to allow one to differentiate
- * between IOExceptions thrown by the base stream/reader from those 
- * thrown by streams/readers built on top of LazyInputStream/Reader.
- * 
- * @see LazyInputStream
- * @see LazyReader
- */
-/* package */class LowLevelIOException extends IOException {
-
-	/**
-	 * All serializable objects should have a stable serialVersionUID
-	 */
-	private static final long serialVersionUID = 1L;
-
-	private IOException actual;
-
-	public LowLevelIOException(IOException actual) {
-		// ensure we don't wrap more than once 
-		Assert.isLegal(!(actual instanceof LowLevelIOException));
-		this.actual = actual;
-	}
-
-	public IOException getActualException() {
-		return actual;
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/TextContentDescriber.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/TextContentDescriber.java
deleted file mode 100644
index bcdf683..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/TextContentDescriber.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.content;
-
-import java.io.*;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.ITextContentDescriber;
-
-/**
- * This class provides internal basis for text-based content describers. 
- * 
- * <p>
- * Note: do not add protected/public members to this class if you don't intend to 
- * make them public API.
- * </p>  
- * 
- * @see org.eclipse.core.runtime.content.XMLRootElementContentDescriber
- * @since 3.0
- */
-public class TextContentDescriber implements ITextContentDescriber {
-
-	private final static QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.BYTE_ORDER_MARK};
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.runtime.content.ITextContentDescriber#describe(java.io.Reader, org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(Reader contents, IContentDescription description) throws IOException {
-		// we want to be pretty loose on detecting the text content type  
-		return INDETERMINATE;
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#describe(java.io.InputStream, org.eclipse.core.runtime.content.IContentDescription)
-	 */
-	public int describe(InputStream contents, IContentDescription description) throws IOException {
-		if (description == null || !description.isRequested(IContentDescription.BYTE_ORDER_MARK))
-			return INDETERMINATE;
-		byte[] bom = getByteOrderMark(contents);
-		if (bom != null)
-			description.setProperty(IContentDescription.BYTE_ORDER_MARK, bom);
-		// we want to be pretty loose on detecting the text content type  		
-		return INDETERMINATE;
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.runtime.content.IContentDescriber#getSupportedOptions()
-	 */
-	public QualifiedName[] getSupportedOptions() {
-		return SUPPORTED_OPTIONS;
-	}
-
-	byte[] getByteOrderMark(InputStream input) throws IOException {
-		int first = (input.read() & 0xFF);//converts unsigned byte to int
-		int second = (input.read() & 0xFF);
-		if (first == -1 || second == -1)
-			return null;
-		//look for the UTF-16 Byte Order Mark (BOM)
-		if (first == 0xFE && second == 0xFF)
-			return IContentDescription.BOM_UTF_16BE;
-		if (first == 0xFF && second == 0xFE)
-			return IContentDescription.BOM_UTF_16LE;
-		int third = (input.read() & 0xFF);
-		if (third == -1)
-			return null;
-		//look for the UTF-8 BOM
-		if (first == 0xEF && second == 0xBB && third == 0xBF)
-			return IContentDescription.BOM_UTF_8;
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/Util.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/Util.java
deleted file mode 100644
index 22a9268..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/Util.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.util.*;
-
-public class Util {
-	public static String[] parseItems(String string) {
-		return parseItems(string, ","); //$NON-NLS-1$
-	}
-
-	public static String[] parseItems(String string, String separator) {
-		if (string == null)
-			return new String[0];
-		StringTokenizer tokenizer = new StringTokenizer(string, separator, true);
-		if (!tokenizer.hasMoreTokens())
-			return new String[] {string.trim()};
-		String first = tokenizer.nextToken().trim();
-		boolean wasSeparator = false;
-		if (first.equals(separator)) {
-			// leading separator
-			first = ""; //$NON-NLS-1$
-			wasSeparator = true;
-		}
-		// simple cases, do not create temporary list
-		if (!tokenizer.hasMoreTokens())
-			return wasSeparator ? /* two empty strings */new String[] {first, first} : /*single non-empty element  */new String[] {first};
-		ArrayList items = new ArrayList();
-		items.add(first);
-		String current;
-		do {
-			current = tokenizer.nextToken().trim();
-			boolean isSeparator = current.equals(separator);
-			if (isSeparator) {
-				if (wasSeparator)
-					items.add(""); //$NON-NLS-1$
-			} else
-				items.add(current);
-			wasSeparator = isSeparator;
-		} while (tokenizer.hasMoreTokens());
-		if (wasSeparator)
-			// trailing separator
-			items.add(""); //$NON-NLS-1$
-		return (String[]) items.toArray(new String[items.size()]);
-	}
-
-	public static List parseItemsIntoList(String string) {
-		return parseItemsIntoList(string, ","); //$NON-NLS-1$
-	}
-
-	public static List parseItemsIntoList(String string, String separator) {
-		List items = new ArrayList(5);
-		if (string == null)
-			return items;
-		StringTokenizer tokenizer = new StringTokenizer(string, separator, true);
-		if (!tokenizer.hasMoreTokens()) {
-			items.add(string.trim());
-			return items;
-		}
-		String first = tokenizer.nextToken().trim();
-		boolean wasSeparator = false;
-		if (first.equals(separator)) {
-			// leading separator
-			first = ""; //$NON-NLS-1$
-			wasSeparator = true;
-		}
-		items.add(first);
-		if (!tokenizer.hasMoreTokens())
-			return items;
-		String current;
-		do {
-			current = tokenizer.nextToken().trim();
-			boolean isSeparator = current.equals(separator);
-			if (isSeparator) {
-				if (wasSeparator)
-					items.add(""); //$NON-NLS-1$
-			} else
-				items.add(current);
-			wasSeparator = isSeparator;
-		} while (tokenizer.hasMoreTokens());
-		if (wasSeparator)
-			// trailing separator
-			items.add(""); //$NON-NLS-1$	
-		return items;
-	}
-
-	public static String toListString(Object[] list) {
-		return toListString(list, ","); //$NON-NLS-1$
-	}
-
-	public static String toListString(Object[] list, String separator) {
-		if (list == null || list.length == 0)
-			return null;
-		StringBuffer result = new StringBuffer();
-		for (int i = 0; i < list.length; i++) {
-			result.append(list[i]);
-			result.append(separator);
-		}
-		// ignore last comma
-		return result.substring(0, result.length() - 1);
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/XMLContentDescriber.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/XMLContentDescriber.java
deleted file mode 100644
index 3717afa..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/XMLContentDescriber.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.io.*;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.ITextContentDescriber;
-
-/**
- * A content interpreter for XML files. 
- * This class provides internal basis for XML-based content describers.
- * <p>
- * Note: do not add protected/public members to this class if you don't intend to 
- * make them public API.
- * </p>
- *
- * @see org.eclipse.core.runtime.content.XMLRootElementContentDescriber 
- * @see "http://www.w3.org/TR/REC-xml *"
- */
-public class XMLContentDescriber extends TextContentDescriber implements ITextContentDescriber {
-	private static final QualifiedName[] SUPPORTED_OPTIONS = new QualifiedName[] {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK};
-	private static final String ENCODING = "encoding="; //$NON-NLS-1$
-	private static final String XML_PREFIX = "<?xml "; //$NON-NLS-1$
-
-	public int describe(InputStream input, IContentDescription description) throws IOException {
-		byte[] bom = getByteOrderMark(input);
-		String xmlDeclEncoding = "UTF-8"; //$NON-NLS-1$
-		input.reset();
-		if (bom != null) {
-			if (bom == IContentDescription.BOM_UTF_16BE)
-				xmlDeclEncoding = "UTF-16BE"; //$NON-NLS-1$
-			else if (bom == IContentDescription.BOM_UTF_16LE)
-				xmlDeclEncoding = "UTF-16LE"; //$NON-NLS-1$
-			// skip BOM to make comparison simpler
-			input.skip(bom.length);
-			// set the BOM in the description if requested
-			if (description != null && description.isRequested(IContentDescription.BYTE_ORDER_MARK))
-				description.setProperty(IContentDescription.BYTE_ORDER_MARK, bom);
-		}
-		byte[] xmlPrefixBytes = XML_PREFIX.getBytes(xmlDeclEncoding);
-		byte[] prefix = new byte[xmlPrefixBytes.length];
-		if (input.read(prefix) < prefix.length)
-			// there is not enough info to say anything
-			return INDETERMINATE;
-		for (int i = 0; i < prefix.length; i++)
-			if (prefix[i] != xmlPrefixBytes[i])
-				// we don't have a XMLDecl... there is not enough info to say anything
-				return INDETERMINATE;
-		if (description == null)
-			return VALID;
-		// describe charset if requested
-		if (description.isRequested(IContentDescription.CHARSET)) {
-			String fullXMLDecl = readFullXMLDecl(input, xmlDeclEncoding);
-			if (fullXMLDecl != null) {
-				String charset = getCharset(fullXMLDecl);
-				if (charset != null && !"UTF-8".equalsIgnoreCase(charset)) //$NON-NLS-1$
-					// only set property if value is not default (avoid using a non-default content description)
-					description.setProperty(IContentDescription.CHARSET, getCharset(fullXMLDecl));
-			}
-		}
-		return VALID;
-	}
-
-	private String readFullXMLDecl(InputStream input, String unicodeEncoding) throws IOException {
-		byte[] xmlDecl = new byte[100];
-		int c = 0;
-		// looks for XMLDecl ending char (?)
-		int read = 0;
-		while (read < xmlDecl.length && (c = input.read()) != -1 && c != '?')
-			xmlDecl[read++] = (byte) c;
-		return c == '?' ? new String(xmlDecl, 0, read, unicodeEncoding) : null;
-	}
-
-	public int describe(Reader input, IContentDescription description) throws IOException {
-		BufferedReader reader = new BufferedReader(input);
-		String line = reader.readLine();
-		// end of stream
-		if (line == null)
-			return INDETERMINATE;
-		// XMLDecl should be the first string (no blanks allowed)
-		if (!line.startsWith(XML_PREFIX))
-			return INDETERMINATE;
-		if (description == null)
-			return VALID;
-		// describe charset if requested
-		if ((description.isRequested(IContentDescription.CHARSET)))
-			description.setProperty(IContentDescription.CHARSET, getCharset(line));
-		return VALID;
-	}
-
-	private String getCharset(String firstLine) {
-		int encodingPos = firstLine.indexOf(ENCODING);
-		if (encodingPos == -1)
-			return null;
-		char quoteChar = '"';
-		int firstQuote = firstLine.indexOf(quoteChar, encodingPos);
-		if (firstQuote == -1) {
-			quoteChar = '\'';
-			firstQuote = firstLine.indexOf(quoteChar, encodingPos);
-		}
-		if (firstQuote == -1 || firstLine.length() == firstQuote - 1)
-			return null;
-		int secondQuote = firstLine.indexOf(quoteChar, firstQuote + 1);
-		if (secondQuote == -1)
-			return null;
-		return firstLine.substring(firstQuote + 1, secondQuote);
-	}
-
-	public QualifiedName[] getSupportedOptions() {
-		return SUPPORTED_OPTIONS;
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/XMLRootHandler.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/XMLRootHandler.java
deleted file mode 100644
index 5a2babb..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/XMLRootHandler.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.content;
-
-import java.io.IOException;
-import java.io.StringReader;
-import javax.xml.parsers.*;
-import org.xml.sax.*;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * A content describer for detecting the name of the top-level element of the
- * DTD system identifier in an XML file. This supports two parameters:
- * <code>DTD_TO_FIND</code> and <code>ELEMENT_TO_FIND</code>. This is done
- * using the <code>IExecutableExtension</code> mechanism. If the
- * <code>":-"</code> method is used, then the value is treated as the
- * <code>ELEMENT_TO_FIND</code>.
- * 
- * @since 3.0
- */
-public final class XMLRootHandler extends DefaultHandler implements LexicalHandler {
-	/**
-	 * An exception indicating that the parsing should stop. This is usually
-	 * triggered when the top-level element has been found.
-	 * 
-	 * @since 3.0
-	 */
-	private class StopParsingException extends SAXException {
-		/**
-		 * All serializable objects should have a stable serialVersionUID
-		 */
-		private static final long serialVersionUID = 1L;
-
-		/**
-		 * Constructs an instance of <code>StopParsingException</code> with a
-		 * <code>null</code> detail message.
-		 */
-		public StopParsingException() {
-			super((String) null);
-		}
-	}
-
-	/**
-	 * Should we check the root element?
-	 */
-	private boolean checkRoot;
-	/**
-	 * The system identifier for the DTD that was found while parsing the XML.
-	 * This member variable is <code>null</code> unless the file has been
-	 * parsed successful to the point of finding the DTD's system identifier.
-	 */
-	private String dtdFound = null;
-	/**
-	 * This is the name of the top-level element found in the XML file. This
-	 * member variable is <code>null</code> unless the file has been parsed
-	 * successful to the point of finding the top-level element.
-	 */
-	private String elementFound = null;
-
-	public XMLRootHandler(boolean checkRoot) {
-		this.checkRoot = checkRoot;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.xml.sax.ext.LexicalHandler#comment(char[], int, int)
-	 */
-	public final void comment(final char[] ch, final int start, final int length) {
-		// Not interested.
-	}
-
-	/**
-	 * Creates a new SAX parser for use within this instance.
-	 * 
-	 * @return The newly created parser.
-	 * 
-	 * @throws ParserConfigurationException
-	 *             If a parser of the given configuration cannot be created.
-	 * @throws SAXException
-	 *             If something in general goes wrong when creating the parser.
-	 * @throws SAXNotRecognizedException
-	 *             If the <code>XMLReader</code> does not recognize the
-	 *             lexical handler configuration option.
-	 * @throws SAXNotSupportedException
-	 *             If the <code>XMLReader</code> does not support the lexical
-	 *             handler configuration option.
-	 */
-	private final SAXParser createParser(SAXParserFactory parserFactory) throws ParserConfigurationException, SAXException, SAXNotRecognizedException, SAXNotSupportedException {
-		// Initialize the parser.
-		final SAXParser parser = parserFactory.newSAXParser();
-		final XMLReader reader = parser.getXMLReader();
-		reader.setProperty("http://xml.org/sax/properties/lexical-handler", this); //$NON-NLS-1$
-		// disable DTD validation (bug 63625)
-		try {
-			//	be sure validation is "off" or the feature to ignore DTD's will not apply
-			reader.setFeature("http://xml.org/sax/features/validation", false); //$NON-NLS-1$
-			reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); //$NON-NLS-1$
-		} catch (SAXNotRecognizedException e) {
-			// not a big deal if the parser does not recognize the features
-		} catch (SAXNotSupportedException e) {
-			// not a big deal if the parser does not support the features
-		}
-		return parser;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.xml.sax.ext.LexicalHandler#endCDATA()
-	 */
-	public final void endCDATA() {
-		// Not interested.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.xml.sax.ext.LexicalHandler#endDTD()
-	 */
-	public final void endDTD() {
-		// Not interested.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.xml.sax.ext.LexicalHandler#endEntity(java.lang.String)
-	 */
-	public final void endEntity(final String name) {
-		// Not interested.
-	}
-
-	public String getDTD() {
-		return dtdFound;
-	}
-
-	public String getRootName() {
-		return elementFound;
-	}
-
-	public boolean parseContents(InputSource contents) throws IOException, ParserConfigurationException, SAXException {
-		// Parse the file into we have what we need (or an error occurs).
-		try {
-			SAXParserFactory factory = ContentOSGiUtils.getDefault().getFactory();
-			if (factory == null)
-				return false;
-			final SAXParser parser = createParser(factory);
-			// to support external entities specified as relative URIs (see bug 63298)
-			contents.setSystemId("/"); //$NON-NLS-1$
-			parser.parse(contents, this);
-		} catch (StopParsingException e) {
-			// Abort the parsing normally. Fall through...
-		}
-		return true;
-	}
-
-	/*
-	 * Resolve external entity definitions to an empty string.  This is to speed
-	 * up processing of files with external DTDs.  Not resolving the contents 
-	 * of the DTD is ok, as only the System ID of the DTD declaration is used.
-	 * @see org.xml.sax.helpers.DefaultHandler#resolveEntity(java.lang.String, java.lang.String)
-	 */
-	public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
-		return new InputSource(new StringReader("")); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.xml.sax.ext.LexicalHandler#startCDATA()
-	 */
-	public final void startCDATA() {
-		// Not interested.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.xml.sax.ext.LexicalHandler#startDTD(java.lang.String,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public final void startDTD(final String name, final String publicId, final String systemId) throws SAXException {
-		dtdFound = systemId;
-		// If we don't care about the top-level element, we can stop here.
-		if (!checkRoot)
-			throw new StopParsingException();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.xml.sax.ContentHandler#startElement(java.lang.String,
-	 *      java.lang.String, java.lang.String, org.xml.sax.Attributes)
-	 */
-	public final void startElement(final String uri, final String elementName, final String qualifiedName, final Attributes attributes) throws SAXException {
-		elementFound = elementName;
-		throw new StopParsingException();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.xml.sax.ext.LexicalHandler#startEntity(java.lang.String)
-	 */
-	public final void startEntity(final String name) {
-		// Not interested.
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/messages.properties b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/messages.properties
deleted file mode 100644
index 6e3bba2..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/internal/content/messages.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-### Content type manager
-content_badInitializationData = Invalid initialization data for \"{0}\".
-content_errorReadingContents = Error reading contents using content type: {0}.
-content_errorSavingSettings = Failed saving settings for content type {0}.
-content_errorLoadingSettings = Failed loading content type settings.
-content_invalidContentDescriber = Could not create content describer for {0}. Content type has been disabled.
-content_invalidProperty = Ignored invalid property \"{0}\" for content type {1}.
-content_missingIdentifier = Content type {0} has no identifier. Content type has been disabled.
-content_missingName = Content type {0} has no name. Content type has been disabled.
-content_parserConfiguration = XML parser configuration error during content description.
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/BinarySignatureDescriber.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/BinarySignatureDescriber.java
deleted file mode 100644
index ea7142b..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/BinarySignatureDescriber.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.content;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-import org.eclipse.core.internal.content.ContentMessages;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * A content describer for binary formats that present some 
- * simple signature at a known, fixed offset.
- * <p>
- * This executable extension supports three parameters:
- * "signature", "offset" and "required", the first one being mandatory. 
- * If the
- * <code>":-"</code> method is used, then the value is treated as the
- * "signature".
- * </p> 
- * <p>
- * The "signature" parameter is a sequence of hex codes, one for each byte in 
- * the signature. For example, "CA FE BA BE" would be a signature for Java
- * class files.
- * </p>
- * <p>
- * The "offset" parameter is an integer indicating the offset where the 
- * signature's first byte is found. 
- * </p>
- * <p>
- * The "required" parameter is a boolean (default is " true") indicating whether 
- * the absence of a signature should deem the contents validity status as 
- * IContentDescriber.INVALID or IContentDescriber.INDETERMINATE.  
- * </p>
- * <p>
- * This class is not intended to be subclassed or instantiated by clients, 
- * only to be referenced by the "describer" configuration element in
- * extensions to the <code>org.eclipse.core.runtime.contentTypes</code>
- * extension point.
- * </p>
- * 
- * @since 3.0
- */
-public final class BinarySignatureDescriber implements IContentDescriber, IExecutableExtension {
-	private final static String SIGNATURE = "signature"; //$NON-NLS-1$
-	private final static String OFFSET = "offset"; //$NON-NLS-1$
-	private static final Object REQUIRED = "required"; //$NON-NLS-1$
-	private byte[] signature;
-	private int offset;
-	private boolean required = true;
-
-	/* (Intentionally not included in javadoc)
-	 * @see IContentDescriber#describe(InputStream, IContentDescription)
-	 */
-	public int describe(InputStream contents, IContentDescription description) throws IOException {
-		byte[] buffer = new byte[signature.length];
-		int notValid = required ? INVALID : INDETERMINATE;
-		if (contents.skip(offset) < offset)
-			return notValid;
-		if (contents.read(buffer) != buffer.length)
-			return notValid;
-		for (int i = 0; i < signature.length; i++)
-			if (signature[i] != buffer[i])
-				return notValid;
-		return VALID;
-	}
-
-	/* (Intentionally not included in javadoc)
-	 * @see IContentDescriber#getSupportedOptions
-	 */
-	public QualifiedName[] getSupportedOptions() {
-		return new QualifiedName[0];
-	}
-
-	/* (Intentionally not included in javadoc)
-	 * @see IExecutableExtension#setInitializationData
-	 */
-	public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
-		try {
-			if (data instanceof String)
-				signature = parseSignature((String) data);
-			else if (data instanceof Hashtable) {
-				Hashtable parameters = (Hashtable) data;
-				if (!parameters.containsKey(SIGNATURE)) {
-					String message = NLS.bind(ContentMessages.content_badInitializationData, XMLRootElementContentDescriber.class.getName());
-					throw new CoreException(new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, null));
-				}
-				signature = parseSignature((String) parameters.get(SIGNATURE));
-				if (parameters.containsKey(OFFSET))
-					offset = Integer.parseInt((String) parameters.get(OFFSET));
-				if (parameters.containsKey(REQUIRED))
-					required = Boolean.valueOf((String) parameters.get(REQUIRED)).booleanValue();
-			}
-		} catch (NumberFormatException nfe) {
-			String message = NLS.bind(ContentMessages.content_badInitializationData, BinarySignatureDescriber.class.getName());
-			throw new CoreException(new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, nfe));
-		}
-	}
-
-	private static byte[] parseSignature(String data) {
-		List bytes = new ArrayList();
-		StringTokenizer tokenizer = new StringTokenizer(data, " \t\n\r\f,"); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens())
-			bytes.add(new Byte((byte) Integer.parseInt(tokenizer.nextToken().trim(), 16)));
-		byte[] signature = new byte[bytes.size()];
-		for (int i = 0; i < signature.length; i++)
-			signature[i] = ((Byte) bytes.get(i)).byteValue();
-		return signature;
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentDescriber.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentDescriber.java
deleted file mode 100644
index 4e13faa..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentDescriber.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.content;
-
-import java.io.IOException;
-import java.io.InputStream;
-import org.eclipse.core.runtime.QualifiedName;
-
-/**
- * Content describers know how to retrieve metadata from 
- * contents.
- * <p>
- * Note: It is expected that content describer implementations be declared in a package 
- * that is exempt from plug-in activation (using the Eclipse-AutoStart bundle 
- * manifest header). Since all describers are instantiated when the content type 
- * framework is initialized, failure in complying with this requirement causes 
- * premature activation, which must be avoided. Future implementations of the 
- * framework might refuse to instantiate describers if doing so would trigger 
- * activation of the corresponding plug-in.
- * </p>
- * <p>
- * Describers for text-based content types should implement 
- * <code>ITextContentDescriber</code> instead.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
-
- * @see IContentDescription
- * @since 3.0
- */
-public interface IContentDescriber {
-	/**
-	 * Description result constant, indicating that it was not possible 
-	 * to determine whether the contents were valid for 
-	 * the intended content type.
-	 * 
-	 * @see #describe
-	 */
-	public final static int INDETERMINATE = 1;
-	/**
-	 * Description result constant, indicating the contents are invalid for 
-	 * the intended content type.
-	 * 
-	 * @see #describe
-	 */
-	public final static int INVALID = 0;
-	/**
-	 * Description result constant, indicating the contents are valid for 
-	 * the intended content type.
-	 * 
-	 * @see #describe
-	 */
-	public final static int VALID = 2;
-
-	/**
-	 * Tries to fill a description for the given contents. Returns 
-	 * an <code>int</code> indicating whether the given stream of 
-	 * bytes represents a valid sample for its corresponding content type.
-	 * If no content description is provided, this method should perform 
-	 * content type validation.
-	 * <p>
-	 * The input stream must be kept open, and any IOExceptions while 
-	 * reading the stream should flow to the caller.
-	 * </p>
-	 * 
-	 * @param contents the contents to be examined
-	 * @param description a description to be filled in, or <code>null</code> if 
-	 * only content type validation is to be performed  
-	 * @return one of the following:<ul>
-	 * <li><code>VALID</code></li>,
-	 * <li><code>INVALID</code></li>,
-	 * <li><code>INDETERMINATE</code></li>
-	 * </ul>
-	 * @throws IOException if an I/O error occurs
-	 * @see IContentDescription
-	 * @see #VALID
-	 * @see #INVALID
-	 * @see #INDETERMINATE
-	 */
-	public int describe(InputStream contents, IContentDescription description) throws IOException;
-
-	/**
-	 * Returns the properties supported by this describer. 
-	 *   
-	 * @return the supported properties
-	 * @see #describe
-	 */
-	public QualifiedName[] getSupportedOptions();
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentDescription.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentDescription.java
deleted file mode 100644
index 84c9ea0..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentDescription.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.content;
-
-import org.eclipse.core.internal.content.IContentConstants;
-import org.eclipse.core.runtime.QualifiedName;
-
-/**
- * A content description object contains information about the nature of 
- * arbitrary data.
- * <p>
- * A content description object will always include the content type for the 
- * examined contents, and may also include information on:
- * <ol>
- * <li>charset;</li>
- * <li>byte order mark;</li>
- * <li>other custom properties provided by third-party plug-ins.</li>
- * </ol>
- * </p>
- * <p>
- * <cite>Content describers</cite> provided by plug-ins will fill in most of the
- * properties in a content description object, except for the content type, 
- * what is done by the platform. After a content 
- * description is filled in by a content interpreter, it is marked as immutable
- * by the platform, so calling any of the mutator methods defined in this 
- * interface will cause an <code>IllegalStateException</code> to be thrown.  
- * </p>  
- * <p>
- * Default values for properties can be contributed by plug-ins as part of
- * the content type definition markup.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see IContentDescriber  
- * @since 3.0 
- */
-public interface IContentDescription {
-	/**
-	 * Key for the "charset" property.
-	 */
-	public final static QualifiedName CHARSET = new QualifiedName(IContentConstants.RUNTIME_NAME, "charset"); //$NON-NLS-1$
-	/**
-	 * Key for the "byte order mark" property. This property is only meaningful 
-	 * when describing byte streams.  
-	 */
-	public final static QualifiedName BYTE_ORDER_MARK = new QualifiedName(IContentConstants.RUNTIME_NAME, "bom"); //$NON-NLS-1$
-	/**
-	 * Options constant meaning that all properties should be described. 
-	 */
-	public final static QualifiedName[] ALL = null;
-	/**
-	 * Constant that identifies the Byte-Order-Mark for contents encoded with 
-	 * the UTF-8 character encoding scheme. 
-	 */
-	public final static byte[] BOM_UTF_8 = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};
-	/**
-	 * Constant that identifies the Byte-Order-Mark for contents encoded with 
-	 * the UTF-16 Big Endian character encoding scheme. 
-	 */
-	public final static byte[] BOM_UTF_16BE = {(byte) 0xFE, (byte) 0xFF};
-	/**
-	 * Constant that identifies the Byte-Order-Mark for contents encoded with 
-	 * the UTF-16 Little Endian character encoding scheme. 
-	 */
-	public final static byte[] BOM_UTF_16LE = {(byte) 0xFF, (byte) 0xFE};
-
-	/**
-	 * Returns whether the given property is requested to be described. This 
-	 * method is intended to allow content describers to determine  which
-	 * properties should be described.
-	 *  
-	 * @param key a key for the property to be verified 
-	 * @return <code>true</code> if the property is to be described, 
-	 * <code>false</code> otherwise
-	 */
-	public boolean isRequested(QualifiedName key);
-
-	/**
-	 * Returns the charset name to be used when reading the contents
-	 * described by this object. 
-	 * <p>
-	 * If a Unicode byte order mark has been found (the 
-	 * <code>BYTE_ORDER_MARK</code> property has been set), 
-	 * a corresponding charset name will be returned (e.g. "UTF-8", 
-	 * "UTF-16"). Otherwise, the value of the <code>CHARSET</code> 
-	 * property will be returned.   
-	 * </p>
-	 * @return a charset name, or <code>null</code>
-	 */
-	public String getCharset();
-
-	/**
-	 * Returns the content type detected. Returns <code>null</code> if the 
-	 * content type could not be determined.
-	 *   
-	 * @return the corresponding content type, or <code>null</code>
-	 */
-	public IContentType getContentType();
-
-	/**
-	 * Returns the value of custom property set by the content describer,
-	 * or the default value for the property, if one has been defined.
-	 * <p>
-	 * The qualifier part of the property name must be the unique identifier
-	 * of the declaring plug-in (e.g. <code>"com.example.plugin"</code>).
-	 * </p>
-	 * 
-	 * @param key the property key
-	 * @return the property value, or <code>null</code>, if the property is not
-	 * found   
-	 */
-	public Object getProperty(QualifiedName key);
-
-	/**
-	 * Sets the given property to the given value. 
-	 * <p>
-	 * The qualifier part of the property name must be the unique identifier
-	 * of the declaring plug-in (e.g. <code>"com.example.plugin"</code>).
-	 * </p>
-	 * <p>
-	 * This method should not be called by clients other than content 
-	 * describers. An attempt to set a property from other contexts will cause
-	 * an <code>IllegalStateException</code> to be thrown. 
-	 * </p>
-	 * 
-	 * @param key the qualified name of the property 
-	 * @param value the property value, or <code>null</code>,
-	 * if the property is to be removed
-	 * @throws IllegalStateException if called after this description has been
-	 * filled in
-	 */
-	public void setProperty(QualifiedName key, Object value);
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentType.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentType.java
deleted file mode 100644
index 55cacaf..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentType.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.content;
-
-import java.io.*;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-
-/**
- * Content types represent and provide information on file types, such as 
- * associated file names/extensions, default charset, etc.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p> 
- * 
- * @since 3.0
- */
-public interface IContentType extends IContentTypeSettings {
-	/**
-	 * File spec type flag constant, indicating that pre-defined file 
-	 * specifications should not be taken into account.
-	 */
-	public static final int IGNORE_PRE_DEFINED = 0x01;
-	/**
-	 * File spec type flag constant, indicating that user-defined file 
-	 * specifications should not be taken into account.
-	 */
-	public static final int IGNORE_USER_DEFINED = 0x02;
-	/**
-	 * File spec type constant, indicating a file name specification.
-	 */
-	public static final int FILE_NAME_SPEC = 0x04;
-	/**
-	 * File spec type constant, indicating a file extension specification.
-	 */
-	public static final int FILE_EXTENSION_SPEC = 0x08;
-
-	/**
-	 * Returns a reference to this content type's base type. If this content type
-	 * does not have a base type (it is a root type), returns <code>null</code>.
-	 * 
-	 * @return this content type's base type, or <code>null</code>
-	 */
-	public IContentType getBaseType();
-
-	/**
-	 * Returns the default content description for this content type. A default 
-	 * content description is returned by the content type API whenever 
-	 * content analysis could not find any particular information to be described
-	 * about the contents being processed, so all default attributes for the 
-	 * content type in question apply.
-	 * <p>
-	 * Clients doing caching of content descriptions may choose to treat default 
-	 * descriptions in a special manner, since they are easily recoverable 
-	 * through this API.
-	 * </p>  
-	 * 
-	 *  @return a content description
-	 *  @since 3.1
-	 */
-	public IContentDescription getDefaultDescription();
-
-	/**
-	 * Tries to obtain a description for the given contents. 
-	 * <p>
-	 * Any IOExceptions that may occur while reading the given input stream 
-	 * will flow to the caller.  The input stream will not be closed by this 
-	 * operation.
-	 * </p>
-	 *  
-	 * @param contents the contents to be interpreted
-	 * @param options an array of keys for all properties that should be described
-	 * @return a content description if one could be obtained, or 
-	 * <code>null</code>
-	 * @throws IOException if an error occurs while reading the contents
-	 * @see IContentDescription  
-	 */
-	public IContentDescription getDescriptionFor(InputStream contents, QualifiedName[] options) throws IOException;
-
-	/**
-	 * Tries to obtain a description for the given contents. 
-	 * <p>
-	 * Any IOExceptions that may occur while reading the given reader 
-	 * will flow to the caller.  The reader will not be closed by this 
-	 * operation.
-	 * </p>
-	 *  
-	 * @param contents the contents to be interpreted
-	 * @param options an array of keys for all properties that should be described
-	 * @return a content description if one could be obtained, or 
-	 * <code>null</code>
-	 * @throws UnsupportedOperationException if this content type
-	 * has a describer that does not implement 
-	 * <code>ITextContentDescriber</code>
-	 * @throws IOException if an error occurs while reading the contents 
-	 * @see IContentDescription
-	 */
-	public IContentDescription getDescriptionFor(Reader contents, QualifiedName[] options) throws IOException;
-
-	/**
-	 * Returns the default charset for this content type if one has been defined, 
-	 * <code>null</code> otherwise.
-	 * This refinement of the corresponding <code>IContentTypeSettings</code>
-	 * method also takes into account the charset defined by the content type
-	 * provider (or its base content type).
-	 * 
-	 * @return the default charset, or <code>null</code>
-	 */
-	public String getDefaultCharset();
-
-	/**
-	 * Returns file specifications from this content type. The type mask 
-	 * is a bit-wise or of file specification type constants indicating the 
-	 * file specification types of interest. 
-	 * This refinement of the corresponding <code>IContentTypeSettings</code>
-	 * method supports additional flags because it also takes into account the 
-	 * file specifications defined by the content type provider (or its base 
-	 * content type).
-	 * 
-	 * @param type a bit-wise or of file specification type constants. Valid
-	 * flags are:
-	 *<ul>
-	 *<li>one of <code>FILE_EXTENSION_SPEC</code> or 
-	 *<code>FILE_NAME_SPEC</code></li>
-	 *<li>and optionally, one of <code>IGNORE_PRE_DEFINED</code>
-	 *or <code>IGNORE_USER_DEFINED</code></li>
-	 *</ul>
-	 * @return the file specification
-	 * @see #FILE_NAME_SPEC
-	 * @see #FILE_EXTENSION_SPEC
-	 * @see #IGNORE_PRE_DEFINED
-	 * @see #IGNORE_USER_DEFINED
-	 */
-	public String[] getFileSpecs(int type);
-
-	/**
-	 * Returns this content type's unique identifier. Each content type has an 
-	 * identifier by which they can be retrieved from the content type catalog.
-	 * 
-	 * @return this content type's unique identifier
-	 */
-	public String getId();
-
-	/**
-	 * Returns a user-friendly name for this content type.
-	 * 
-	 * @return this content type's name  
-	 */
-	public String getName();
-
-	/**
-	 * Returns whether this content type is associated with the 
-	 * given file name.
-	 * 
-	 * @param fileName the file name
-	 * @return <code>true</code> if this content type is associated with
-	 * the given file name, <code>false</code> otherwise
-	 * @see #isAssociatedWith(String, IScopeContext)
-	 */
-	public boolean isAssociatedWith(String fileName);
-
-	/**
-	 * Returns whether this content type is associated with the 
-	 * given file name in the given preference scope.
-	 * 
-	 * @param fileName the file name
-	 * @param context a preference scope context 
-	 * @return <code>true</code> if this content type is associated with
-	 * the given file name, <code>false</code> otherwise
-	 * @since 3.1
-	 */
-	public boolean isAssociatedWith(String fileName, IScopeContext context);
-
-	/**
-	 * Returns whether this content type is a kind of the given content 
-	 * type. A content type A is a kind of a content type B if:
-	 * <ol>
-	 * <li>A and B are the same content type, or</li> 
-	 * <li>A's base type is B, or</li>
-	 * <li>A's base type is a kind of B.</li>
-	 * </ol>
-	 * 
-	 * @param another a content type 
-	 * @return <code>true</code> if this content type is a kind of the
-	 * given content type, <code>false</code> otherwise
-	 */
-	public boolean isKindOf(IContentType another);
-
-	/**
-	 * Returns the settings for this content type in the given 
-	 * preference context.
-	 * 
-	 * @param context a preference scope context 
-	 * @return setting in the given context
-	 * @throws CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> An error occurred obtaining the settings.</li>
-	 * </ul> 
-	 * @since 3.1
-	 */
-	public IContentTypeSettings getSettings(IScopeContext context) throws CoreException;
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentTypeManager.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentTypeManager.java
deleted file mode 100644
index 425640e..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentTypeManager.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.content;
-
-import java.util.EventObject;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-
-/**
- * The content type manager provides facilities for file name and content-based
- * type lookup and content description.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see org.eclipse.core.runtime.content.IContentTypeMatcher
- * @see org.eclipse.core.runtime.Platform#getContentTypeManager()
- * @since 3.0
- */
-public interface IContentTypeManager extends IContentTypeMatcher {
-
-	/**
-	 * An event object which describes the details of a change to a 
-	 * content type. 
-	 * <p>
-	 * Types of changes include a change in the file associations or 
-	 * a change in the encoding setting.
-	 * </p>
-	 */
-	public final class ContentTypeChangeEvent extends EventObject {
-		/**
-		 * All serializable objects should have a stable serialVersionUID
-		 */
-		private static final long serialVersionUID = 1L;
-		/*
-		 * The context for the setting that changed.
-		 * 
-		 * @since 3.1
-		 */
-		private IScopeContext context;
-
-		/**
-		 * Constructor for a new content type change event.
-		 * 
-		 * @param source the content type that changed
-		 */
-		public ContentTypeChangeEvent(IContentType source) {
-			super(source);
-		}
-
-		/**
-		 * Constructor for a new content type change event.
-		 * 
-		 * @param source the content type that changed
-		 * @param context the context where a setting changed, or <code>null</code>
-		 * @since 3.1
-		 */
-		public ContentTypeChangeEvent(IContentType source, IScopeContext context) {
-			super(source);
-			this.context = context;
-		}
-
-		/**
-		 * Return the content type object associated with this change event.
-		 * 
-		 * @return the content type
-		 */
-		public IContentType getContentType() {
-			return (IContentType) source;
-		}
-
-		/**
-		 * Return the preference scope where the setting changed, or 
-		 * <code>null</code>, if the change happened in the content type manager 
-		 * default context. 
-		 * 
-		 * @return the context where the change happened, or <code>null</code>
-		 * @since 3.1
-		 */
-		public IScopeContext getContext() {
-			return context;
-		}
-	}
-
-	/**
-	 * A listener to be used to receive content type change events.
-	 * <p>
-	 * Clients who reference the <code>org.eclipse.core.resources</code>
-	 * bundle are encouraged <em>not</em> to use this listener mechanism to
-	 * detect encoding changes. The Core Resources bundle will 
-	 * detect changes to content types and notify clients appropriately
-	 * of potential changes to the encoding of files in the workspace 
-	 * via the resource change mechanism.
-	 * </p>
-	 * <p>
-	 * Clients may implement this interface.
-	 * </p>
-	 */
-	public interface IContentTypeChangeListener {
-
-		/**
-		 * Notification that a content type has changed in the content type manager.
-		 * The given event object contains the content type which changed and must not
-		 * be <code>null</code>.
-		 * 
-		 * @param event the content type change event
-		 */
-		public void contentTypeChanged(ContentTypeChangeEvent event);
-	}
-
-	/**
-	 * A policy for refining the set of content types that
-	 * should be accepted during content type matching operations.
-	 * <p>
-	 * Clients may implement this interface.
-	 * </p>
-	 * 
-	 * @see IContentTypeManager#getMatcher(IContentTypeManager.ISelectionPolicy, IScopeContext)
-	 * @since 3.1
-	 */
-	public interface ISelectionPolicy {
-		/**
-		 * Returns a subset of the given content types sorted by using a custom criterion.
-		 * <p>
-		 * The given array of content types has already been sorted using 
-		 * the platform rules. If this object follows the same rules, further sorting 
-		 * is not necessary.  
-		 * </p>
-		 * <p>
-		 * The type of matching being performed (name, contents or name + contents)
-		 * might affect the outcome for this method. For instance, for file name-only 
-		 * matching, the more general type could have higher priority. For content-based 
-		 * matching,  the more specific content type could be preferred instead.
-		 * </p>
-		 * 
-		 * @param candidates an array containing content types matching some query 
-		 * @param fileName whether it is a file name-based content type matching
-		 * @param content whether its a content-based content type matching
-		 * @return an array of content types
-		 */
-		IContentType[] select(IContentType[] candidates, boolean fileName, boolean content);
-	}
-
-	/**
-	 * Content type identifier constant for platform's primary 
-	 * text-based content type: <code>org.eclipse.core.runtime.text</code>. 
-	 * <p>
-	 * All text-based content types ought to be sub types of the content type 
-	 * identified by this string. This provides a simple way for detecting 
-	 * whether a content type is text-based:
-	 * <pre>
-	 * IContentType text = Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT);
-	 * IContentType someType = ...;
-	 * boolean isTextBased = someType.isKindOf(text);
-	 * </pre> 
-	 * </p>
-	 */
-	public final static String CT_TEXT = "org.eclipse.core.runtime.text"; //$NON-NLS-1$	
-
-	/**
-	 * Register the given listener for notification of content type changes.
-	 * Calling this method multiple times with the same listener has no effect. The
-	 * given listener argument must not be <code>null</code>.
-	 * 
-	 * @param listener the content type change listener to register
-	 * @see #removeContentTypeChangeListener(IContentTypeManager.IContentTypeChangeListener)
-	 * @see IContentTypeManager.IContentTypeChangeListener
-	 */
-	public void addContentTypeChangeListener(IContentTypeChangeListener listener);
-
-	/**
-	 * Returns all content types known by the platform. 
-	 * <p>
-	 * Returns an empty array if there are no content types available.
-	 * </p>
-	 * 
-	 * @return all content types known by the platform.
-	 */
-	public IContentType[] getAllContentTypes();
-
-	/**
-	 * Returns the content type with the given identifier, or <code>null</code>
-	 * if no such content type is known by the platform.
-	 * 
-	 * @param contentTypeIdentifier the identifier for the content type
-	 * @return the content type, or <code>null</code>
-	 */
-	public IContentType getContentType(String contentTypeIdentifier);
-
-	/**
-	 * Returns a newly created content type matcher using the given content type selection policy
-	 * and preference scope. If the preference scope is <code>null</code>, the default scope 
-	 * is used.
-	 * 
-	 * @param customPolicy a selection policy
-	 * @param context a user preference context to be used by the matcher, or <code>null</code>
-	 * @return a content type matcher that uses the given policy
-	 * @since 3.1 
-	 */
-	public IContentTypeMatcher getMatcher(ISelectionPolicy customPolicy, IScopeContext context);
-
-	/**
-	 * De-register the given listener from receiving notification of content type changes. 
-	 * Calling this method multiple times with the same listener has no
-	 * effect. The given listener argument must not be <code>null</code>.
-	 * 
-	 * @param listener the content type change listener to remove
-	 * @see #addContentTypeChangeListener(IContentTypeManager.IContentTypeChangeListener)
-	 * @see IContentTypeManager.IContentTypeChangeListener
-	 */
-	public void removeContentTypeChangeListener(IContentTypeChangeListener listener);
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentTypeMatcher.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentTypeMatcher.java
deleted file mode 100644
index 6d65274..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentTypeMatcher.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.content;
-
-import java.io.*;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-
-/**
- * An object that performs content type matching queries. 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see IContentTypeManager#getMatcher(IContentTypeManager.ISelectionPolicy, IScopeContext)
- * @since 3.1
- */
-public interface IContentTypeMatcher {
-	/**
-	 * Returns the preferred content type for the given contents and file name.
-	 * <p>
-	 * Returns <code>null</code> if no associated content types are 
-	 * found.
-	 * </p>
-	 * <p>
-	 * If a file name is not provided, the entire content type registry will be 
-	 * queried. For performance reasons, it is highly recomended 
-	 * to provide a file name if available.
-	 * </p> 
-	 * <p>
-	 * Any IOExceptions that may occur while reading the given input stream 
-	 * will flow to the caller. The input stream will not be closed by this 
-	 * operation.
-	 * </p> 
-	 * 
-	 * @param contents an input stream
-	 * @param fileName the file name associated to the contents, or <code>null</code> 
-	 * @return the preferred content type associated to the given file name, or <code>null</code>
-	 * @throws IOException if an error occurs while reading the contents 
-	 */
-	public IContentType findContentTypeFor(InputStream contents, String fileName) throws IOException;
-
-	/**
-	 * Returns the preferred content type for the given file name. If multiple content types 
-	 * are associated with the given file name, the one considered the most appropriated will
-	 * be returned. If there are no content types associated, <code>null</code> is returned.
-	 * 
-	 * @param fileName the name of the file
-	 * @return the preferred content type associated to the given file name, or <code>null</code>
-	 */
-	public IContentType findContentTypeFor(String fileName);
-
-	/**
-	 * Returns the content types associated to the given contents and file name.
-	 * <p>
-	 * Returns an empty array if no associated content types are found.
-	 * </p>
-	 * <p>
-	 * If a file name is not provided, the entire content type registry will be 
-	 * queried. For performance reasons, it is highly recomended 
-	 * to provide a file name if available.
-	 * </p>
-	 * <p>
-	 * Any IOExceptions that may occur while reading the given input stream 
-	 * will flow to the caller.  The input stream will not be closed by this 
-	 * operation.
-	 * </p> 
-	 * 
-	 * @param contents an input stream
-	 * @param fileName the file name associated to the contents, or <code>null</code> 
-	 * @return all content types associated to the given contents and file name
-	 * @throws IOException if an error occurs while reading the contents
-	 */
-	public IContentType[] findContentTypesFor(InputStream contents, String fileName) throws IOException;
-
-	/**
-	 * Returns all content types known by the platform that are associated to the given file name.
-	 * <p> 
-	 * Returns an empty array if there are no content types associated.
-	 * </p>
-	 * 
-	 * @param fileName the name of the file
-	 * @return all content types associated to the given file spec
-	 */
-	public IContentType[] findContentTypesFor(String fileName);
-
-	/**
-	 * Tries to obtain a description for the given contents and file name. 
-	 * <p>
-	 * Any IOExceptions that may occur while reading the given input stream 
-	 * will flow to the caller.  The input stream will not be closed by this 
-	 * operation.
-	 * </p>
-	 * <p>
-	 * If a file name is not provided, the entire content type registry will be 
-	 * queried. For performance reasons, it is highly recomended 
-	 * to provide a file name if available.
-	 * </p> 
-	 *  
-	 * @param contents the contents to be interpreted
-	 * @param fileName the file name associated to the contents, or <code>null</code>
-	 * @param options an array of keys for all properties that should be 
-	 * described, or <code>IContentDescription.ALL</code>,  for all of them 
-	 * @return a content description if one could be obtained, or <code>null</code>
-	 * @throws IOException if an error occurs while reading the contents
-	 * @see IContentDescription 
-	 */
-	public IContentDescription getDescriptionFor(InputStream contents, String fileName, QualifiedName[] options) throws IOException;
-
-	/**
-	 * Tries to obtain a description for the given contents and file name. 
-	 * <p>
-	 * Any IOExceptions that may occur while reading the given input stream 
-	 * will flow to the caller.  The reader will not be closed by this 
-	 * operation.
-	 * </p>
-	 * <p>
-	 * If a file name is not provided, the entire content type registry will be 
-	 * queried. For performance reasons, it is highly recomended 
-	 * to provide a file name if available.
-	 * </p> 
-	 *  
-	 * @param contents the contents to be interpreted
-	 * @param fileName the file name associated to the contents, or <code>null</code>
-	 * @param options an array of keys for all properties that should be 
-	 * described, or <code>IContentDescription.ALL</code>,  for all of them 
-	 * @return a content description if one could be obtained, or <code>null</code>
-	 * @throws IOException if an error occurs while reading the contents
-	 * @see IContentDescription 
-	 */
-	public IContentDescription getDescriptionFor(Reader contents, String fileName, QualifiedName[] options) throws IOException;
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentTypeSettings.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentTypeSettings.java
deleted file mode 100644
index c2d6502..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/IContentTypeSettings.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.content;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-
-/**
- * Gives access to the user settings for a content type.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see IContentType
- * @see IContentType#getSettings(IScopeContext)
- * @since 3.1
- */
-public interface IContentTypeSettings {
-	/**
-	 * File spec type constant, indicating a file extension specification.
-	 */
-	public static final int FILE_EXTENSION_SPEC = 0x08;
-	/**
-	 * File spec type constant, indicating a file name specification.
-	 */
-	public static final int FILE_NAME_SPEC = 0x04;
-
-	/**
-	 * Adds a user-defined file specification to the corresponding content type. Has no 
-	 * effect if the given file specification is already defined.
-	 * 
-	 * @param fileSpec the file specification
-	 * @param type the type of the file specification. One of 
-	 * <code>FILE_NAME_SPEC</code>, 
-	 * <code>FILE_EXTENSION_SPEC</code>.
-	 * @throws IllegalArgumentException if the type bit mask is  
-	 * incorrect
-	 * @throws CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> An error occurred persisting this setting.</li>
-	 * </ul>
-	 * @see #FILE_NAME_SPEC
-	 * @see #FILE_EXTENSION_SPEC	 
-	 */
-	public void addFileSpec(String fileSpec, int type) throws CoreException;
-
-	/**
-	 * Returns the default charset for the corresponding content type if 
-	 * it has been set, or  
-	 * <code>null</code> otherwise.
-	 * 
-	 * @return the default charset, or <code>null</code>
-	 */
-	public String getDefaultCharset();
-
-	/**
-	 * Returns the file specifications for the corresponding content type. The type mask 
-	 * is a bit-wise or of file specification type constants indicating the 
-	 * file specification types of interest.
-	 * 
-	 * @param type a bit-wise or of file specification type constants. Valid
-	 * flags are one of <code>FILE_EXTENSION_SPEC</code> or 
-	 *<code>FILE_NAME_SPEC</code>
-	 * @return the file specification
-	 * @see #FILE_NAME_SPEC
-	 * @see #FILE_EXTENSION_SPEC
-	 */
-	public String[] getFileSpecs(int type);
-
-	/**
-	 * Returns the corresponding content type's unique identifier. Each content 
-	 * type has an identifier by which they can be retrieved from the content 
-	 * type catalog.
-	 * 
-	 * @return the content type unique identifier
-	 */
-	public String getId();
-
-	/**
-	 * Removes a user-defined file specification from the corresponding content type. Has no 
-	 * effect if the given file specification was not defined by the user.
-	 * 
-	 * @param fileSpec the file specification
-	 * @param type the type of the file specification. One of 
-	 * <code>FILE_NAME_SPEC</code>, 
-	 * <code>FILE_EXTENSION_SPEC</code>.
-	 * @throws IllegalArgumentException if the type bit mask is  
-	 * incorrect
-	 * @throws CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> An error occurred persisting this setting.</li>
-	 * </ul>
-	 * @see #FILE_NAME_SPEC
-	 * @see #FILE_EXTENSION_SPEC
-	 */
-	public void removeFileSpec(String fileSpec, int type) throws CoreException;
-
-	/**
-	 * Sets the default charset for the corresponding content type. If 
-	 * <code>null</code> is provided, restores the pre-defined default charset. 
-	 * 
-	 * @param userCharset the new charset for the content type, or
-	 * <code>null</code>  
-	 * @throws CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> An error occurred persisting this setting.</li>
-	 * </ul>
-	 */
-	public void setDefaultCharset(String userCharset) throws CoreException;
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/ITextContentDescriber.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/ITextContentDescriber.java
deleted file mode 100644
index 4d4e6ac..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/ITextContentDescriber.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.content;
-
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * Text content describers extend basic content describers to provide
- * the ability of scanning character streams (readers). Describers for 
- * text-based content types must implement this interface 
- * instead of <code>IContentDescription</code>.
- * <p>
- * Note: It is expected that content describer implementations be declared in a package 
- * that is exempt from plug-in activation (using the Eclipse-AutoStart bundle 
- * manifest header). Since all describers are instantiated when the content type 
- * framework is initialized, failure in complying with this requirement causes 
- * premature activation, which must be avoided. Future implementations of the 
- * framework might refuse to instantiate describers if doing so would trigger 
- * activation of the corresponding plug-in.
- * </p>
- * <p>
- * Clients may implement this interface.
- * </p>
- * 
- * @see IContentDescription
- * @since 3.0
- */
-public interface ITextContentDescriber extends IContentDescriber {
-	/**
-	 * Tries to fill a description for the given contents. Returns 
-	 * an <code>int</code> indicating whether the given stream of 
-	 * characters represents a valid sample for this describer's corresponding 
-	 * content type. If no content description is provided, this method should 
-	 * only perform content type validation.
-	 * <p>
-	 * The stream provided must be kept open, and any IOExceptions while 
-	 * reading it should flow to the caller.
-	 * </p>
-	 * 
-	 * @param contents the contents to be examined
-	 * @param description a description to be filled in, or <code>null</code> if 
-	 * only content type validation is to be performed  
-	 * @return one of the following:<ul>
-	 * <li><code>VALID</code></li>
-	 * <li><code>INVALID</code></li>
-	 * <li><code>INDETERMINATE</code></li>
-	 * </ul>
-	 * @throws IOException if an I/O error occurs
-	 * @see IContentDescription
-	 * @see #VALID
-	 * @see #INVALID
-	 * @see #INDETERMINATE
-	 */
-	public int describe(Reader contents, IContentDescription description) throws IOException;
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/XMLRootElementContentDescriber.java b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/XMLRootElementContentDescriber.java
deleted file mode 100644
index 3aadbc2..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/XMLRootElementContentDescriber.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.content;
-
-import java.io.*;
-import java.util.Hashtable;
-import javax.xml.parsers.ParserConfigurationException;
-import org.eclipse.core.internal.content.*;
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.util.NLS;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-/**
- * A content describer for detecting the name of the top-level element or the
- * DTD system identifier in an XML file.
- * <p>
- * This executable extension supports two parameters:
- * "dtd" and "element". 
- * At least one of them <strong>must</strong> be provided.  If the
- * <code>":-"</code> method is used, then the value is treated as
- * "element".
- * </p>  
- * <p>
- * This class is not intended to be subclassed or instantiated by clients, 
- * only to be referenced by the "describer" configuration element in
- * extensions to the <code>org.eclipse.core.runtime.contentTypes</code>
- * extension point.
- * </p>
- * 
- * @since 3.0
- */
-public final class XMLRootElementContentDescriber extends XMLContentDescriber implements IExecutableExtension {
-	private static final String DTD_TO_FIND = "dtd"; //$NON-NLS-1$
-	private static final String ELEMENT_TO_FIND = "element"; //$NON-NLS-1$
-	/* (Intentionally not included in javadoc)
-	 * The system identifier that we wish to find. This value will be
-	 * initialized by the <code>setInitializationData</code> method. If no
-	 * value is provided, then this means that we don't care what the system
-	 * identifier will be.
-	 */
-	private String dtdToFind = null;
-	/* (Intentionally not included in javadoc)
-	 * The top-level element we are looking for. This value will be initialized
-	 * by the <code>setInitializationData</code> method. If no value is
-	 * provided, then this means that we don't care what the top-level element
-	 * will be.
-	 */
-	private String elementToFind = null;
-
-	/* (Intentionally not included in javadoc)
-	 * Determines the validation status for the given contents.
-	 * 
-	 * @param contents the contents to be evaluated
-	 * @return one of the following:<ul>
-	 * <li><code>VALID</code></li>,
-	 * <li><code>INVALID</code></li>,
-	 * <li><code>INDETERMINATE</code></li>
-	 * </ul>
-	 * @throws IOException
-	 */
-	private int checkCriteria(InputSource contents) throws IOException {
-		XMLRootHandler xmlHandler = new XMLRootHandler(elementToFind != null);
-		try {
-			if (!xmlHandler.parseContents(contents))
-				return INDETERMINATE;
-		} catch (SAXException e) {
-			// we may be handed any kind of contents... it is normal we fail to parse
-			return INDETERMINATE;
-		} catch (ParserConfigurationException e) {
-			// some bad thing happened - force this describer to be disabled
-			String message = ContentMessages.content_parserConfiguration;
-			RuntimeLog.log(new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, e));
-			throw new RuntimeException(message);
-		}
-		// Check to see if we matched our criteria.
-		if ((elementToFind != null) && (!elementToFind.equals(xmlHandler.getRootName())))
-			return INDETERMINATE;
-		if ((dtdToFind != null) && (!dtdToFind.equals(xmlHandler.getDTD())))
-			return INDETERMINATE;
-		// We must be okay then.		
-		return VALID;
-	}
-
-	/* (Intentionally not included in javadoc)
-	 * @see IContentDescriber#describe(InputStream, IContentDescription)
-	 */
-	public int describe(InputStream contents, IContentDescription description) throws IOException {
-		// call the basic XML describer to do basic recognition
-		if (super.describe(contents, description) == INVALID)
-			return INVALID;
-		// super.describe will have consumed some chars, need to rewind		
-		contents.reset();
-		// Check to see if we matched our criteria.		
-		return checkCriteria(new InputSource(contents));
-	}
-
-	/* (Intentionally not included in javadoc)
-	 * @see IContentDescriber#describe(Reader, IContentDescription)
-	 */
-	public int describe(Reader contents, IContentDescription description) throws IOException {
-		// call the basic XML describer to do basic recognition
-		if (super.describe(contents, description) == INVALID)
-			return INVALID;
-		// super.describe will have consumed some chars, need to rewind
-		contents.reset();
-		// Check to see if we matched our criteria.
-		return checkCriteria(new InputSource(contents));
-	}
-
-	/* (Intentionally not included in javadoc)
-	 * @see IExecutableExtension#setInitializationData
-	 */
-	public void setInitializationData(final IConfigurationElement config, final String propertyName, final Object data) throws CoreException {
-		if (data instanceof String)
-			elementToFind = (String) data;
-		else if (data instanceof Hashtable) {
-			Hashtable parameters = (Hashtable) data;
-			dtdToFind = (String) parameters.get(DTD_TO_FIND);
-			elementToFind = (String) parameters.get(ELEMENT_TO_FIND);
-		}
-		if (dtdToFind == null && elementToFind == null) {
-			String message = NLS.bind(ContentMessages.content_badInitializationData, XMLRootElementContentDescriber.class.getName());
-			throw new CoreException(new Status(IStatus.ERROR, ContentMessages.OWNER_NAME, 0, message, null));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/package.html b/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/package.html
deleted file mode 100644
index fa292a8..0000000
--- a/bundles/org.eclipse.core.contenttype/src/org/eclipse/core/runtime/content/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>Package-level Javadoc</title>
-</head>
-<body>
-Provides core support for content types.
-<h2>
-Package Specification</h2>
-<p>
-This package specifies API for content type management and automatic 
-content type determination.
-</p>
-<p>
-@since 3.0
-</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.expressions/.classpath b/bundles/org.eclipse.core.expressions/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/bundles/org.eclipse.core.expressions/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.expressions/.cvsignore b/bundles/org.eclipse.core.expressions/.cvsignore
deleted file mode 100644
index fe99505..0000000
--- a/bundles/org.eclipse.core.expressions/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-
diff --git a/bundles/org.eclipse.core.expressions/.options b/bundles/org.eclipse.core.expressions/.options
deleted file mode 100644
index be381a7..0000000
--- a/bundles/org.eclipse.core.expressions/.options
+++ /dev/null
@@ -1,3 +0,0 @@
-# Traces property resolving in the hierarchy of type
-# extensions
-org.eclipse.core.expressions/tracePropertyResolving=false
diff --git a/bundles/org.eclipse.core.expressions/.project b/bundles/org.eclipse.core.expressions/.project
deleted file mode 100644
index 3bf832e..0000000
--- a/bundles/org.eclipse.core.expressions/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.expressions</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.expressions/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.core.expressions/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d6dd2e9..0000000
--- a/bundles/org.eclipse.core.expressions/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,66 +0,0 @@
-#Wed May 25 10:22:17 CEST 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=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.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=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=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-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=private
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.core.expressions/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.core.expressions/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 0305c96..0000000
--- a/bundles/org.eclipse.core.expressions/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Dec 21 11:05:13 CET 2004
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.ondemandthreshold=99
-org.eclipse.jdt.ui.importorder=java;javax;org.eclipse.core.runtime;org.eclipse.core.expressions;org.eclipse.core.internal.expressions;
diff --git a/bundles/org.eclipse.core.expressions/.template b/bundles/org.eclipse.core.expressions/.template
deleted file mode 100644
index d65e0f4..0000000
--- a/bundles/org.eclipse.core.expressions/.template
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form>
-   <p/><p><b>Tips on working with this plug-in project</b></p><li>For the view of the new plug-in at a glance, go to the <img href="pageImage"/><a href="OverviewPage">Overview</a>.</li><li>You can test the contributions of this plug-in by launching another instance of the workbench. On the <b>Run</b> menu, click <b>Run As</b> and choose <img href="runTimeWorkbenchImage"/><a href="action.run">Run-time Workbench</a> from the available choices.</li><li>You can add more functionality to this plug-in by adding extensions using the <a href="action.newExtension">New Extension Wizard</a>.</li><li>The plug-in project contains Java code that you can debug. Place breakpoints in Java classes. On the <b>Run</b> menu, select <b>Debug As</b> and choose <img href="runTimeWorkbenchImage"/><a href="action.debug">Run-time Workbench</a> from the available choices.</li>
-</form>
diff --git a/bundles/org.eclipse.core.expressions/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.expressions/META-INF/MANIFEST.MF
deleted file mode 100644
index bdc7dc9..0000000
--- a/bundles/org.eclipse.core.expressions/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.expressions; singleton:=true
-Bundle-Version: 3.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.core.internal.expressions.ExpressionPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.core.expressions,
- org.eclipse.core.internal.expressions;x-internal:=true
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.1.0,4.0.0)"
-Eclipse-LazyStart: true
diff --git a/bundles/org.eclipse.core.expressions/about.html b/bundles/org.eclipse.core.expressions/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/bundles/org.eclipse.core.expressions/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/build.properties b/bundles/org.eclipse.core.expressions/build.properties
deleted file mode 100644
index eb7f1ce..0000000
--- a/bundles/org.eclipse.core.expressions/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 = plugin.xml,\
-               about.html,\
-               plugin.properties,\
-               .,\
-               .options,\
-               META-INF/
-src.includes = about.html,\
-               schema/
-source.. = src/
diff --git a/bundles/org.eclipse.core.expressions/buildnotes_core-expressions.html b/bundles/org.eclipse.core.expressions/buildnotes_core-expressions.html
deleted file mode 100644
index 910d001..0000000
--- a/bundles/org.eclipse.core.expressions/buildnotes_core-expressions.html
+++ /dev/null
@@ -1,56 +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>Core Expressions Release Notes</title>
-</head>
-<body>
-
-<h1>
-Eclipse Platform Build Notes&nbsp;<br>
-Core Expressions</h1>
-<h3>Mai 7, 2004</h3>
-<h4>Problem Reports Fixed</h4>
-<h4>Implemenation Changes</h4>
-<ul>
-  <li>The ability to resolve a plug-in descriptor via the resolve expression has been removed
-      from the expression language. This was necessary since IPluginDescriptor is deprecated
-      for 3.0 and the functionality was new in 3.0 anyways.</li>
-</ul>
-<h3>March 23, 2004</h3>
-<h4>Problem Reports Fixed</h4>
-<h4>Implemenation Changes</h4>
-<ul>
-  <li>removed the constructor public EvaluationContext(IEvaluationContext parent, Object defaultVariable, 
-  Object selection). Instead of calling this constructor, the following code has to be written:
-  <pre>
-     EvaluationContext evalContext= new EvaluationContext(null, cunit);
-     evalContext.addVariable("selection", cunit); //$NON-NLS-1$
-  </pre>
-  </li>
-  <li> removed the two string constants:
-  <pre>
-     public static final String SYSTEM= "System";  //$NON-NLS-1$
-     public static final String SELECTION= "selection";  //$NON-NLS-1$
-  </pre>
-  </li>
-  <li>added support for custom variable resolver (see new class IVariableResolver). So there is no need
-      to subclass EvaluationContext anymore to add your own resolving strategy.
-  </li>
-  <li>added support for an equals expression. </li>
-</ul>
-
-<h3>March 16, 2004</h3>
-<h4>Problem Reports Fixed</h4>
-<h4>Implemenation Changes</h4>
-The adapt expression now uses the new IAdapterManager API hasAdapter(Object, String) and 
-getAdapter(Object, String). This ensures that the right class loader is used to convert
-the string representing a type into a corresponding Class. However, this change now requires
-that the adapters requested via an adapt expression must be declared in XML using the new
-org.eclipse.core.runtime.adapters extension point.
-</body>
-</html>
-
diff --git a/bundles/org.eclipse.core.expressions/component.xml b/bundles/org.eclipse.core.expressions/component.xml
deleted file mode 100644
index d79e323..0000000
--- a/bundles/org.eclipse.core.expressions/component.xml
+++ /dev/null
@@ -1,19 +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="Expression Language">
- <plugin id="org.eclipse.core.expressions" />
-
- <package name="org.eclipse.core.expressions">
-   <type name= "EvaluationContext" subclass="false"/>
-   <type name= "EvaluationResult" subclass="false"/>
-   <type name= "ExpressionConverter" subclass="false"/>
-   <type name= "ExpressionTagNames" subclass="false"/>
-   <type name= "IEvaluationContext" implement="false"/>
-   <type name= "IPropertyTester" implement="false"/>
- </package>
- 
- <component-depends unrestricted="true"/>
-</component>
diff --git a/bundles/org.eclipse.core.expressions/plugin.properties b/bundles/org.eclipse.core.expressions/plugin.properties
deleted file mode 100644
index c96c176..0000000
--- a/bundles/org.eclipse.core.expressions/plugin.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName= Expression Language
-providerName= Eclipse.org
-
-propertyTesterExtensionPoint= Property Tester
diff --git a/bundles/org.eclipse.core.expressions/plugin.xml b/bundles/org.eclipse.core.expressions/plugin.xml
deleted file mode 100644
index d1d1a42..0000000
--- a/bundles/org.eclipse.core.expressions/plugin.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   
-     <extension-point id="propertyTesters" name="%propertyTesterExtensionPoint" schema="schema/propertyTesters.exsd"/>
-
-</plugin>
diff --git a/bundles/org.eclipse.core.expressions/schema/expressionLanguage.exsd b/bundles/org.eclipse.core.expressions/schema/expressionLanguage.exsd
deleted file mode 100644
index bdca18c..0000000
--- a/bundles/org.eclipse.core.expressions/schema/expressionLanguage.exsd
+++ /dev/null
@@ -1,483 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.expressions">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.expressions" id="commonExpression" name="Common Expressions"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="enablement">
-      <annotation>
-         <documentation>
-            A generic root element. The element can be used inside an extension point to define its enablement expression.
-            The children of an enablement expression are combined using the and operator.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="not">
-      <annotation>
-         <documentation>
-            This element represent a NOT operation on the result of evaluating it&apos;s sub-element expression.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="and">
-      <annotation>
-         <documentation>
-            This element represent an AND operation on the result of evaluating all it&apos;s sub-elements expressions.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="or">
-      <annotation>
-         <documentation>
-            This element represent an  OR operation on the result of evaluating all it&apos;s sub-element expressions.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="instanceof">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="value"/>
-         </appInfo>
-         <documentation>
-            This element is used to perform an instanceof check of the object in focus. The expression returns
-            EvaluationResult.TRUE if the object&apos;s type is a sub type of the type specified by the attribute value.
-            Otherwise EvaluationResult.FALSE is returned.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of a class or interface.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="java.lang.Object"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="test">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="property"/>
-         </appInfo>
-         <documentation>
-            This element is used to evaluate the property state of the object in focus. The set of
-            testable properties can be extended using the propery tester extension point. The test
-            expression returns EvaluationResult.NOT_LOADED if teh property tester doing the actual
-            testing isn&apos;t loaded yet.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="property" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of an object&apos;s property to test.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="args" type="string">
-            <annotation>
-               <documentation>
-                  additional arguments passed to the property tester. Multiple arguments are seperated
-                  by commas. Each individual argument is converted into a Java base type using the same
-                  rules as defined for the value attribute of the test expression.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  the expected value of the property. Can be omitted if the property 
-                  is a boolean property. The test expression is supposed to return 
-EvaluationResult.TRUE if the property matches the value and EvaluationResult.FALSE
-otherwise. The value attribute is converted into a Java base type using the following
-rules:
-&lt;ul&gt;
- &lt;li&gt;the string &amp;quot;true&amp;quot; is converted into Boolean.TRUE&lt;/li&gt;
- &lt;li&gt;the string &amp;quot;false&amp;quot; is converted into Boolean.FALSE&lt;/li&gt;
- &lt;li&gt;if the string contains a dot then the interpreter tries to convert
- the value into a Float object. If this fails the string is treated as a
- java.lang.String&lt;/li&gt;
- &lt;li&gt;if the string only consists of numbers then the interpreter
- converts the value in an Integer object.&lt;/li&gt;
- &lt;li&gt;in all other cases the string is treated as a java.lang.String&lt;/li&gt;
- &lt;li&gt;the conversion of the string into a Boolean, Float, or Integer can
- be suppressed by surrounding the string with single quotes. For
- example, the attribute value=&amp;quot;&apos;true&apos;&amp;quot; is converted into the
- string &amp;quot;true&amp;quot;&lt;/li&gt;
-&lt;/ul&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="systemTest">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="value"/>
-         </appInfo>
-         <documentation>
-            Tests a system property by calling the System.getProperty method and compares the result
-            with the value specified through the value attribute.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="property" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of an system property to test.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the expected value of the property. The value is interpreted as a string value.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="equals">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="value"/>
-         </appInfo>
-         <documentation>
-            This element is used to perform an equals check of the object in focus. The expression returns
-            EvaluationResult.TRUE if the object is equal to the value provided by the attribute value. Otherwise
-            EvaluationResult.FALSE is returned.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the operatand of the equals tests. The value provided as a string is converted into
-                  a Java base type using the same rules as for the value attribute of the test expression.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="count">
-      <annotation>
-         <documentation>
-            This element is used to test the number of elements in a collection.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  an expression to specify the number of elements in a list. Following wildcard
-                  characters can be used:
-                  &lt;dl&gt;
-                    &lt;dt&gt;*&lt;/dt&gt; &lt;dd&gt;any number of elements&lt;/dd&gt;
-                    &lt;dt&gt;?&lt;/dt&gt; &lt;dd&gt;no elements or one element&lt;/dd&gt;
-                    &lt;dt&gt;+&lt;/dt&gt; &lt;dd&gt;one or more elements&lt;/dd&gt;
-                    &lt;dt&gt;!&lt;/dt&gt; &lt;dd&gt;no elements&lt;/dd&gt;
-                    &lt;dt&gt;integer value&lt;/dt&gt; &lt;dd&gt;the list must contain the exact number of elements&lt;/dd&gt;
-                  &lt;/dl&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="with">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="variable"/>
-         </appInfo>
-         <documentation>
-            This element changes the object to be inspected for all its child element to the object
-            referneced by the given variable. If the variable can not be resolved then the expression
-            will throw a ExpressionException when evaluating it. The children of a with expression 
-            are combined using the and operator.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-         </sequence>
-         <attribute name="variable" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the variable to be used for further inspection. It is up to the evaluator
-                  of an extension point to provide the variable in the variable pool.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="resolve">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="variable"/>
-         </appInfo>
-         <documentation>
-            This element changes the object to be inspected for all its child element to the object
-            referneced by the given variable. If the variable can not be resolved then the expression
-            will throw a ExpressionException when evaluating it. The children of a with expression 
-            are combined using the and operator.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-         </sequence>
-         <attribute name="variable" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the variable to be resolved. This variable is then used as the object in focus
-                  for child element evaluation. It is up to the evaluator of an extension point to provide a 
-                  corresponding variable resolver (see IVariableResolver) through the evaluation context passed
-                  to the root expression element when evaluating the expression.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="args" type="string">
-            <annotation>
-               <documentation>
-                  additional arguments passed to the variable resolver. Multiple arguments are seperated
-                  by commas. Each individual argument is converted into a Java base type using the same
-                  rules as defined for the value attribute of the test expression.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="adapt">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="type"/>
-         </appInfo>
-         <documentation>
-            This element is used to adapt the object in focus to the type specified by the attribute
-            type. The expression returns not loaded if either the adapter or the type referenced isn&apos;t
-            loaded yet. It throws a ExpressionException during evaluation if the type name doesn&apos;t exist 
-            at all. The children of an adapt expression are combined using the and operator.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-         </sequence>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the type to which the object in focus is to be adapted.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="java.lang.Object"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="iterate">
-      <annotation>
-         <documentation>
-            This element is used to iterate over a variable that is of type java.util.Collection. If
-            the object in focus is not of type java.util.Collection then an ExpressionException will
-            be thrown while evaluating the expression.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-         </sequence>
-         <attribute name="operator">
-            <annotation>
-               <documentation>
-                  either &quot;and&quot; or &quot;or&quot;. The operator defines how the child
-                  elements will be combined. If not specified, &quot;and&quot; will be used.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="or">
-                  </enumeration>
-                  <enumeration value="and">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Release 3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2001, 2004 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.core.expressions/schema/propertyTesters.exsd b/bundles/org.eclipse.core.expressions/schema/propertyTesters.exsd
deleted file mode 100644
index 868241b..0000000
--- a/bundles/org.eclipse.core.expressions/schema/propertyTesters.exsd
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.expressions">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.expressions" id="propertyTesters" name="Property Testers"/>
-      </appInfo>
-      <documentation>
-         This extension point allows to add properties to an already existing type. Those
-         properties can then be used inside the expression language&apos;s test expression
-         element.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="propertyTester" 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="propertyTester">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique identifier for the property tester
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the type to be extended by this property tester
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="namespace" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique id determining the name space the properties are added to
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="properties" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a comma separated list of properties provided by this property tester
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the class that implements the testing methods. The class must be public and extend
-&lt;samp&gt;org.eclipse.core.expressions.PropertyTester&lt;/samp&gt; with a public 0-argument constructor.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.expressions.PropertyTester"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a property tester contribution:
-
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.core.expressions.propertyTesters&quot;&gt;
-    &lt;propertyTester
-      id=&quot;org.eclipse.jdt.ui.IResourceTester&quot;
-      type=&quot;org.eclipse.core.resources.IResource&quot;
-      namespace=&quot;org.eclipse.jdt.ui&quot;
-      properties=&quot;canDelete&quot;
-      class=&quot;org.eclipse.jdt.ui.internal.ResourceTester&quot;&gt;
-    &lt;/propertyTester&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The contributed class must extend &lt;code&gt;org.eclipse.core.expressions.PropertyTester&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2001, 2004 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.core.expressions/scripts/exportplugin.xml b/bundles/org.eclipse.core.expressions/scripts/exportplugin.xml
deleted file mode 100644
index 4b2b97b..0000000
--- a/bundles/org.eclipse.core.expressions/scripts/exportplugin.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<project name="org.eclipse.jdt.ui" default="export" basedir="..">
-<!-- build script to create a plugin from org.eclipse.core.expressions -->
-
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.eclipse.core.expressions" />
-		<property name="qualifier" value="zzz${DSTAMP}-${TSTAMP}" />
-		<property name="plugin_version"  value="_3.2.0.${qualifier}" />
-		<property name="dest"  value="${destdir}/${plugin}${plugin_version}" />
-		<property name="destjar"  value="${destdir}/${plugin}${plugin_version}.jar" />
-	</target>
-
-	<target name="build" depends="init">
-    	<eclipse.incrementalBuild project="${plugin}" kind="incr"/>
-	</target>
-
-	<target name="export" depends="build">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		
-		<copy todir="${dest}/META-INF">
-			<fileset dir="META-INF" />
-		</copy>		
-		
-		<replaceregexp file="${dest}/META-INF/MANIFEST.MF" match="Bundle-Version: ((\d)+\.(\d)+\.(\d)+\.)qualifier" replace="Bundle-Version: \1${qualifier}" byline="true" />
-		
-		<delete file="${destjar}" />
-		<zip zipfile="${destjar}">
-			<fileset dir=".">
-			  <include name="plugin.xml" />
-			  <include name="plugin.properties" />
-			  <include name=".options" />
-			  <include name="schema/**" />
-			  <include name="src/**" />
-			</fileset>
-			<fileset dir="bin" />
-			<fileset dir="${dest}">
-			  <include name="META-INF/**" />
-			</fileset>
-		</zip>
-		
-		<delete dir="${dest}" />
-		
-	</target>
-</project>
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ElementHandler.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ElementHandler.java
deleted file mode 100644
index 10a9617..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ElementHandler.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.internal.expressions.CompositeExpression;
-import org.eclipse.core.internal.expressions.StandardElementHandler;
-
-
-/**
- * An element handler converts an {@link IConfigurationElement} into a 
- * corresponding expression object. 
- * <p>
- * The class should be subclassed by clients wishing to provide an element
- * handler for special expressions.
- * </p>
- * @since 3.0 
- */
-public abstract class ElementHandler {
-	
-	private static final ElementHandler INSTANCE= new StandardElementHandler();
-	
-	/**
-	 * The default element handler which can cope with all XML expression elements
-	 * defined by the common expression language.
-	 * 
-	 * @return the default element handler
-	 */
-	public static ElementHandler getDefault() {
-		return INSTANCE;
-	}
-	
-	/**
-	 * Creates the corresponding expression for the given configuration element.
-	 * 
-	 * @param converter the expression converter used to initiate the
-	 *  conversion process
-	 * 
-	 * @param config the configuration element to convert
-	 * 
-	 * @return the corresponding expression
-	 * 
-	 * @throws CoreException if the conversion failed
-	 */
-	public abstract Expression create(ExpressionConverter converter, IConfigurationElement config) throws CoreException;
-	
-	/**
-	 * Converts the children of the given configuration element and adds them 
-	 * to the given composite expression.
-	 * <p>
-	 * Note this is an internal method and should not be called by clients.
-	 * </p> 
-	 * @param converter the converter used to do the actual conversion
-	 * @param element the configuration element for which the children 
-	 *  are to be processed
-	 * @param expression the composite expression representing the result
-	 *  of the conversion
-	 * 
-	 * @throws CoreException if the conversion failed
-	 */
-	protected void processChildren(ExpressionConverter converter, IConfigurationElement element, CompositeExpression expression) throws CoreException {
-		converter.processChildren(element, expression);
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/EvaluationContext.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/EvaluationContext.java
deleted file mode 100644
index bbdc973..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/EvaluationContext.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.internal.expressions.Assert;
-
-/**
- * A default implementation of an evaluation context.
- * <p>
- * Clients may instantiate this default context. The class is
- * not intended to be subclassed by clients.
- * </p> 
- * 
- * @since 3.0
- */
-public class EvaluationContext implements IEvaluationContext {
-
-	private IEvaluationContext fParent;
-	private Object fDefaultVariable;
-	private Map/*<String, Object>*/ fVariables;
-	private IVariableResolver[] fVariableResolvers;
-	
-	/**
-	 * Create a new evaluation context with the given parent and default
-	 * variable.
-	 * 
-	 * @param parent the parent context. Can be <code>null</code>.
-	 * @param defaultVariable the default variable
-	 */
-	public EvaluationContext(IEvaluationContext parent, Object defaultVariable) {
-		Assert.isNotNull(defaultVariable);
-		fParent= parent;
-		fDefaultVariable= defaultVariable;
-	}
-	
-	/**
-	 * Create a new evaluation context with the given parent and default
-	 * variable.
-	 * 
-	 * @param parent the parent context. Can be <code>null</code>.
-	 * @param defaultVariable the default variable
-	 * @param resolvers an array of <code>IVariableResolvers</code> to
-	 *  resolve additional variables.
-	 * 
-	 * @see #resolveVariable(String, Object[])
-	 */
-	public EvaluationContext(IEvaluationContext parent, Object defaultVariable, IVariableResolver[] resolvers) {
-		Assert.isNotNull(defaultVariable);
-		Assert.isNotNull(resolvers);
-		fParent= parent;
-		fDefaultVariable= defaultVariable;
-		fVariableResolvers= resolvers;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public IEvaluationContext getParent() {
-		return fParent;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public IEvaluationContext getRoot() {
-		if (fParent == null)
-			return this;
-		return fParent.getRoot();
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object getDefaultVariable() {
-		return fDefaultVariable;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public void addVariable(String name, Object value) {
-		Assert.isNotNull(name);
-		Assert.isNotNull(value);
-		if (fVariables == null)
-			fVariables= new HashMap();
-		fVariables.put(name, value);
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object removeVariable(String name) {
-		Assert.isNotNull(name);
-		if (fVariables == null)
-			return null;
-		return fVariables.remove(name);
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object getVariable(String name) {
-		Assert.isNotNull(name);
-		Object result= null;
-		if (fVariables != null) {
-			result= fVariables.get(name);
-		}
-		if (result != null)
-			return result;
-		if (fParent != null)
-			return fParent.getVariable(name);
-		return null;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object resolveVariable(String name, Object[] args) throws CoreException {
-		if (fVariableResolvers != null && fVariableResolvers.length > 0) {
-			for (int i= 0; i < fVariableResolvers.length; i++) {
-				IVariableResolver resolver= fVariableResolvers[i];
-				Object variable= resolver.resolve(name, args);
-				if (variable != null)
-					return variable;
-			}
-		}
-		if (fParent != null)
-			return fParent.resolveVariable(name, args);
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/EvaluationResult.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/EvaluationResult.java
deleted file mode 100644
index edb4fda..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/EvaluationResult.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-import org.eclipse.core.internal.expressions.Assert;
-
-/**
- * An evaluation result represents the result of an expression
- * evaluation. There are exact three instances of evaluation 
- * result. They are: <code>FALSE</code>, <code>TRUE</code> and
- * <code>NOT_LOADED</code>. <code>NOT_LOADED</code> represents
- * the fact that an expression couldn't be evaluated since a
- * plug-in providing certain test expressions isn't loaded yet.
- * <p>
- * In addition the class implements the three operation <code>and
- * </code>, <code>or</code> and <code>not</code>. The operation are
- * defined as follows:
- * </p>
- * <p>
- * The and operation:
- * </p>
- * <table border="1" cellpadding="5">
- *   <colgroup>
- *     <col width="120">
- *     <col width="120">
- *     <col width="120">
- *     <col width="120">
- *   </colgroup>
- *   <tbody>
- *     <tr>
- *       <td><em>AND</em></td>
- *       <td>FALSE</td>
- *       <td>TRUE</td>
- *       <td>NOT_LOADED</td>
- *     </tr>
- *     <tr>
- *       <td>FALSE</td>
- *       <td>FALSE</td>
- *       <td>FALSE</td>
- *       <td>FALSE</td>
- *     </tr>
- *     <tr>
- *       <td>TRUE</td>
- *       <td>FALSE</td>
- *       <td>TRUE</td>
- *       <td>NOT_LOADED</td>
- *     </tr>
- *     <tr>
- *       <td>NOT_LOADED</td>
- *       <td>FALSE</td>
- *       <td>NOT_LOADED</td>
- *       <td>NOT_LOADED</td>
- *     </tr>
- *   </tbody>
- * </table>
- * <p>
- * The or operation:
- * </p>
- * <table border="1" cellpadding="5">
- *   <colgroup>
- *     <col width="120">
- *     <col width="120">
- *     <col width="120">
- *     <col width="120">
- *   </colgroup>
- *   <tbody>
- *     <tr>
- *       <td><em>OR</em></td>
- *       <td>FALSE</td>
- *       <td>TRUE</td>
- *       <td>NOT_LOADED</td>
- *     </tr>
- *     <tr>
- *       <td>FALSE</td>
- *       <td>FALSE</td>
- *       <td>TRUE</td>
- *       <td>NOT_LOADED</td>
- *     </tr>
- *     <tr>
- *       <td>TRUE</td>
- *       <td>TRUE</td>
- *       <td>TRUE</td>
- *       <td>TRUE</td>
- *     </tr>
- *     <tr>
- *       <td>NOT_LOADED</td>
- *       <td>NOT_LOADED</td>
- *       <td>TRUE</td>
- *       <td>NOT_LOADED</td>
- *     </tr>
- *   </tbody>
- * </table>
- * <p>
- * The not operation:
- * </p>
- * <table border="1" cellpadding="5">
- *   <colgroup>
- *     <col width="120">
- *     <col width="120">
- *     <col width="120">
- *     <col width="120">
- *   </colgroup>
- *   <tbody>
- *     <tr>
- *       <td><em>NOT<em></td>
- *       <td>FALSE</td>
- *       <td>TRUE</td>
- *       <td>NOT_LOADED</td>
- *     </tr>
- *     <tr>
- *       <td></td>
- *       <td>TRUE</td>
- *       <td>FALSE</td>
- *       <td>NOT_LOADED</td>
- *     </tr>
- *   </tbody>
- * </table>
- * 
- * <p>
- * The class is not intended to be subclassed by clients.
- * </p>
- * @since 3.0
- */
-public class EvaluationResult {
-	
-	private int fValue;
-	
-	private static final int FALSE_VALUE= 0;
-	private static final int TRUE_VALUE= 1;
-	private static final int NOT_LOADED_VALUE= 2;
-	
-	/** The evaluation result representing the value FALSE */
-	public static final EvaluationResult FALSE= new EvaluationResult(FALSE_VALUE);
-	/** The evaluation result representing the value TRUE */
-	public static final EvaluationResult TRUE= new EvaluationResult(TRUE_VALUE);
-	/** The evaluation result representing the value NOT_LOADED */
-	public static final EvaluationResult NOT_LOADED= new EvaluationResult(NOT_LOADED_VALUE);
-
-	private static final EvaluationResult[][] AND= new EvaluationResult[][] {
-						// FALSE	//TRUE		//NOT_LOADED
-		/* FALSE   */ { FALSE,		FALSE,		FALSE		},
-		/* TRUE    */ { FALSE,		TRUE,		NOT_LOADED	},
-		/* PNL     */ { FALSE,		NOT_LOADED, NOT_LOADED	},
-	};
-
-	private static final EvaluationResult[][] OR= new EvaluationResult[][] {
-						// FALSE	//TRUE	//NOT_LOADED
-		/* FALSE   */ { FALSE,		TRUE,	NOT_LOADED	},
-		/* TRUE    */ { TRUE,		TRUE,	TRUE		},
-		/* PNL     */ { NOT_LOADED,	TRUE, 	NOT_LOADED	},
-	};
-
-	private static final EvaluationResult[] NOT= new EvaluationResult[] {
-		//FALSE		//TRUE	//NOT_LOADED
-		TRUE,		FALSE,	NOT_LOADED
-	};
-
-	/*
-	 * No instances outside of <code>EvaluationResult</code>
-	 */
-	private EvaluationResult(int value) {
-		fValue= value;
-	}
-	
-	/**
-	 * Returns an <code>EvaluationResult</code> whose value is <code>this &amp;&amp; other)</code>.
-	 * 
-	 * @param other the right hand side of the and operation.
-	 * 
-	 * @return <code>this &amp;&amp; other</code> as defined by the evaluation result
-	 */
-	public EvaluationResult and(EvaluationResult other) {
-		return AND[fValue][other.fValue];
-	}
-	
-	/**
-	 * Returns an <code>EvaluationResult</code> whose value is <code>this || other)</code>.
-	 * 
-	 * @param other the right hand side of the or operation.
-	 * 
-	 * @return <code>this || other</code> as defined by the evaluation result
-	 */
-	public EvaluationResult or(EvaluationResult other) {
-		return OR[fValue][other.fValue];
-	}
-	
-	/**
-	 * Returns the inverted value of this evaluation result
-	 * 
-	 * @return the inverted value of this evaluation result
-	 */
-	public EvaluationResult not() {
-		return NOT[fValue];
-	}
-	
-	/**
-	 * Returns an evaluation result instance representing the
-	 * given boolean value. If the given boolean value is
-	 * <code>true</code> then <code>ExpressionResult.TRUE</code>
-	 * is returned. If the value is <code>false</code> then <code>
-	 * ExpressionResult.FALSE</code> is returned.
-	 * 
-	 * @param b a boolean value
-	 * 
-	 * @return the expression result representing the boolean
-	 *  value
-	 */
-	public static EvaluationResult valueOf(boolean b) {
-		return b ? TRUE : FALSE;
-	}
-	
-	/**
-	 * Returns a evaluation result instance representing the
-	 * given <code>Boolean</code> value. If the given <code>Boolean
-	 * </code> value is <code>true</code> then <code>ExpressionResult.TRUE</code>
-	 * is returned. If the value is <code>false</code> then <code>
-	 * ExpressionResult.FALSE</code> is returned.
-	 * 
-	 * @param b a <code>Boolean</code> value
-	 * 
-	 * @return the expression result representing the <code>Boolean</code>
-	 *  value
-	 */
-	public static EvaluationResult valueOf(Boolean b) {
-		return b.booleanValue() ? TRUE : FALSE;
-	}
-	
-	/**
-	 * For debugging purpose only
-	 * 
-	 * @return a string representing this object. The result is not
-	 *  human readable
-	 */
-	public String toString() {
-		switch (fValue) {
-			case 0:
-				return "false"; //$NON-NLS-1$
-			case 1:
-				return "true"; //$NON-NLS-1$
-			case 2:
-				return "not_loaded"; //$NON-NLS-1$
-		}
-		Assert.isTrue(false);
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/Expression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/Expression.java
deleted file mode 100644
index 47557e5..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/Expression.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Abstract base class for all expressions provided by the common
- * expression language.
- * <p>
- * An expression is evaluated by calling {@link #evaluate(IEvaluationContext)}.
- * </p>
- * <p>
- * This class may be subclassed to provide specific expressions.
- * </p>
- * 
- * @since 3.0
- */
-public abstract class Expression {
-	
-	/**
-	 * Name of the value attribute of an expression (value is 
-	 * <code>value</code>).
-	 */ 
-	protected static final String ATT_VALUE= "value"; //$NON-NLS-1$
-	
-	/**
-	 * The expression corresponding to {@link EvaluationResult#TRUE}.
-	 */
-	public static final Expression TRUE= new Expression() {
-		public EvaluationResult evaluate(IEvaluationContext context) {
-			return EvaluationResult.TRUE;
-		}	
-		public void collectExpressionInfo(ExpressionInfo info) {
-		}
-	};
-	
-	/**
-	 * The expression corresponding to {@link EvaluationResult#FALSE}.
-	 */
-	public static final Expression FALSE= new Expression() {
-		public EvaluationResult evaluate(IEvaluationContext context) {
-			return EvaluationResult.FALSE;
-		}
-		public void collectExpressionInfo(ExpressionInfo info) {
-		}
-	};
-	
-	/**
-	 * Evaluates this expression. 
-	 * 
-	 * @param context an evaluation context providing information like variable,
-	 *  name spaces, etc. necessary to evaluate this expression
-	 * 
-	 * @return the result of the expression evaluation
-	 * 
-	 * @throws CoreException if the evaluation failed. The concrete reason is 
-	 *  defined by the subclass implementing this method
-	 */
-	public abstract EvaluationResult evaluate(IEvaluationContext context) throws CoreException;
-	
-	/**
-	 * Computes the expression information for the given expression tree.
-	 * <p>
-	 * This is a convenience method for collecting the expression information
-	 * using {@link Expression#collectExpressionInfo(ExpressionInfo)}.
-	 * </p>
-	 * 
-	 * @return the expression information 
-	 * @since 3.2
-	 */
-	public final ExpressionInfo computeExpressionInfo() {
-		ExpressionInfo result= new ExpressionInfo();
-		collectExpressionInfo(result);
-		return result;
-	}
-	
-	/**
-	 * Collects information about this expression tree. This default
-	 * implementation add the expression's type to the set of misbehaving
-	 * expression types.
-	 * 
-	 * @param info the expression information object used
-	 *  to collect the information
-	 * @since 3.2
-	 */
-	public void collectExpressionInfo(ExpressionInfo info) {
-		info.addMisBehavingExpressionType(getClass());
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ExpressionConverter.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ExpressionConverter.java
deleted file mode 100644
index f8500e0..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ExpressionConverter.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-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.internal.expressions.Assert;
-import org.eclipse.core.internal.expressions.CompositeExpression;
-import org.eclipse.core.internal.expressions.ExpressionMessages;
-import org.eclipse.core.internal.expressions.ExpressionPlugin;
-import org.eclipse.core.internal.expressions.Messages;
-
-/**
- * An expression converter converts an XML expression represented by an 
- * {@link IConfigurationElement} tree into a corresponding expression tree.
- * 
- * <p>
- * An expression converter manages a list of {@link ElementHandler}s. Element
- * handlers are responsible to do the actual conversion. The element handlers
- * build a chain of responsibility.
- * </p>
- * 
- * @since 3.0 
- */
-public final class ExpressionConverter {
-	
-	private ElementHandler[] fHandlers;
-	private static final ExpressionConverter INSTANCE= new ExpressionConverter( 
-		new ElementHandler[] { ElementHandler.getDefault() } ); 
-	
-	/** 
-	 * Returns the default expression converter. The default expression converter
-	 * can cope with all expression elements defined by the common expression
-	 * language.
-	 * 
-	 * @return the default expression converter
-	 */
-	public static ExpressionConverter getDefault() {
-		return INSTANCE;
-	}
-	
-	/**
-	 * Creates a new expression converter with the given list of element
-	 * handlers. The element handlers build a chain of responsibility
-	 * meaning that the first handler in the list is first used to
-	 * convert the configuration element. If this handler isn't able
-	 * to convert the configuration element the next handler in the
-	 * array is used.
-	 * 
-	 * @param handlers the array  of element handlers
- 	 */
-	public ExpressionConverter(ElementHandler[] handlers) {
-		Assert.isNotNull(handlers);
-		fHandlers= handlers;
-	}
-	
-	/**
-	 * Converts the tree of configuration elements represented by the given
-	 * root element and returns a corresponding expression tree.
-	 * 
-	 * @param root the configuration element to be converted
-	 * 
-	 * @return the corresponding expression tree or <code>null</code>
-	 *  if the configuration element cannot be converted
-	 * 
-	 * @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 perform(IConfigurationElement root) throws CoreException {
-		for (int i= 0; i < fHandlers.length; i++) {
-			ElementHandler handler= fHandlers[i];
-			Expression result= handler.create(this, root);
-			if (result != null)
-				return result;
-		}
-		return null;
-	}
-	
-	/* package */ void processChildren(IConfigurationElement element, CompositeExpression result) throws CoreException {
-		IConfigurationElement[] children= element.getChildren();
-		if (children != null) {
-			for (int i= 0; i < children.length; i++) {
-				Expression child= perform(children[i]);
-				if (child == null)
-					throw new CoreException(new Status(IStatus.ERROR, ExpressionPlugin.getPluginId(),
-						IStatus.ERROR, 
-						Messages.format(
-							ExpressionMessages.Expression_unknown_element,  
-							children[i].getName()),
-						null));
-				result.add(child);
-			}
-		}		
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ExpressionInfo.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ExpressionInfo.java
deleted file mode 100644
index 0130301..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ExpressionInfo.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A status object describing information about an expression tree. 
- * This information can for example be used to decide whether a
- * expression tree as to be reevaluated if the value of some
- * variables changes.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.2
- */
-public class ExpressionInfo {
-
-	private boolean fHasDefaultVariableAccess;
-	private boolean fHasSystemPropertyAccess;
-	
-	// Although we are using this as sets we use lists since
-	// they are faster for smaller numbers of elements
-	private List fAccessedVariableNames;
-	private List fMisbehavingExpressionTypes;
-	
-	/**
-	 * Returns <code>true</code> if the default variable is accessed
-	 * by the expression tree.
-	 * 
-	 * @return whether the default variable is accessed or not
-	 */
-	public boolean hasDefaultVariableAccess() {
-		return fHasDefaultVariableAccess;
-	}
-	
-	/**
-	 * Marks the default variable as accessed.
-	 */
-	public void markDefaultVariableAccessed() {
-		fHasDefaultVariableAccess= true;
-	}
-
-	/**
-	 * Returns <code>true</code> if the system property is accessed
-	 * by the expression tree.
-	 * 
-	 * @return whether the system property is accessed or not
-	 */
-	public boolean hasSystemPropertyAccess() {
-		return fHasSystemPropertyAccess;
-	}
-	
-	/**
-	 * Marks the system property as accessed.
-	 */
-	public void markSystemPropertyAccessed() {
-		fHasSystemPropertyAccess= true;
-	}
-
-	/**
-	 * Returns the set off accessed variables.
-	 * 
-	 * @return the set off accessed variables
-	 */
-	public String[] getAccessedVariableNames() {
-		if (fAccessedVariableNames == null)
-			return new String[0];
-		return (String[])fAccessedVariableNames.toArray(new String[fAccessedVariableNames.size()]);
-	}
-	
-	/**
-	 * Marks the given variable as accessed.
-	 * 
-	 * @param name the accessed variable
-	 */
-	public void addVariableNameAccess(String name) {
-		if (fAccessedVariableNames == null) {
-			fAccessedVariableNames= new ArrayList(5);
-			fAccessedVariableNames.add(name);
-		} else {
-			if (!fAccessedVariableNames.contains(name))
-				fAccessedVariableNames.add(name);
-		}
-	}
-
-	/**
-	 * Returns the set of expression types which don't implement the
-	 * new (@link Expression#computeReevaluationInfo(IEvaluationContext)}
-	 * method. If one expression didn't implement the method the expression
-	 * tree no optimizations can be done. Returns <code>null</code> if 
-	 * all expressions implement the method.
-	 * 
-	 * @return the set of expression types which don't implement the
-	 *  <code>computeReevaluationInfo</code> method.
-	 */
-	public Class[] getMisbehavingExpressionTypes() {
-		if (fMisbehavingExpressionTypes == null)
-			return null;
-		return (Class[])fMisbehavingExpressionTypes.toArray(new Class[fMisbehavingExpressionTypes.size()]);
-	}
-	
-	/**
-	 * Adds the given class to the list of misbehaving classes.
-	 * 
-	 * @param clazz the class to add.
-	 */
-	public void addMisBehavingExpressionType(Class clazz) {
-		if (fMisbehavingExpressionTypes == null) {
-			fMisbehavingExpressionTypes= new ArrayList();
-			fMisbehavingExpressionTypes.add(clazz);
-		} else {
-			if (!fMisbehavingExpressionTypes.contains(clazz))
-				fMisbehavingExpressionTypes.add(clazz);
-		}
-	}
-	
-	/**
-	 * Merges this reevaluation information with the given info.
-	 * 
-	 * @param other the information to merge with
-	 */
-	public void merge(ExpressionInfo other) {
-		mergeDefaultVariableAccess(other);
-		mergeSystemPropertyAccess(other);
-		
-		mergeAccessedVariableNames(other);
-		mergeMisbehavingExpressionTypes(other);
-	}
-
-	/**
-	 * Merges this reevaluation information with the given info
-	 * ignoring the default variable access.
-	 * 
-	 * @param other the information to merge with
-	 */
-	public void mergeExceptDefaultVariable(ExpressionInfo other) {
-		mergeSystemPropertyAccess(other);
-		
-		mergeAccessedVariableNames(other);
-		mergeMisbehavingExpressionTypes(other);
-	}
-	
-	/**
-	 * Merges only the default variable access.
-	 * 
-	 * @param other the information to merge with
-	 */
-	private void mergeDefaultVariableAccess(ExpressionInfo other) {
-		fHasDefaultVariableAccess= fHasDefaultVariableAccess || other.fHasDefaultVariableAccess;
-	}
-	
-	/**
-	 * Merges only the system property access.
-	 * 
-	 * @param other the information to merge with
-	 */
-	private void mergeSystemPropertyAccess(ExpressionInfo other) {
-		fHasSystemPropertyAccess= fHasSystemPropertyAccess || other.fHasSystemPropertyAccess;
-	}
-
-	/**
-	 * Merges only the accessed variable names.
-	 * 
-	 * @param other the information to merge with
-	 */
-	private void mergeAccessedVariableNames(ExpressionInfo other) {
-		if (fAccessedVariableNames == null) {
-			fAccessedVariableNames= other.fAccessedVariableNames;
-		} else {
-			if (other.fAccessedVariableNames != null) {
-				for (Iterator iter= other.fAccessedVariableNames.iterator(); iter.hasNext();) {
-					Object variableName= iter.next();
-					if (!fAccessedVariableNames.contains(variableName))
-						fAccessedVariableNames.add(variableName);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Merges only the misbehaving expression types.
-	 * 
-	 * @param other the information to merge with
-	 */
-	private void mergeMisbehavingExpressionTypes(ExpressionInfo other) {
-		if (fMisbehavingExpressionTypes == null) {
-			fMisbehavingExpressionTypes= other.fMisbehavingExpressionTypes;
-		} else  {
-			if (other.fMisbehavingExpressionTypes != null) {
-				for (Iterator iter= other.fMisbehavingExpressionTypes.iterator(); iter.hasNext();) {
-					Object clazz= iter.next();
-					if (!fMisbehavingExpressionTypes.contains(clazz))
-						fMisbehavingExpressionTypes.add(clazz);
-				}
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ExpressionTagNames.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ExpressionTagNames.java
deleted file mode 100644
index 0fa229e..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/ExpressionTagNames.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-/**
- * Class defining the tag names of the XML elements of the common
- * expression language.
- * 
- * @since 3.0
- */
-public final class ExpressionTagNames {
-
-	/** The tag name of the enablement expression (value: <code>enablement</code>) */
-	public static final String ENABLEMENT= "enablement"; //$NON-NLS-1$
-	
-	/** The tag name of the and expression (value: <code>and</code>) */
-	public static final String AND= "and"; //$NON-NLS-1$
-	
-	/** The tag name of the or expression (value: <code>or</code>) */
-	public static final String OR= "or"; //$NON-NLS-1$
-	
-	/** The tag name of the not expression (value: <code>not</code>) */
-	public static final String NOT= "not"; //$NON-NLS-1$
-	
-	/** The tag name of the instanceof expression (value: <code>instanceof</code>) */
-	public static final String INSTANCEOF= "instanceof"; //$NON-NLS-1$
-	
-	/** The tag name of the test expression (value: <code>test</code>) */
-	public static final String TEST= "test"; //$NON-NLS-1$
-	
-	/** The tag name of the with expression (value: <code>with</code>) */
-	public static final String WITH= "with"; //$NON-NLS-1$
-	
-	/** The tag name of the adapt expression (value: <code>adapt</code>) */
-	public static final String ADAPT= "adapt"; //$NON-NLS-1$
-	
-	/** The tag name of the count expression (value: <code>count</code>) */
-	public static final String COUNT= "count"; //$NON-NLS-1$
-	
-	/** The tag name of the adapt expression (value: <code>iterate</code>) */
-	public static final String ITERATE= "iterate"; //$NON-NLS-1$
-	
-	/** The tag name of the resolve expression (value: <code>resolve</code>) */
-	public static final String RESOLVE= "resolve"; //$NON-NLS-1$
-
-	/** The tag name of the systemTest expression (value: <code>systemTest</code>) */
-	public static final String SYSTEM_TEST= "systemTest"; //$NON-NLS-1$
-	
-	/** The tag name of the equals expression (value: <code>equals</code>) */
-	public static final String EQUALS= "equals"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/IEvaluationContext.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/IEvaluationContext.java
deleted file mode 100644
index 6f62a40..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/IEvaluationContext.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * An evaluation context is used to manage a set of objects needed during
- * XML expression evaluation. A context has a parent context, can manage
- * a set of named variables and has a default variable. The default variable 
- * is used during XML expression evaluation if no explicit variable is 
- * referenced.
- * <p>
- * This interface is not intended to be implemented by clients. Clients
- * are allowed to instantiate <code>EvaluationContext</code>. 
- * </p>
- * 
- * @since 3.0
- */
-public interface IEvaluationContext {
-
-	/**
-	 * Returns the parent context or <code>null</code> if 
-	 * this is the root of the evaluation context hierarchy.
-	 * 
-	 * @return the parent evaluation context or <code>null</code>
-	 */
-	public IEvaluationContext getParent();
-	
-	/**
-	 * Returns the root evaluation context.
-	 * 
-	 * @return the root evaluation context
-	 */
-	public IEvaluationContext getRoot();
-	
-	/**
-	 * Returns the default variable.
-	 * 
-	 * @return the default variable or <code>null</code> if
-	 *  no default variable is managed.
-	 */
-	public Object getDefaultVariable();
-	
-	/**
-	 * Adds a new named variable to this context. If a variable
-	 * with the name already exists the new one overrides the
-	 * existing one.
-	 * 
-	 * @param name the variable's name
-	 * @param value the variable's value
-	 */
-	public void addVariable(String name, Object value);
-	
-	/**
-	 * Removes the variable managed under the given name
-	 * from this evaluation context.
-	 * 
-	 * @param name the variable's name
-	 * @return the currently stored value or <code>null</code> if
-	 *  the variable doesn't exist
-	 */
-	public Object removeVariable(String name);
-	
-	/**
-	 * Returns the variable managed under the given name.
-	 * 
-	 * @param name the variable's name
-	 * @return the variable's value or <code>null</code> if the content
-	 *  doesn't manage a variable with the given name 
-	 */
-	public Object getVariable(String name);
-	
-	/**
-	 * Resolves a variable for the given name and arguments. This
-	 * method can be used to dynamically resolve variable such as
-	 * plug-in descriptors, resources, etc. The method is used
-	 * by the <code>resolve</code> expression.
-	 * 
-	 * @param name the variable to resolve
-	 * @param args an object array of arguments used to resolve the
-	 *  variable
-	 * @return the variable's value or <code>null</code> if no variable
-	 *  can be resolved for the given name and arguments
-	 * @exception CoreException if an errors occurs while resolving
-	 *  the variable
-	 */
-	public Object resolveVariable(String name, Object[] args) throws CoreException;
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/IPropertyTester.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/IPropertyTester.java
deleted file mode 100644
index d360a56..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/IPropertyTester.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A property tester can be used to add additional properties to test to an 
- * existing type.
- * <p>
- * This interface is not intended to be implemented by clients. Clients
- * should subclass type <code>PropertyTester</code>.
- * </p>
- * 
- * @since 3.0
- */
-public interface IPropertyTester {
-
-	/**
-	 * Returns whether the property tester can handle the given
-	 * property or not.
-	 * 
-	 * @param namespace the name space to be considered
-	 * @param property the property to test
-	 * @return <code>true</code> if the tester provides an implementation
-	 *  for the given property; otherwise <code>false</code> is returned
-	 */
-	public boolean handles(String namespace, String property);
-	
-	/**
-	 * Returns whether the implementation class for this property tester is
-	 * loaded or not.
-	 * 
-	 * @return <code>true</code>if the implementation class is loaded; 
-	 *  <code>false</code> otherwise
-	 */
-	public boolean isInstantiated();
-	
-	/**
-	 * Returns <code>true</code> if the implementation class of this property
-	 * tester can be loaded. This is the case if the plug-in providing
-	 * the implementation class is active. Returns <code>false</code> otherwise.
-	 * 
-	 * @return whether the implementation class can be loaded or not
-	 */
-	public boolean isDeclaringPluginActive();
-	
-	/**
-	 * Loads the implementation class for this property tester and returns an
-	 * instance of this class.
-	 * 
-	 * @return an instance of the implementation class for this property tester
-	 * 
-	 * @throws CoreException if the implementation class cannot be loaded
-	 */
-	public IPropertyTester instantiate() throws CoreException;
-	
-	/**
-	 * Executes the property test determined by the parameter <code>property</code>. 
-	 * 
-	 * @param receiver the receiver of the property test
-	 * @param property the property to test
-	 * @param args additional arguments to evaluate the property. If no arguments
-	 *  are specified in the <code>test</code> expression an array of length 0
-	 *  is passed
-	 * @param expectedValue the expected value of the property. The value is either 
-	 *  of type <code>java.lang.String</code> or a boxed base type. If no value was
-	 *  specified in the <code>test</code> expressions then <code>null</code> is passed
-	 * 
-	 * @return returns <code>true<code> if the property is equal to the expected value; 
-	 *  otherwise <code>false</code> is returned
-	 */
-	public boolean test(Object receiver, String property, Object[] args, Object expectedValue);
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/IVariableResolver.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/IVariableResolver.java
deleted file mode 100644
index 662627d..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/IVariableResolver.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A variable resolver can be used to add additional variable resolving
- * strategies to an {@link EvaluationContext}.
- * 
- * @see org.eclipse.core.expressions.EvaluationContext#resolveVariable(String, Object[])
- * 
- * @since 3.0
- */
-public interface IVariableResolver {
-
-	/**
-	 * Resolves a variable for the given name and arguments. The
-	 * handler is allowed to return <code>null</code> to indicate
-	 * that it is not able to resolve the requested variable.
-	 * 
-	 * @param name the variable to resolve
-	 * @param args an object array of arguments used to resolve the
-	 *  variable
-	 * @return the variable's value or <code>null</code> if no variable
-	 *  could be resolved
-	 * @exception CoreException if an errors occurs while resolving
-	 *  the variable
-	 */
-	public Object resolve(String name, Object[] args) throws CoreException;
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/PropertyTester.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/PropertyTester.java
deleted file mode 100644
index d9fea40..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/PropertyTester.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.core.expressions;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-
-import org.eclipse.core.internal.expressions.PropertyTesterDescriptor;
-
-import org.osgi.framework.Bundle;
-
-/**
- * Abstract superclass of all property testers. Implementation classes of
- * the extension point <code>org.eclipse.core.expresssions.propertyTesters
- * </code> must extend <code>PropertyTester</code>.
- * <p>
- * A property tester implements the property tests enumerated in the property
- * tester extension point. For the following property test extension
- * <pre>
- *   &lt;propertyTester
- *     	 namespace="org.eclipse.jdt.core"
- *       id="org.eclipse.jdt.core.IPackageFragmentTester"
- *       properties="isDefaultPackage"
- *       type="org.eclipse.jdt.core.IPackageFragment"
- *       class="org.eclipse.demo.MyPackageFragmentTester"&gt;
- *     &lt;/propertyTester&gt;
- * </pre>
- * the corresponding implementation class looks like:
- * <pre>
- *   public class MyPackageFragmentTester {
- *       public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
- *           IPackageFragment fragement= (IPackageFragment)receiver;
- *	         if ("isDefaultPackage".equals(property)) { 
- *               return expectedValue == null
- *               	? fragement.isDefaultPackage()
- *               	: fragement.isDefaultPackage() == ((Boolean)expectedValue).booleanValue();
- *           }
- *           Assert.isTrue(false);
- *           return false;
- *       }
- *   }
- * </pre>
- * The property can then be used in a test expression as follows:
- * <pre>
- *   &lt;instanceof value="org.eclipse.core.IPackageFragment"/&gt;
- *   &lt;test property="org.eclipse.jdt.core.isDefaultPackage"/&gt;
- * </pre>
- * </p>
- * @since 3.0 
- */
-public abstract class PropertyTester implements IPropertyTester {
-	
-	private IConfigurationElement fConfigElement;
-	private String fNamespace;
-	private String fProperties;
-	
-	/**
-	 * Initialize the property tester with the given name space and property.
-	 * <p>
-	 * Note: this method is for internal use only. Clients must not call 
-	 * this method.
-	 * </p>
-	 * @param descriptor the descriptor object for this tester
-	 */
-	public final void internalInitialize(PropertyTesterDescriptor descriptor) { 
-		fProperties= descriptor.getProperties();
-		fNamespace= descriptor.getNamespace();
-		fConfigElement= descriptor.getConfigurationElement();
-	}
-	
-	/**
-	 * Note: this method is for internal use only. Clients must not call 
-	 * this method.
-	 * 
-	 * @return the property tester descriptor
-	 */
-	public final PropertyTesterDescriptor internalCreateDescriptor() {
-		return new PropertyTesterDescriptor(fConfigElement, fNamespace, fProperties);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public final boolean handles(String namespace, String property) {
-		return fNamespace.equals(namespace) && fProperties.indexOf("," + property + ",") != -1;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public final boolean isInstantiated() {
-		return true;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public boolean isDeclaringPluginActive() {
-		Bundle fBundle= Platform.getBundle(fConfigElement.getNamespace());
-		return fBundle.getState() == Bundle.ACTIVE;		
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public final IPropertyTester instantiate() {
-		return this;
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/package.html b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/package.html
deleted file mode 100644
index b1a0ba4..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/expressions/package.html
+++ /dev/null
@@ -1,270 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<title>Package-level Javadoc</title>
-<link rel="stylesheet" href="http://dev.eclipse.org/default_style.css"
-	type="text/css">
-</head>
-<body style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0)">
-Application programming interfaces for the expression language. 
-<h2>Package Specification</h2>
-The package provides API and implementation classes to define a unified
-XML expression language to be used in extension points. The expression
-language isn't bound to one specific extension point. It can be used in
-all extension points which have to define some sort of enablement
-expression.
-<h3>XML expression language</h3>
-The XML expression language consists of the following predefined
-expression tags. The set is open and can be extended by an extension
-point provider to customize the expression language to its need.
-<p><i><u>Boolean operators</u></i></p>
-<p>The expression language provides standard expressions for the Boolean
-operators and, or and not.</p>
-<p><i><u>Instanceof expression</u></i></p>
-<p>The most frequently used check in current extension points is one to
-test if an object conforms to a certain type. The common XML expression
-language provides a special XML element to represent instance of checks.
-A typical usage looks as follows:</p>
-<blockquote><pre>&lt;instanceof value="org.eclipse.jdt.core.IJavaElement"/&gt;</pre>
-</blockquote>
-<p>The above expression tests, if the object under inspection (in most
-cases the element selected in the user interface) is of instance
-"org.eclipse.jdt.core.IJavaElement".</p>
-<p><a name="test_expression0"><i><u>Test expression</u></i></a></p>
-<p>Besides instance of checks the new expression language defines an
-extensible &lt;test&gt; element to support property testing. The
-&lt;test&gt; element is comparable to the &lt;filter&gt; element used in
-Platform/UI. The test element is used as follows:</p>
-<blockquote><pre>&lt;and&gt;
-  &lt;instanceof value="org.eclipse.core.resources.IFile"/&gt;
-  &lt;test property="org.demo.matchesPattern" value="*.html"/&gt;
-&lt;/and&gt;</pre></blockquote>
-<p>The above expression evaluates to true if the object under inspection
-is of type "org.eclipse.core.resources.IFile" and its file name matches
-the pattern "*.html". But who actually provides the code to do the name
-pattern test? Predefining a set of properties to test is too limiting.
-The set of tests must be open. Property testers are added to the system
-using a special extension point <span style="font-family: monospace">propertyTesters</span>.
-The above matchesPattern property is added to the system in the
-following way:</p>
-<pre style="margin-left: 40px">&lt;extension point="org.eclipse.core.expressions.propertyTesters"&gt;
-    &lt;propertyTester
-        id="org.eclipse.jdt.ui.IResourceTypeExtender"
-        type="org.eclipse.core.resources.IResource"
-        namespace="org.demo"
-        properties="matchesPattern, ...."
-        class="org.eclipse....ResourcePropertyTester"&gt;
-     &lt;/propertyTester&gt;
-&lt;/extension&gt;</pre>
-<p>The major characteristics of the extensible test mechanism are:</p>
-<ul>
-	<li>types are enriched with new properties using a property tester,
-	meaning that the code of the actual property test is provided by a
-	different class.</li>
-	<li>a property tester implements a set of properties.</li>
-	<li>property testers and their properties are defined in XML as
-	extension points. This is required to check if an extender provides a
-	property without having to activate it (e.g. load the plug-in).</li>
-	<li>properties belong to a name space. This ensures that two sibling
-	plug-ins can define the same property without causing any ambiguity. If
-	a property is defined more than once for a name space then one of the
-	testers is randomly chosen to test the property. Inheritance only
-	works within the same name space. If, for example, there is a property
-	<span style="font-family: monospace">isPublic</span> defined in the
-	namespace <code>org.myNamespace</code> for type <code>org.eclipse.core.IMethod</code>
-	then this property will not override the property <span
-		style="font-family: monospace">isPublic</span> in the namespace <code>org.yourNamespace</code>
-	for type <code>org.eclipse.core.IMember</code>.&nbsp;</li>
-	<li>testing for an unknown property results in a core exception. This
-	is a programming error.</li>
-</ul>
-<p>The attributes of the propertyTester element have the following
-meaning:</p>
-<ul>
-	<li>id: a unique id</li>
-	<li>type: the type which gets "enriched" with new methods</li>
-	<li>namespace: the name space the properties belong to</li>
-	<li>properties: the comma separated list of properties provided by the
-	tester.</li>
-	<li>class: the implementing class</li>
-</ul>
-<p>The concrete implementation for the above property tester looks like
-this:</p>
-<blockquote><pre><font size="-1">public class ResourcePropertyTester extends PropertyTester {
-  private static final String PROPERTY_MATCHES_PATTERN= "matchesPattern"; //$NON-NLS-1$
-
-
-
-  public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
-    IResource resource= (IResource)receiver;
-    if (PROPERTY_MATCHES_PATTERN.equals(method)) {
-      String fileName= resource.getName();
-      StringMatcher matcher= new StringMatcher((String)expectedValue, false, false);
-      return expectedValue == null
-          ? matcher.match(fileName)
-          : matcher.match(filename) == ((Boolean)expectedValue).booleanValue();
-    } else if (...) {
-    }
-    Assert.isTrue(false);
-    return false;
-  }
-</font>}</pre></blockquote>
-<p>The string value provided by the value attribute is converted into a
-Java object using the following rules:</p>
-<ul>
-	<li>the string &quot;true&quot; is converted into Boolean.TRUE</li>
-	<li>the string &quot;false&quot; is converted into Boolean.FALSE</li>
-	<li>if the string contains a dot then the interpreter tries to convert
-	the value into a Float object. If this fails the string is treated as a
-	java.lang.String</li>
-	<li>if the string only consists of numbers then the interpreter
-	converts the value in an Integer object.</li>
-	<li>in all other cases the string is treated as a java.lang.String</li>
-	<li>the conversion of the string into a Boolean, Float, or Integer can
-	be suppressed by surrounding the string with single quotes. For
-	example, the attribute value=&quot;'true'&quot; is converted into the
-	string &quot;true&quot;</li>
-</ul>
-<p>Sometimes a property test needs additional arguments to determine the
-exact property to test. If this is the case the arguments can be passed
-using the additional args attribute. An example which validates a name
-using the method IWorkspace.validateName looks as follows:</p>
-<blockquote><pre>&lt;test property="org.demo.validateName" args=&quot;/org.eclipse.demo/A.java, FILE&quot;/&gt;</pre></blockquote>
-<p><i><u>With expression</u></i></p>
-<p>Test expressions don't allow to specify the object they inspect. They
-work on a default object, which for most extension points is the object
-selected in the user interface. However, the enablement logic of some
-extension points need to test other objects as well. For example a Java
-refactoring participant tests if the list of affected projects contains
-a project with the Java nature:</p>
-<blockquote><pre>&lt;with variable="affectedProjects"&gt;
-    &lt;iterate operator=&quot;or&quot;&gt;
-        &lt;test property=&quot;org.demo.projectNature&quot; value=&quot;org.eclipse.jdt.core.javanature&quot;/&gt;
-    &lt;/iterate&gt;
-&lt;/with&gt;</pre></blockquote>
-<p>The plug-in that evaluates the extension point is responsible for
-providing the set of available variables. For example, the code that
-evaluates refactoring participants provides the follow variables:</p>
-<ul>
-	<li><i>selection:</i> its value is a collection containing the objects
-	to be refactored</li>
-	<li><i>affectedProjects</i>: its value is a collection containing the
-	projects affected by the refactoring</li>
-	<li><i>defaultVariable</i>: will be used if no with expression element
-	is active. Is an alias for the variable selection.</li>
-</ul>
-<p>If the variable doesn't exist, the with expression will throw a core
-exception.</p><p><u><i>Resolve expression</i></u></p>
-<p>The resolve expression is comparable to the with expression, but it allows resolving the variable dynamically and to pass additional arguments needed to resolve the argument. For example to resolve the plug-in descriptor for a specific plug-in the following XML element can be used:</p>
-<blockquote><pre>&lt;resolve variable="pluginDescriptor" args=&quot;org.eclipse.core.runtime&quot;&gt;
-    &lt;test property="org.demo.isActive"/&gt;
-&lt;/adapt&gt;</pre></blockquote>
-<p>The actual resolving is delegated to the evaluation context used to evaluate the expressions. See below on how to evaluate an expression and how to create an evaluation context.</p>
-<p><u><i>Adapt expression</i></u></p>
-<p>The adapt expression can be used to adapt the object to be inspected
-to an object of a different type using the adapter mechanism provided by
-the platform. The example below adapts the object to be inspected to an
-IType and then checks if the type is public:</p>
-<blockquote><pre>&lt;adapt type="org.eclipse.jdt.core.IType"&gt;
-    &lt;test property="org.demo.isPrivate"/&gt;
-&lt;/adapt&gt;</pre></blockquote>
-<p>Like the with expression the adapt expression changes the object to
-inspect for all its children. The new object is the one returned from
-IAdapter.getAdapter(). If the adaption fails, the expression evaluates
-to false.</p>
-<p>The adapt expression is implemented based on the IAdapterManager API
-<code>hasAdapter(Object, String)</code> and <code>getAdapter(Object, String)</code>.
-This ensures that the right class loader is taken to convert the type name into a
-corresponding Class object.
-However, using this API requires that the adapter factory providing the actual adapter
-is registered in XML using the extension point &quot;org.eclipse.core.runtime.adapters&quot;.
-Assuming that there is an adapter that converts resources with the extension .java into IType objects,
-the adapter must be declared in XML to make the above adapt expression work correctly.
-The corresponding adapter definition looks like this:</p>
-<blockquote><pre>&lt;extension point=&quot;org.eclipse.core.runtime.adapters&quot;&gt;
-  &lt;factory 
-    class=&quot;org.demo.MyAdapterFactory&quot; 
-    adaptableType=&quot;org.eclipse.core.resources.IFile&quot;&gt;
-    &lt;adapter type=&quot;org.eclipse.jdt.core.IType&quot;/&gt;
-  &lt;/factory&gt;
-&lt;/extension&gt;</pre></blockquote>
-<p><u><i>SytemTest expression</i></u></p>
-<p>There is a special XML element to test system properties.</p>
-<blockquote>
-<p><code>&lt;systemTest property="os.name" value="Windows XP"/&gt;<br>
-&lt;systemTest property="os.version" value="5.1"/&gt;</code></p>
-</blockquote>
-<p><u><i>Dealing with collection of elements</i></u></p>
-<p>Several expressions are evaluated on a collection of objects (for
-example refactoring participants, menu contributions, ...). Up to now, the
-iteration over collections was implicitly coded into the enclosing XML
-element, which isn't part of the expression itself. The new mechanism
-provides explicit expression elements to deal with collections of
-objects. The following element</p>
-<blockquote><pre>&lt;count value="*"/&gt;</pre></blockquote>
-<p>is used to check the number of objects in a collection, and the syntax
-of the attribute value is equal to the enablesFor attribute used for
-object contributions. To iterate over a collection, an element</p>
-<blockquote><pre>&lt;iterate operator="..."&gt;</pre></blockquote>
-<p>is provided. The operator attribute can either be "and" or "or". It
-determines how the evaluation results of all objects in the list are
-combined. The default operator is "and". Using these expression the
-enablement of a typical contribution can be described as follows:</p>
-<blockquote><pre>&lt;with variable="selection"&gt;<br>  &lt;count value="+"/&gt;<br>  &lt;iterate operator="and"/&gt;<br>    &lt;adapt type="org.eclipse.core.resources.IFile"&gt;<br>       &lt;test property="matchesName" value="*.gif"/&gt;<br>       &lt;test property="canDelete"/&gt;<br>    &lt;/adapt&gt;<br>  &lt;/iterate&gt;<br>&lt;/with&gt;</pre>
-</blockquote>
-<p>The expression only evaluates to true if the selection contains one
-or more objects and all objects fulfill the expression defined by the
-adapt element.</p>
-<p><u><i>Enablement expression</i></u></p>
-<p>XML expressions are mostly used to define the availability of an
-extension point contribution. To separate the expression from other
-child elements the common expression language provides an enablement
-element. Its use is as follows:</p>
-<blockquote><pre>&lt;renameParticipant<br>   id="launchConfigUpdater"<br>   class="org.eclipse...LaunchConfigUpdater"&gt;<br>   &lt;enablement&gt;<br>    ...<br>   &lt;/enablement&gt;<br>&lt;/renameParticipant&gt;</pre>
-</blockquote>
-<p>Most of the time child expression will be combined using the and
-operator. To avoid deep nesting XML "and" will be the default for
-combining children. It can therefore be omitted. The same applies to the
-adapt, iterate, and enablement expression defined in the following
-sections.</p>
-<p><u><i>Extension Point Schema</i></u></p>
-
-<p>An extension point schema exists for the property tester extension
-point and for the expression language itself. The schema for the 
-expression language can be included into other schema files using
-the following include element:
-</p>
-<blockquote><pre>
-&lt;include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/&gt;
-</pre></blockquote>
-<p><a name="converting"><u><i>Converting XML elements into expressions</i></u></a></p>
-<p>XML elements can be converted into corresponding expression objects using the class ExpressionConverter.
-If only expression tags from the common expression language are used, then the standard expression converter can be used.
-The following example converts the configuration element representing an enablement element into an expression:</p>
-<blockquote>
-<p><code>IConfigurationElement enablementElement= ...;<br>
-Expression expression=
-ExpressionConverter.getDefault().perform(enablementElement);</code></p>
-</blockquote>
-<p><i><u>Evaluating an expression</u></i></p>
-<p>Expressions are evaluated by calling <code>Expression.evaluate(...);</code>. The evaluation 
-context passed to the evaluate method has to be set up by the plug-in that reads an extension point. 
-The plug-in is responsible to set up the default variable and all the other variable used in 
-with expressions. The example below creates a special evaluation context and uses this context to 
-evaluate an expression:
-</p><blockquote>
-<pre>
-<code>
-EvaluationContext context= new EvaluationContext(null, defaultVariable) {
-    public Object resolveVariable(String name, Object[] args) throws CoreException {
-        // do special resolving
-    }
-}</code></pre>
-</blockquote>
-<p>The actual evaluation is done by calling:</p>
-<blockquote><pre>
-<code>
-EvaluationResult= expression.evaluate(context);</code></pre></blockquote>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AdaptExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AdaptExpression.java
deleted file mode 100644
index 609f859..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AdaptExpression.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public class AdaptExpression extends CompositeExpression {
-
-	private static final String ATT_TYPE= "type"; //$NON-NLS-1$
-	
-	private String fTypeName;
-	
-	public AdaptExpression(IConfigurationElement configElement) throws CoreException {
-		fTypeName= configElement.getAttribute(ATT_TYPE);
-		Expressions.checkAttribute(ATT_TYPE, fTypeName);
-	}
-	
-	public AdaptExpression(String typeName) {
-		Assert.isNotNull(typeName);
-		fTypeName= typeName;
-	}
-	
-	/* (non-Javadoc)
-	 * @see Expression#evaluate(IVariablePool)
-	 */
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		if (fTypeName == null)
-			return EvaluationResult.FALSE;
-		Object var= context.getDefaultVariable();
-		Object adapted= null;
-		if (Expressions.isInstanceOf(var, fTypeName)) {
-			adapted= var;
-		} else {
-			IAdapterManager manager= Platform.getAdapterManager();
-			if (!manager.hasAdapter(var, fTypeName))
-				return EvaluationResult.FALSE;
-		
-			adapted= manager.getAdapter(var, fTypeName);
-		}
-		// the adapted result is null but hasAdapter returned true. This means
-		// that there is an adapter but the adapter isn't loaded yet.
-		if (adapted == null) 
-			return EvaluationResult.NOT_LOADED;
-		return evaluateAnd(new DefaultVariable(context, adapted));
-	}
-	
-	public void collectExpressionInfo(ExpressionInfo info) {
-		// Although the default variable is passed to the children of this
-		// expression as an instance of the adapted type it is OK to only
-		// mark a default variable access.
-		info.markDefaultVariableAccessed();
-		super.collectExpressionInfo(info);
-	}	
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AndExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AndExpression.java
deleted file mode 100644
index aa4315a..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AndExpression.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.IEvaluationContext;
-
-public class AndExpression extends CompositeExpression { 
-
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		return evaluateAnd(context);
-	}	
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Assert.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Assert.java
deleted file mode 100644
index 61956a6..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Assert.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-/**
- * <code>Assert</code> is useful for for embedding runtime sanity checks
- * in code.
- * The predicate methods all test a condition and throw some
- * type of unchecked exception if the condition does not hold.
- * <p>
- * Assertion failure exceptions, like most runtime exceptions, are
- * thrown when something is misbehaving. Assertion failures are invariably
- * unspecified behavior; consequently, clients should never rely on
- * these being thrown (and certainly should not being catching them
- * specifically).
- * </p>
- */
-public final class Assert {
-	
-	/* This class is not intended to be instantiated. */
-	private Assert() {
-		// not allowed
-	}
-	/** Asserts that an argument is legal. If the given boolean is
-	 * not <code>true</code>, an <code>IllegalArgumentException</code>
-	 * is thrown.
-	 *
-	 * @param expression the outcode of the check
-	 * @return <code>true</code> if the check passes (does not return
-	 *    if the check fails)
-	 * @exception IllegalArgumentException if the legality test failed
-	 */
-	public static boolean isLegal(boolean expression) {
-		return isLegal(expression, ""); //$NON-NLS-1$
-	}
-	/** Asserts that an argument is legal. If the given boolean is
-	 * not <code>true</code>, an <code>IllegalArgumentException</code>
-	 * is thrown.
-	 * The given message is included in that exception, to aid debugging.
-	 *
-	 * @param expression the outcode of the check
-	 * @param message the message to include in the exception
-	 * @return <code>true</code> if the check passes (does not return
-	 *    if the check fails)
-	 * @exception IllegalArgumentException if the legality test failed
-	 */
-	public static boolean isLegal(boolean expression, String message) {
-		if (!expression)
-			throw new IllegalArgumentException(message);
-		return expression;
-	}
-	/** Asserts that the given object is not <code>null</code>. If this
-	 * is not the case, some kind of unchecked exception is thrown.
-	 * 
-	 * @param object the value to test
-	 * @exception IllegalArgumentException if the object is <code>null</code>
-	 */
-	public static void isNotNull(Object object) {
-		isNotNull(object, ""); //$NON-NLS-1$
-	}
-	/** Asserts that the given object is not <code>null</code>. If this
-	 * is not the case, some kind of unchecked exception is thrown.
-	 * The given message is included in that exception, to aid debugging.
-	 *
-	 * @param object the value to test
-	 * @param message the message to include in the exception
-	 * @exception IllegalArgumentException if the object is <code>null</code>
-	 */
-	public static void isNotNull(Object object, String message) {
-		if (object == null)
-			throw new AssertionFailedException("null argument:" + message); //$NON-NLS-1$
-	}
-	/** Asserts that the given boolean is <code>true</code>. If this
-	 * is not the case, some kind of unchecked exception is thrown.
-	 *
-	 * @param expression the outcode of the check
-	 * @return <code>true</code> if the check passes (does not return
-	 *    if the check fails)
-	 */
-	public static boolean isTrue(boolean expression) {
-		return isTrue(expression, ""); //$NON-NLS-1$
-	}
-	/** Asserts that the given boolean is <code>true</code>. If this
-	 * is not the case, some kind of unchecked exception is thrown.
-	 * The given message is included in that exception, to aid debugging.
-	 *
-	 * @param expression the outcode of the check
-	 * @param message the message to include in the exception
-	 * @return <code>true</code> if the check passes (does not return
-	 *    if the check fails)
-	 */
-	public static boolean isTrue(boolean expression, String message) {
-		if (!expression)
-			throw new AssertionFailedException("assertion failed: " + message); //$NON-NLS-1$
-		return expression;
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AssertionFailedException.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AssertionFailedException.java
deleted file mode 100644
index 16358e0..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/AssertionFailedException.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-/**
- * <code>AssertionFailedException</code> is a runtime exception thrown
- * by some of the methods in <code>Assert</code>.
- * <p>
- * This class is not declared public to prevent some misuses; programs that catch 
- * or otherwise depend on assertion failures are susceptible to unexpected
- * breakage when assertions in the code are added or removed.
- * </p>
- */
-/* package */
-class AssertionFailedException extends RuntimeException {
-	
-	/** This class is not intended to be serialized. */
-	private static final long serialVersionUID= 1L;
-
-	/** 
-	 * Constructs a new exception.
-	 */
-	public AssertionFailedException() {
-		super();
-	}
-	
-	/** 
-	 * Constructs a new exception with the given message.
-	 * 
-	 * @param detail the detail message
-	 */
-	public AssertionFailedException(String detail) {
-		super(detail);
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CompositeExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CompositeExpression.java
deleted file mode 100644
index d8e89b1..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CompositeExpression.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public abstract class CompositeExpression extends Expression {
-
-	private static final Expression[] EMPTY_ARRAY= new Expression[0]; 
-	
-	protected List fExpressions;
-	
-	public void add(Expression expression) {
-		if (fExpressions == null)
-			fExpressions= new ArrayList(2);
-		fExpressions.add(expression);
-	}
-	
-	public Expression[] getChildren() {
-		if (fExpressions == null)
-			return EMPTY_ARRAY;
-		return (Expression[])fExpressions.toArray(new Expression[fExpressions.size()]);
-	}
-	
-	protected EvaluationResult evaluateAnd(IEvaluationContext scope) throws CoreException {
-		if (fExpressions == null)
-			return EvaluationResult.TRUE;
-		EvaluationResult result= EvaluationResult.TRUE;
-		for (Iterator iter= fExpressions.iterator(); iter.hasNext();) {
-			Expression expression= (Expression)iter.next();
-			result= result.and(expression.evaluate(scope));
-			// keep iterating even if we have a not loaded found. It can be
-			// that we find a false which will result in a better result.
-			if (result == EvaluationResult.FALSE)
-				return result;
-		}
-		return result;
-	}
-	
-	protected EvaluationResult evaluateOr(IEvaluationContext scope) throws CoreException {
-		if (fExpressions == null)
-			return EvaluationResult.TRUE;
-		EvaluationResult result= EvaluationResult.FALSE;
-		for (Iterator iter= fExpressions.iterator(); iter.hasNext();) {
-			Expression expression= (Expression)iter.next();
-			result= result.or(expression.evaluate(scope));
-			if (result == EvaluationResult.TRUE)
-				return result;
-		}
-		return result;
-	}
-	
-	public void collectExpressionInfo(ExpressionInfo info) {
-		if (fExpressions == null)
-			return;
-		for (Iterator iter= fExpressions.iterator(); iter.hasNext();) {
-			Expression expression= (Expression)iter.next();
-			expression.collectExpressionInfo(info);
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CountExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CountExpression.java
deleted file mode 100644
index 97a56f5..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/CountExpression.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-
-public class CountExpression extends Expression {
-
-	private static final int ANY_NUMBER=	5;
-	private static final int EXACT=			4;
-	private static final int ONE_OR_MORE=	3;
-	private static final int NONE_OR_ONE= 	2;
-	private static final int NONE= 			1;
-	private static final int UNKNOWN= 		0;
-	
-	private int fMode;
-	private int fSize;
-	
-	public CountExpression(IConfigurationElement configElement) {
-		String size = configElement.getAttribute(ATT_VALUE);
-		initializeSize(size);
-	}
-	
-	public CountExpression(String size) {
-		initializeSize(size);
-	}
-	
-	private void initializeSize(String size) {
-		if (size == null)
-			size= "*"; //$NON-NLS-1$
-		if (size.equals("*")) //$NON-NLS-1$
-			fMode= ANY_NUMBER;
-		else if (size.equals("?")) //$NON-NLS-1$
-			fMode= NONE_OR_ONE;
-		else if (size.equals("!")) //$NON-NLS-1$
-			fMode= NONE;
-		else if (size.equals("+")) //$NON-NLS-1$
-			fMode= ONE_OR_MORE;
-		else {
-			try {
-				fSize= Integer.parseInt(size);
-				fMode= EXACT;
-			} catch (NumberFormatException e) {
-				fMode= UNKNOWN;
-			}
-		}
-	}
-
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Object var= context.getDefaultVariable();
-		Expressions.checkCollection(var, this);
-		Collection collection= (Collection)var;
-		int size= collection.size();
-		switch (fMode) {
-			case UNKNOWN:
-				return EvaluationResult.FALSE;
-			case NONE:
-				return EvaluationResult.valueOf(size == 0);
-			case NONE_OR_ONE:
-				return EvaluationResult.valueOf(size == 0 || size == 1);
-			case ONE_OR_MORE:
-				return EvaluationResult.valueOf(size >= 1);
-			case EXACT:
-				return EvaluationResult.valueOf(fSize == size);
-			case ANY_NUMBER:
-				return EvaluationResult.TRUE;
-		}
-		return EvaluationResult.FALSE;
-	}
-
-	public void collectExpressionInfo(ExpressionInfo info) {
-		info.markDefaultVariableAccessed();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/DefaultVariable.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/DefaultVariable.java
deleted file mode 100644
index 90ea311..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/DefaultVariable.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.expressions.IEvaluationContext;
-
-/**
- * An evaluation context that can be used to add a new default variable
- * to a hierarchy of evaluation contexts.
- * 
- * @since 3.0
- */
-public final class DefaultVariable implements IEvaluationContext {
-
-	private Object fDefaultVariable;
-	private IEvaluationContext fParent;
-	private IEvaluationContext fManagedPool;
-	
-	/**
-	 * Constructs a new variable pool for a single default variable.
-	 * 
-	 * @param parent the parent context for the default variable. Must not 
-	 *  be <code>null</code>.
-	 * @param defaultVariable the default variable
-	 */
-	public DefaultVariable(IEvaluationContext parent, Object defaultVariable) {
-		Assert.isNotNull(parent);
-		Assert.isNotNull(defaultVariable);
-		fParent= parent;
-		while (parent instanceof DefaultVariable) {
-			parent= parent.getParent();
-		}
-		fManagedPool= parent;
-		fDefaultVariable= defaultVariable;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public IEvaluationContext getParent() {
-		return fParent;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public IEvaluationContext getRoot() {
-		return fParent.getRoot();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object getDefaultVariable() {
-		return fDefaultVariable;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void addVariable(String name, Object value) {
-		fManagedPool.addVariable(name, value);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object removeVariable(String name) {
-		return fManagedPool.removeVariable(name);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object getVariable(String name) {
-		return fManagedPool.getVariable(name);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object resolveVariable(String name, Object[] args) throws CoreException {
-		return fManagedPool.resolveVariable(name, args);
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EnablementExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EnablementExpression.java
deleted file mode 100644
index 11ebaa9..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EnablementExpression.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.IEvaluationContext;
-
-public class EnablementExpression extends CompositeExpression {
-
-	public EnablementExpression(IConfigurationElement configElement) {
-		// config element not used yet.
-	}
-	
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		long start= 0;
-		if (Expressions.TRACING)
-			start= System.currentTimeMillis();
-		EvaluationResult result= evaluateAnd(context);
-		if (Expressions.TRACING) {
-			System.out.println("[Enablement Expression] - evaluation time: " + //$NON-NLS-1$
-				(System.currentTimeMillis() - start) + " ms."); //$NON-NLS-1$
-		}
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EqualsExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EqualsExpression.java
deleted file mode 100644
index d699505..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/EqualsExpression.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public class EqualsExpression extends Expression {
-
-	private Object fExpectedValue; 
-	
-	public EqualsExpression(Object expectedValue) {
-		Assert.isNotNull(expectedValue);
-		fExpectedValue= expectedValue;
-	}
-	
-	public EqualsExpression(IConfigurationElement element) throws CoreException {
-		String value= element.getAttribute(ATT_VALUE);
-		Expressions.checkAttribute(ATT_VALUE, value);
-		fExpectedValue= Expressions.convertArgument(value);
-	}
-	
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Object element= context.getDefaultVariable();
-		return EvaluationResult.valueOf(element.equals(fExpectedValue));
-	}
-
-	public void collectExpressionInfo(ExpressionInfo info) {
-		info.markDefaultVariableAccessed();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionMessages.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionMessages.java
deleted file mode 100644
index 67063b3..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionMessages.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.core.internal.expressions;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class ExpressionMessages extends NLS {
-
-	private static final String BUNDLE_NAME= "org.eclipse.core.internal.expressions.ExpressionMessages";//$NON-NLS-1$
-
-	private ExpressionMessages() {
-		// Do not instantiate
-	}
-
-	public static String Expression_attribute_missing;
-	public static String Expression_attribute_invalid_value;
-	public static String Expression_variable_not_a_collection;
-	public static String Expression_variable_not_a_list;
-	public static String Expression_unknown_element;
-	public static String Expression_string_not_correctly_escaped;
-	public static String Expression_string_not_terminated;
-	public static String TypeExtender_unknownMethod;
-	public static String TypeExtender_incorrectType;
-	public static String TestExpression_no_name_space;
-	public static String WithExpression_variable_not_defined;
-	public static String ResolveExpression_variable_not_defined;
-	public static String PropertyTesterDescriptor_no_namespace;
-	public static String PropertyTesterDescritpri_no_properties;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, ExpressionMessages.class);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionMessages.properties b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionMessages.properties
deleted file mode 100644
index 62d6a79..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionMessages.properties
+++ /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
-###############################################################################
-
-Expression_attribute_missing=Mandatory attribute {0} is missing
-Expression_attribute_invalid_value=Attribute value {0} is not valid
-
-Expression_variable_not_a_collection= The default variable is not of type java.util.Collection. Failed expression: \n{0}
-Expression_variable_not_a_list= The default variable is not of type java.util.List. Failed expression: \n{0}
-
-Expression_unknown_element= Unknown expression element {0}
-
-Expression_string_not_correctly_escaped= The String {0} is not correctly escaped. Wrong number of apostrophe characters.
-Expression_string_not_terminated= The String {0} is not correctly terminated with an apostrophe character.
-
-TypeExtender_unknownMethod= No property tester contributes a property {0} to type {1}
-TypeExtender_incorrectType=The implementation class is not a sub type of org.eclipse.core.expressions.PropertyTester
-
-TestExpression_no_name_space= The property attribute of the test expression must be qualified by a name space.
-
-WithExpression_variable_not_defined= The variable {0} is not defined
-
-ResolveExpression_variable_not_defined= The variable {0} is not defined
-
-PropertyTesterDescriptor_no_namespace= The mandatory attribute namespace is missing. Tester has been disabled.
-PropertyTesterDescritpri_no_properties= The mandatory attribute properties is missing. Tester has been disabled.
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionPlugin.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionPlugin.java
deleted file mode 100644
index 6a29a57..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionPlugin.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.Plugin;
-
-import org.osgi.framework.BundleContext;
-
-public class ExpressionPlugin extends Plugin {
-	
-	private static ExpressionPlugin fgDefault;
-	
-	private BundleContext fBundleContext;
-	
-	public ExpressionPlugin() {
-		fgDefault= this;
-	}	
-
-	public static ExpressionPlugin getDefault() {
-		return fgDefault;
-	}
-	
-	public static String getPluginId() {
-		return "org.eclipse.core.expressions"; //$NON-NLS-1$
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		fBundleContext= context;
-	}
-	
-	/**
-	 * {@inheritDoc}
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-	}
-	
-	public BundleContext getBundleContext() {
-		return fBundleContext;
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionStatus.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionStatus.java
deleted file mode 100644
index 39f690b..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ExpressionStatus.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Represents the outcome of an expression evaluation. Status objects are
- * used inside {@link org.eclipse.core.runtime.CoreException} objects to 
- * indicate what went wrong.
- * 
- * @see org.eclipse.core.runtime.CoreException
- * 
- * @since 3.0
- */
-public class ExpressionStatus extends Status {
-	
-	/** Error code indicating that the variable in focus in not a collection */
-	public static final int VARIABLE_IS_NOT_A_COLLECTION= 3;
-	
-	/** Error code indicating that the variable in focus in not a list */
-	public static final int VARIABLE_IS_NOT_A_LIST= 4;
-	
-	/** Error code indicating that an attribute value doesn't present an integer */
-	public static final int VALUE_IS_NOT_AN_INTEGER= 5;
-	
-	/** Error code indicating that a mandatory attribute is missing */
-	public static final int MISSING_ATTRIBUTE= 50;
-	
-	/** Error code indicating that the value specified for an attribute is invalid */
-	public static final int WRONG_ATTRIBUTE_VALUE= 51;
-
-	/** Error code indicating that the number of arguments passed to resolve variable is incorrect. */
-	public static final int VARAIBLE_POOL_WRONG_NUMBER_OF_ARGUMENTS= 100;
-	
-	/** Error code indicating that the argument passed to resolve a variable is not of type java.lang.String */
-	public static final int VARAIBLE_POOL_ARGUMENT_IS_NOT_A_STRING= 101;
-	
-	/** Error code indicating that a plugin providing a certain type extender isn't loaded yet */ 
-	public static final int TYPE_EXTENDER_PLUGIN_NOT_LOADED= 200;
-	
-	/** Error indicating that a property referenced in a test expression can't be resolved */
-	public static final int TYPE_EXTENDER_UNKOWN_METHOD= 201;
-	
-	/** Error code indicating that the implementation class of a type extender is not of type TypeExtender */
-	public static final int TYPE_EXTENDER_INCORRECT_TYPE= 202;
-	
-	/** Error indicating that the value returned from a type extender isn't of type boolean */
-	public static final int TEST_EXPRESSION_NOT_A_BOOLEAN= 203;
-	
-	/** Error indicating that the property attribute of the test element doesn't have a name space */
-	public static final int NO_NAMESPACE_PROVIDED= 300;
-	
-	/** Error indicating that a variable accessed in a with expression isn't available in the evaluation context */
-	public static final int VARIABLE_NOT_DEFINED= 301;
-	
-	/** Error indicating that in a string passed via a arg attribute the apostrophe character isn't correctly escaped */
-	public static final int STRING_NOT_CORRECT_ESCAPED= 302;
-	
-	/** Error indicating that a string passed via a arg attribute isn't correctly terminated with an apostrophe */
-	public static final int STRING_NOT_TERMINATED= 303;
-	
-	/**
-	 * Creates a new expression status.
-	 * 
-	 * @param errorCode the error code of the status
-	 * @param message a human-readable message, localized to the current locale
-	 */
-	public ExpressionStatus(int errorCode, String message) {
-		this(errorCode, message, null);
-	}
-	
-	/**
-	 * Creates a new expression status.
-	 * 
-	 * @param errorCode the error code of the status
-	 * @param message a human-readable message, localized to the current locale
-	 * @param exception a low-level exception, or <code>null</code> if not applicable 
-	 */
-	public ExpressionStatus(int errorCode, String message, Throwable exception) {
-		super(IStatus.ERROR, ExpressionPlugin.getPluginId(), errorCode, message, exception);
-	}	
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Expressions.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Expressions.java
deleted file mode 100644
index 70a9787..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Expressions.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.expressions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-
-import org.eclipse.core.expressions.Expression;
-
-public class Expressions {
-	
-	/* debugging flag to enable tracing */
-	public static final boolean TRACING;
-	static {
-		String value= Platform.getDebugOption("org.eclipse.core.expressions/tracePropertyResolving"); //$NON-NLS-1$
-		TRACING= value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$
-	}
-	
-	private Expressions() {
-		// no instance
-	}
-	
-	public static boolean isInstanceOf(Object element, String type) {
-		// null isn't an instanceof of anything.
-		if (element == null)
-			return false;
-		return isSubtype(element.getClass(), type); 
-	}
-	
-	private static boolean isSubtype(Class clazz, String type) {
-		if (clazz.getName().equals(type))
-			return true;
-		Class superClass= clazz.getSuperclass();
-		if (superClass != null && isSubtype(superClass, type))
-			return true;
-		Class[] interfaces= clazz.getInterfaces();
-		for (int i= 0; i < interfaces.length; i++) {
-			if (isSubtype(interfaces[i], type))
-				return true;
-		} 
-		return false;
-	}
-	
-	public static void checkAttribute(String name, String value) throws CoreException {
-		if (value == null) {
-			throw new CoreException(new ExpressionStatus(
-				ExpressionStatus.MISSING_ATTRIBUTE, 
-				Messages.format(ExpressionMessages.Expression_attribute_missing, name))); 
-		}
-	}
-	
-	public static void checkAttribute(String name, String value, String[] validValues) throws CoreException {
-		checkAttribute(name, value);
-		for (int i= 0; i < validValues.length; i++) {
-			if (value.equals(validValues[i]))
-				return;
-		}
-		throw new CoreException(new ExpressionStatus(
-			ExpressionStatus.WRONG_ATTRIBUTE_VALUE, 
-			Messages.format(ExpressionMessages.Expression_attribute_invalid_value, value))); 
-	}
-	
-	public static void checkCollection(Object var, Expression expression) throws CoreException {
-		if (var instanceof Collection)
-			return;
-		throw new CoreException(new ExpressionStatus(
-			ExpressionStatus.VARIABLE_IS_NOT_A_COLLECTION, 
-			Messages.format(ExpressionMessages.Expression_variable_not_a_collection, expression.toString()))); 
-	}
-	
-	public static void checkList(Object var, Expression expression) throws CoreException {
-		if (var instanceof List)
-			return;
-		throw new CoreException(new ExpressionStatus(
-			ExpressionStatus.VARIABLE_IS_NOT_A_LIST, 
-			Messages.format(ExpressionMessages.Expression_variable_not_a_list, expression.toString()))); 
-	}
-	
-	//---- Argument parsing --------------------------------------------
-	
-	private static final Object[] EMPTY_ARGS= new Object[0];
-	
-	public static Object[] getArguments(IConfigurationElement element, String attributeName) throws CoreException {
-		String args= element.getAttribute(attributeName);
-		if (args != null) {
-			return parseArguments(args);
-		} else {
-			return EMPTY_ARGS;
-		}
-	}
-	
-	public static Object[] parseArguments(String args) throws CoreException {
-		List result= new ArrayList();
-		int start= 0;
-		int comma;
-		while ((comma= findNextComma(args, start)) != -1) {
-			result.add(convertArgument(args.substring(start, comma).trim()));
-			start= comma + 1;
-		}
-		result.add(convertArgument(args.substring(start).trim()));
-		return result.toArray();
-	}
-	
-	private static int findNextComma(String str, int start) throws CoreException {
-		boolean inString= false;
-		for (int i= start; i < str.length(); i++) {
-			char ch= str.charAt(i);
-			if (ch == ',' && ! inString) 
-				return i;
-			if (ch == '\'') {
-				if (!inString) {
-					inString= true;
-				} else {
-					if (i + 1 < str.length() && str.charAt(i + 1) == '\'') {
-						i++;
-					} else {
-						inString= false;
-					}
-				}
-			} else if (ch == ',' && !inString) {
-				return i;
-			}
-		}
-		if (inString)
-			throw new CoreException(new ExpressionStatus(
-				ExpressionStatus.STRING_NOT_TERMINATED, 
-				Messages.format(ExpressionMessages.Expression_string_not_terminated, str))); 
-			
-		return -1;
-	}
-		
-	public static Object convertArgument(String arg) throws CoreException {
-		if (arg == null) {
-			return null;
-		} else if (arg.length() == 0) {
-			return arg;
-		} else if (arg.charAt(0) == '\'' && arg.charAt(arg.length() - 1) == '\'') {
-			return unEscapeString(arg.substring(1, arg.length() - 1));
-		} else if ("true".equals(arg)) { //$NON-NLS-1$
-			return Boolean.TRUE;
-		} else if ("false".equals(arg)) { //$NON-NLS-1$
-			return Boolean.FALSE;
-		} else if (arg.indexOf('.') != -1) {
-			try {
-				return Float.valueOf(arg);
-			} catch (NumberFormatException e) {
-				return arg;
-			}
-		} else {
-			try {
-				return Integer.valueOf(arg);
-			} catch (NumberFormatException e) {
-				return arg;
-			}
-		}
-	}
-
-	public static String unEscapeString(String str) throws CoreException {
-		StringBuffer result= new StringBuffer();
-		for (int i= 0; i < str.length(); i++) {
-			char ch= str.charAt(i);
-			if (ch == '\'') {
-				if (i == str.length() - 1 || str.charAt(i + 1) != '\'')
-					throw new CoreException(new ExpressionStatus(
-						ExpressionStatus.STRING_NOT_CORRECT_ESCAPED, 
-						Messages.format(ExpressionMessages.Expression_string_not_correctly_escaped, str))); 
-				result.append('\'');
-				i++;
-			} else {
-				result.append(ch);
-			}
-		}
-		return result.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/InstanceofExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/InstanceofExpression.java
deleted file mode 100644
index c579aa3..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/InstanceofExpression.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public class InstanceofExpression extends Expression {
-
-	private String fTypeName;
-	
-	public InstanceofExpression(IConfigurationElement element) throws CoreException {
-		fTypeName= element.getAttribute(ATT_VALUE);
-		Expressions.checkAttribute(ATT_VALUE, fTypeName);
-	}
-	
-	public InstanceofExpression(String typeName) {
-		Assert.isNotNull(typeName);
-		fTypeName= typeName;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.corext.refactoring.participants.Expression#evaluate(java.lang.Object)
-	 */
-	public EvaluationResult evaluate(IEvaluationContext context) {
-		Object element= context.getDefaultVariable();
-		return EvaluationResult.valueOf(Expressions.isInstanceOf(element, fTypeName));
-	}
-	
-	public void collectExpressionInfo(ExpressionInfo info) {
-		info.markDefaultVariableAccessed();
-	}
-	
-	//---- Debugging ---------------------------------------------------
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "<instanceof value=\"" + fTypeName + "\"/>"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/IterateExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/IterateExpression.java
deleted file mode 100644
index 8e352d9..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/IterateExpression.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public class IterateExpression extends CompositeExpression {
-	
-	private static class IteratePool implements IEvaluationContext {
-		
-		private Iterator fIterator;
-		private Object fDefaultVariable;
-		private IEvaluationContext fParent;
-		
-		public IteratePool(IEvaluationContext parent, Iterator iterator) {
-			Assert.isNotNull(parent);
-			Assert.isNotNull(iterator);
-			fParent= parent;
-			fIterator= iterator;
-		}
-		public IEvaluationContext getParent() {
-			return fParent;
-		}
-		public IEvaluationContext getRoot() {
-			return fParent.getRoot();
-		}
-		public Object getDefaultVariable() {
-			return fDefaultVariable;
-		}
-		public void addVariable(String name, Object value) {
-			fParent.addVariable(name, value);
-		}
-		public Object removeVariable(String name) {
-			return fParent.removeVariable(name);
-		}
-		public Object getVariable(String name) {
-			return fParent.getVariable(name);
-		}
-		public Object resolveVariable(String name, Object[] args) throws CoreException {
-			return fParent.resolveVariable(name, args);
-		}
-		public Object next() {
-			fDefaultVariable= fIterator.next();
-			return fDefaultVariable;
-		}
-		public boolean hasNext() {
-			return fIterator.hasNext();
-		}
-	}
-	
-	private static final String ATT_OPERATOR= "operator"; //$NON-NLS-1$
-	private static final int OR= 1;
-	private static final int AND= 2;
-	
-	private int fOperator;
-	
-	public IterateExpression(IConfigurationElement configElement) throws CoreException {
-		String opValue= configElement.getAttribute(ATT_OPERATOR);
-		initializeOperatorValue(opValue);
-	}
-	
-	public IterateExpression(String opValue) throws CoreException {
-		initializeOperatorValue(opValue);
-	}
-	
-	private void initializeOperatorValue(String opValue) throws CoreException {
-		if (opValue == null) {
-			fOperator= AND;
-		} else {
-			Expressions.checkAttribute(ATT_OPERATOR, opValue, new String[] {"and", "or"});  //$NON-NLS-1$//$NON-NLS-2$
-			if ("and".equals(opValue)) { //$NON-NLS-1$
-				fOperator= AND;
-			} else {
-				fOperator= OR;
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see Expression#evaluate(IVariablePool)
-	 */
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Object var= context.getDefaultVariable();
-		Expressions.checkCollection(var, this);
-		Collection col= (Collection)var;
-		switch (col.size()) {
-			case 0:
-				return fOperator == AND ? EvaluationResult.TRUE : EvaluationResult.FALSE;
-			case 1:
-				if (col instanceof List)
-					return evaluateAnd(new DefaultVariable(context, ((List)col).get(0)));
-				// fall through
-			default:
-				IteratePool iter= new IteratePool(context, col.iterator());
-				EvaluationResult result= fOperator == AND ? EvaluationResult.TRUE : EvaluationResult.FALSE;
-				while (iter.hasNext()) {
-					iter.next();
-					switch(fOperator) {
-						case OR:
-							result= result.or(evaluateAnd(iter));
-							if (result == EvaluationResult.TRUE)
-								return result;
-							break;
-						case AND:
-							result= result.and(evaluateAnd(iter));
-							if (result != EvaluationResult.TRUE)
-								return result;
-							break;
-					}
-				}
-				return result;
-		}
-	}
-
-	public void collectExpressionInfo(ExpressionInfo info) {
-		// Although we access every single variable we only mark the default
-		// variable as accessed since we don't have single variables for the
-		// elements.
-		info.markDefaultVariableAccessed();
-		super.collectExpressionInfo(info);
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Messages.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Messages.java
deleted file mode 100644
index c17ee61..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Messages.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import java.text.MessageFormat;
-
-/**
- * Helper class to format message strings.
- * 
- * @since 3.1
- */
-public class Messages {
-
-	public static String format(String message, Object object) {
-		return MessageFormat.format(message, new Object[] { object});
-	}
-
-	public static String format(String message, Object[] objects) {
-		return MessageFormat.format(message, objects);
-	}
-
-	private Messages() {
-		// Not for instantiation
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/NotExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/NotExpression.java
deleted file mode 100644
index 02104e5..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/NotExpression.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public class NotExpression extends Expression {
-
-	private Expression fExpression;
-
-	public NotExpression(Expression expression) {
-		Assert.isNotNull(expression);
-		fExpression= expression;
-	}
-	
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		return fExpression.evaluate(context).not();
-	}
-	
-	public void collectExpressionInfo(ExpressionInfo info) {
-		fExpression.collectExpressionInfo(info);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/OrExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/OrExpression.java
deleted file mode 100644
index ae59b61..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/OrExpression.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.IEvaluationContext;
-
-public class OrExpression extends CompositeExpression { 
-
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		return evaluateOr(context);
-	}	
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Property.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Property.java
deleted file mode 100644
index 40dbb1e..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/Property.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.expressions.IPropertyTester;
-
-public class Property {
-	
-	private Class fType;
-	private String fNamespace;
-	private String fName;
-	
-	private IPropertyTester fTester;
-
-	/* package */ Property(Class type, String namespace, String name) {
-		Assert.isNotNull(type);
-		Assert.isNotNull(namespace);
-		Assert.isNotNull(name);
-		
-		fType= type;
-		fNamespace= namespace;
-		fName= name;
-	}
-	
-	/* package */ void setPropertyTester(IPropertyTester tester) {
-		Assert.isNotNull(tester);
-		fTester= tester;
-	}
-	
-	public boolean isInstantiated() {
-		return fTester.isInstantiated();
-	}
-	
-	public boolean isDeclaringPluginActive() {
-		return fTester.isDeclaringPluginActive();
-	}
-	
-	public boolean isValidCacheEntry() {
-		return 	(isInstantiated() && isDeclaringPluginActive()) ||
-				(!isInstantiated() && !isDeclaringPluginActive());
-	}
- 	
-	public boolean test(Object receiver, Object[] args, Object expectedValue) {
-		return fTester.test(receiver, fName, args, expectedValue);
-	}
-	
-	public boolean equals(Object obj) {
-		if (!(obj instanceof Property))
-			return false;
-		Property other= (Property)obj;
-		return fType.equals(other.fType) && fNamespace.equals(other.fNamespace) && fName.equals(other.fName);
-	}
-	
-	public int hashCode() {
-		return (fType.hashCode() << 16) | fNamespace.hashCode() << 8 | fName.hashCode();
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/PropertyCache.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/PropertyCache.java
deleted file mode 100644
index 5bbb1b7..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/PropertyCache.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import java.util.LinkedHashMap;
-import java.util.Map.Entry;
-
-/* package */ class PropertyCache {
-	
-	private LinkedHashMap fCache;
-	
-	public PropertyCache(final int cacheSize) {
-		// start with 100 elements but be able to grow until cacheSize
-		fCache= new LinkedHashMap(100, 0.75f, true) {
-			/** This class is not intended to be serialized. */
-			private static final long serialVersionUID= 1L;
-			protected boolean removeEldestEntry(Entry eldest) {
-				return size() > cacheSize;
-			}
-		};
-	}
-	
-	public Property get(Property key) {
-		return (Property)fCache.get(key);
-	}
-	
-	public void put(Property method) {
-		fCache.put(method, method);
-	}
-	
-	public void remove(Property method) {
-		fCache.remove(method);
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/PropertyTesterDescriptor.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/PropertyTesterDescriptor.java
deleted file mode 100644
index 3290201..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/PropertyTesterDescriptor.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.core.expressions.IPropertyTester;
-
-import org.osgi.framework.Bundle;
-
-public class PropertyTesterDescriptor implements IPropertyTester {
-	
-	private IConfigurationElement fConfigElement;
-	private String fNamespace;
-	private String fProperties;
-	
-	private static final String PROPERTIES= "properties"; //$NON-NLS-1$
-	private static final String NAMESPACE= "namespace"; //$NON-NLS-1$
-	private static final String CLASS= "class";  //$NON-NLS-1$
-	
-	public PropertyTesterDescriptor(IConfigurationElement element) throws CoreException {
-		fConfigElement= element;
-		fNamespace= fConfigElement.getAttribute(NAMESPACE);
-		if (fNamespace == null) {
-			throw new CoreException(new Status(IStatus.ERROR, ExpressionPlugin.getPluginId(),
-				IStatus.ERROR, 
-				ExpressionMessages.PropertyTesterDescriptor_no_namespace, 
-				null));
-		}
-		StringBuffer buffer= new StringBuffer(","); //$NON-NLS-1$
-		String properties= element.getAttribute(PROPERTIES);
-		if (properties == null) {
-			throw new CoreException(new Status(IStatus.ERROR, ExpressionPlugin.getPluginId(),
-				IStatus.ERROR, 
-				ExpressionMessages.PropertyTesterDescritpri_no_properties, 
-				null));
-		}
-		for (int i= 0; i < properties.length(); i++) {
-			char ch= properties.charAt(i);
-			if (!Character.isWhitespace(ch))
-				buffer.append(ch);
-		}
-		buffer.append(',');
-		fProperties= buffer.toString();
-	}
-	
-	public PropertyTesterDescriptor(IConfigurationElement element, String namespace, String properties) {
-		fConfigElement= element;
-		fNamespace= namespace;
-		fProperties= properties;
-	}
-	
-	public String getProperties() {
-		return fProperties;
-	}
-	
-	public String getNamespace() {
-		return fNamespace;
-	}
-	
-	public IConfigurationElement getConfigurationElement() {
-		return fConfigElement;
-	}
-	
-	public boolean handles(String namespace, String property) {
-		return fNamespace.equals(namespace) && fProperties.indexOf("," + property + ",") != -1;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-	
-	public boolean isInstantiated() {
-		return false;
-	}
-	
-	public boolean isDeclaringPluginActive() {
-		Bundle fBundle= Platform.getBundle(fConfigElement.getNamespace());
-		return fBundle.getState() == Bundle.ACTIVE;		
-	}
-	
-	public IPropertyTester instantiate() throws CoreException {
-		return (IPropertyTester)fConfigElement.createExecutableExtension(CLASS);
-	}
-	
-	public boolean test(Object receiver, String method, Object[] args, Object expectedValue) {
-		Assert.isTrue(false, "Method should never be called"); //$NON-NLS-1$
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ResolveExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ResolveExpression.java
deleted file mode 100644
index 579a18a..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/ResolveExpression.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.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public class ResolveExpression extends CompositeExpression {
-
-	private String fVariable;
-	private Object[] fArgs;
-	
-	private static final String ATT_VARIABLE= "variable";  //$NON-NLS-1$
-	private static final String ATT_ARGS= "args";  //$NON-NLS-1$
-	
-	public ResolveExpression(IConfigurationElement configElement) throws CoreException {
-		fVariable= configElement.getAttribute(ATT_VARIABLE);
-		Expressions.checkAttribute(ATT_VARIABLE, fVariable);
-		fArgs= Expressions.getArguments(configElement, ATT_ARGS);
-	}
-	
-	public ResolveExpression(String variable, Object[] args) {
-		Assert.isNotNull(variable);
-		fVariable= variable;
-		fArgs= args;
-	}
-
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Object variable= context.resolveVariable(fVariable, fArgs);
-		if (variable == null) {
-			throw new CoreException(new ExpressionStatus(
-				ExpressionStatus.VARIABLE_NOT_DEFINED,
-				Messages.format(ExpressionMessages.ResolveExpression_variable_not_defined, fVariable))); 
-		}
-		return evaluateAnd(new EvaluationContext(context, variable));
-	}
-	
-	public void collectExpressionInfo(ExpressionInfo info) {
-		ExpressionInfo other= new ExpressionInfo();
-		super.collectExpressionInfo(other);
-		if (other.hasDefaultVariableAccess()) {
-			info.addVariableNameAccess(fVariable);
-		}
-		info.mergeExceptDefaultVariable(other);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/StandardElementHandler.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/StandardElementHandler.java
deleted file mode 100644
index d897b04..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/StandardElementHandler.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.ElementHandler;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.expressions.ExpressionTagNames;
-
-public class StandardElementHandler extends ElementHandler {
-	
-	public Expression create(ExpressionConverter converter, IConfigurationElement element) throws CoreException {
-		String name= element.getName();
-		if (ExpressionTagNames.INSTANCEOF.equals(name)) {
-			return new InstanceofExpression(element);
-		} else if (ExpressionTagNames.TEST.equals(name)) {
-			return new TestExpression(element);
-		} else if (ExpressionTagNames.OR.equals(name)) {
-			OrExpression result= new OrExpression();
-			processChildren(converter, element, result);
-			return result;
-		} else if (ExpressionTagNames.AND.equals(name)) {
-			AndExpression result= new AndExpression();
-			processChildren(converter, element, result);
-			return result;
-		} else if (ExpressionTagNames.NOT.equals(name)) {
-			return new NotExpression(converter.perform(element.getChildren()[0]));
-		} else if (ExpressionTagNames.WITH.equals(name)) {
-			WithExpression result= new WithExpression(element);
-			processChildren(converter, element, result);
-			return result;
-		} else if (ExpressionTagNames.ADAPT.equals(name)) {
-			AdaptExpression result= new AdaptExpression(element);
-			processChildren(converter, element, result);
-			return result;
-		} else if (ExpressionTagNames.ITERATE.equals(name)) {
-			IterateExpression result= new IterateExpression(element);
-			processChildren(converter, element, result);
-			return result;
-		} else if (ExpressionTagNames.COUNT.equals(name)) {
-			return new CountExpression(element);
-		} else if (ExpressionTagNames.SYSTEM_TEST.equals(name)) {
-			return new SystemTestExpression(element);
-		} else if (ExpressionTagNames.RESOLVE.equals(name)) {
-			ResolveExpression result= new ResolveExpression(element);
-			processChildren(converter, element, result);
-			return result;
-		} else if (ExpressionTagNames.ENABLEMENT.equals(name)) {
-			EnablementExpression result= new EnablementExpression(element);
-			processChildren(converter, element, result);
-			return result;
-		} else if (ExpressionTagNames.EQUALS.equals(name)) {
-			return new EqualsExpression(element);
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/SystemTestExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/SystemTestExpression.java
deleted file mode 100644
index b9c2793..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/SystemTestExpression.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public class SystemTestExpression extends Expression {
-
-	private String fProperty;
-	private String fExpectedValue;
-	
-	private static final String ATT_PROPERTY= "property"; //$NON-NLS-1$
-	
-	public SystemTestExpression(IConfigurationElement element) throws CoreException {
-		fProperty= element.getAttribute(ATT_PROPERTY);
-		Expressions.checkAttribute(ATT_PROPERTY, fProperty);
-		fExpectedValue= element.getAttribute(ATT_VALUE);
-		Expressions.checkAttribute(ATT_VALUE, fExpectedValue);
-	}
-	
-	public SystemTestExpression(String property, String expectedValue) {
-		fProperty= property;
-		fExpectedValue= expectedValue;
-	}
-	
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		String str= System.getProperty(fProperty);
-		if (str == null) 
-			return EvaluationResult.FALSE;
-		return EvaluationResult.valueOf(str.equals(fExpectedValue));
-	}
-
-	public void collectExpressionInfo(ExpressionInfo info) {
-		info.markSystemPropertyAccessed();
-	}
-	
-	//---- Debugging ---------------------------------------------------
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "<systemTest property=\"" + fProperty +  //$NON-NLS-1$
-		  "\" value=\"" + fExpectedValue + "\""; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TestExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TestExpression.java
deleted file mode 100644
index a061d68..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TestExpression.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.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public class TestExpression extends Expression {
-
-	private String fNamespace;
-	private String fProperty;
-	private Object[] fArgs;
-	private Object fExpectedValue;
-	
-	private static final String ATT_PROPERTY= "property"; //$NON-NLS-1$
-	private static final String ATT_ARGS= "args"; //$NON-NLS-1$
-	
-	private static final TypeExtensionManager fgTypeExtensionManager= new TypeExtensionManager("propertyTesters"); //$NON-NLS-1$
-	
-	public TestExpression(IConfigurationElement element) throws CoreException {
-		String property= element.getAttribute(ATT_PROPERTY);
-		int pos= property.lastIndexOf('.');
-		if (pos == -1) {
-			throw new CoreException(new ExpressionStatus(
-				ExpressionStatus.NO_NAMESPACE_PROVIDED,
-				ExpressionMessages.TestExpression_no_name_space)); 
-		}
-		fNamespace= property.substring(0, pos);
-		fProperty= property.substring(pos + 1);
-		fArgs= Expressions.getArguments(element, ATT_ARGS);
-		fExpectedValue= Expressions.convertArgument(element.getAttribute(ATT_VALUE));
-	}
-	
-	public TestExpression(String namespace, String property, Object[] args, Object expectedValue) {
-		fNamespace= namespace;
-		fProperty= property;
-		fArgs= args;
-		fExpectedValue= expectedValue;
-	}
-	
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Object element= context.getDefaultVariable();
-		if (System.class.equals(element)) {
-			String str= System.getProperty(fProperty);
-			if (str == null) 
-				return EvaluationResult.FALSE;
-			return EvaluationResult.valueOf(str.equals(fArgs[0]));
-		}
-		Property property= fgTypeExtensionManager.getProperty(element, fNamespace, fProperty);
-		if (!property.isInstantiated())
-			return EvaluationResult.NOT_LOADED;
-		return EvaluationResult.valueOf(property.test(element, fArgs, fExpectedValue));
-	}
-
-	public void collectExpressionInfo(ExpressionInfo info) {
-		info.markDefaultVariableAccessed();
-	}
-	
-	//---- Debugging ---------------------------------------------------
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer args= new StringBuffer();
-		for (int i= 0; i < fArgs.length; i++) {
-			Object arg= fArgs[i];
-			if (arg instanceof String) {
-				args.append('\'');
-				args.append(arg);
-				args.append('\'');
-			} else {
-				args.append(arg.toString());
-			}
-			if (i < fArgs.length - 1)
-				args.append(", "); //$NON-NLS-1$
-		}
-		return "<test property=\"" + fProperty +  //$NON-NLS-1$
-		  (fArgs.length != 0 ? "\" args=\"" + args + "\"" : "\"") + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		  (fExpectedValue != null ? "\" value=\"" + fExpectedValue + "\"" : "\"") + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		  "/>"; //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TypeExtension.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TypeExtension.java
deleted file mode 100644
index 552262a..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TypeExtension.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.expressions.IPropertyTester;
-import org.eclipse.core.expressions.PropertyTester;
-
-public class TypeExtension {
-	
-	private static final TypeExtension[] EMPTY_TYPE_EXTENSION_ARRAY= new TypeExtension[0];
-
-	/* a special property tester instance that used to signal that method searching has to continue */
-	/* package */ static final IPropertyTester CONTINUE= new IPropertyTester() {
-		public boolean handles(String namespace, String method) {
-			return false;
-		}
-		public boolean isInstantiated() {
-			return true;
-		}
-		public boolean isDeclaringPluginActive() {
-			return true;
-		}
-		public IPropertyTester instantiate() {
-			return this;
-		}
-		public boolean test(Object receiver, String method, Object[] args, Object expectedValue) {
-			return false;
-		}
-	};
-		
-	/* a special type extension instance that marks the end of an evaluation chain */
-	private static final TypeExtension END_POINT= new TypeExtension() {
-		/* package */ IPropertyTester findTypeExtender(TypeExtensionManager manager, String namespace, String name, boolean staticMethod) throws CoreException {
-			return CONTINUE;
-		}
-	};
-		
-	/* the type this extension is extending */
-	private Class fType;
-	/* the list of associated extenders */
-	private IPropertyTester[] fExtenders;
-	
-	/* the extension associated with <code>fType</code>'s super class */
-	private TypeExtension fExtends;
-	/* the extensions associated with <code>fTypes</code>'s interfaces */ 
-	private TypeExtension[] fImplements;
-	
-	private TypeExtension() {
-		// special constructor to create the CONTINUE instance
-	}
-	
-	/* package */ TypeExtension(Class type) {
-		Assert.isNotNull(type);
-		fType= type;
-	}
-	
-	/* package */ IPropertyTester findTypeExtender(TypeExtensionManager manager, String namespace, String method, boolean staticMethod) throws CoreException {
-		if (fExtenders == null) {
-			fExtenders= manager.loadTesters(fType);
-		}
-		IPropertyTester result;
-		
-		// handle extenders associated with this type extender
-		for (int i= 0; i < fExtenders.length; i++) {
-			IPropertyTester extender= fExtenders[i];
-			if (extender == null || !extender.handles(namespace, method))
-				continue;
-			if (extender.isInstantiated()) {
-				if (extender.isDeclaringPluginActive()) {
-					return extender;
-				} else {
-					PropertyTester tester= (PropertyTester)extender;
-					fExtenders[i]= extender= tester.internalCreateDescriptor();
-					return extender;
-				}
-			} else {
-				if (extender.isDeclaringPluginActive()) {
-					try {
-						PropertyTesterDescriptor descriptor= (PropertyTesterDescriptor)extender;
-						IPropertyTester inst= descriptor.instantiate();
-						((PropertyTester)inst).internalInitialize(descriptor);
-						fExtenders[i]= extender= inst;
-						return extender;
-					} catch (CoreException e) {
-						fExtenders[i]= null;
-						throw e;
-					} catch (ClassCastException e) {
-						fExtenders[i]= null;
-						throw new CoreException(new ExpressionStatus(
-							ExpressionStatus.TYPE_EXTENDER_INCORRECT_TYPE,
-							ExpressionMessages.TypeExtender_incorrectType,  
-							e));
-					}
-				} else {
-					return extender;
-				}
-			}
-		}
-		
-		// there is no inheritance for static methods
-		if (staticMethod) 
-			return CONTINUE;
-		
-		// handle extends chain
-		if (fExtends == null) {
-			Class superClass= fType.getSuperclass();
-			if (superClass != null) {
-				fExtends= manager.get(superClass);
-			} else {
-				fExtends= END_POINT;
-			}
-		}
-		result= fExtends.findTypeExtender(manager, namespace, method, staticMethod);
-		if (result != CONTINUE)
-			return result;
-		
-		// handle implements chain
-		if (fImplements == null) {
-			Class[] interfaces= fType.getInterfaces();
-			if (interfaces.length == 0) {
-				fImplements= EMPTY_TYPE_EXTENSION_ARRAY;
-			} else {
-				fImplements= new TypeExtension[interfaces.length];
-				for (int i= 0; i < interfaces.length; i++) {
-					fImplements[i]= manager.get(interfaces[i]);
-				}				
-			}
-		}
-		for (int i= 0; i < fImplements.length; i++) {
-			result= fImplements[i].findTypeExtender(manager, namespace, method, staticMethod);
-			if (result != CONTINUE)
-				return result;
-		}
-		return CONTINUE;
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TypeExtensionManager.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TypeExtensionManager.java
deleted file mode 100644
index 0c839e8..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/TypeExtensionManager.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.expressions;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-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.IExtensionDelta;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IRegistryChangeEvent;
-import org.eclipse.core.runtime.IRegistryChangeListener;
-import org.eclipse.core.runtime.Platform;
-
-import org.eclipse.core.expressions.IPropertyTester;
-
-public class TypeExtensionManager implements IRegistryChangeListener {
-	
-	private String fExtensionPoint; 
-	
-	private static final String TYPE= "type"; //$NON-NLS-1$
-	
-	private static final IPropertyTester[] EMPTY_PROPERTY_TESTER_ARRAY= new IPropertyTester[0];
-	
-	private static final IPropertyTester NULL_PROPERTY_TESTER= new IPropertyTester() {
-		public boolean handles(String namespace, String property) {
-			return false;
-		}
-		public boolean isInstantiated() {
-			return true;
-		}
-		public boolean isDeclaringPluginActive() {
-			return true;
-		}
-		public IPropertyTester instantiate() throws CoreException {
-			return this;
-		}
-		public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
-			return false;
-		}
-	};
-	
-	/*
-	 * Map containing all already created type extension object. 
-	 */
-	private Map/*<Class, TypeExtension>*/ fTypeExtensionMap;
-	
-	/*
-	 * Table containing mapping of class name to configuration element 
-	 */
-	private Map/*<String, List<IConfigurationElement>>*/ fConfigurationElementMap;
-	
-	/*
-	 * A cache to give fast access to the last 1000 method invocations.
-	 */
-	private PropertyCache fPropertyCache;
-	
-	
-	public TypeExtensionManager(String extensionPoint) {
-		Assert.isNotNull(extensionPoint);
-		fExtensionPoint= extensionPoint;
-		Platform.getExtensionRegistry().addRegistryChangeListener(this);
-		initializeCaches();
-	}
-
-	public synchronized Property getProperty(Object receiver, String namespace, String method) throws CoreException  {
-		long start= 0;
-		if (Expressions.TRACING)
-			start= System.currentTimeMillis();
-		
-		// if we call a static method than the receiver is the class object
-		Class clazz= receiver instanceof Class ? (Class)receiver : receiver.getClass();
-		Property result= new Property(clazz, namespace, method);
-		Property cached= fPropertyCache.get(result);
-		if (cached != null) {
-			if (cached.isValidCacheEntry()) {
-				if (Expressions.TRACING) {
-					System.out.println("[Type Extension] - method " + //$NON-NLS-1$
-						clazz.getName() + "#" + method + //$NON-NLS-1$
-						" found in cache: " +  //$NON-NLS-1$
-						(System.currentTimeMillis() - start) + " ms."); //$NON-NLS-1$
-				}
-				return cached;
-			}
-			// The type extender isn't loaded in the cached method but can be loaded
-			// now. So remove method from cache and do the normal look up so that the
-			// implementation class gets loaded.
-			fPropertyCache.remove(cached);
-		}
-		TypeExtension extension= get(clazz);
-		IPropertyTester extender= extension.findTypeExtender(this, namespace, method, receiver instanceof Class);
-		if (extender == TypeExtension.CONTINUE || extender == null) {
-			throw new CoreException(new ExpressionStatus(
-				ExpressionStatus.TYPE_EXTENDER_UNKOWN_METHOD,
-				Messages.format(
-					ExpressionMessages.TypeExtender_unknownMethod,  
-					new Object[] {method, clazz.toString()})));
-		}
-		result.setPropertyTester(extender);
-		fPropertyCache.put(result);
-		if (Expressions.TRACING) {
-			System.out.println("[Type Extension] - method " + //$NON-NLS-1$
-				clazz.getName() + "#" + method + //$NON-NLS-1$
-				" not found in cache: " +  //$NON-NLS-1$
-				(System.currentTimeMillis() - start) + " ms."); //$NON-NLS-1$
-		}
-		return result;
-	}
-	
-	/*
-	 * This method doesn't need to be synchronized since it is called
-	 * from withing the getProperty method which is synchronized
-	 */
-	/* package */ TypeExtension get(Class clazz) {
-		TypeExtension result= (TypeExtension)fTypeExtensionMap.get(clazz);
-		if (result == null) {
-			result= new TypeExtension(clazz);
-			fTypeExtensionMap.put(clazz, result);
-		}
-		return result;
-	}
-	
-	/*
-	 * This method doesn't need to be synchronized since it is called
-	 * from withing the getProperty method which is synchronized
-	 */
-	/* package */ IPropertyTester[] loadTesters(Class type) {
-		if (fConfigurationElementMap == null) {
-			fConfigurationElementMap= new HashMap();
-			IExtensionRegistry registry= Platform.getExtensionRegistry();
-			IConfigurationElement[] ces= registry.getConfigurationElementsFor(
-				ExpressionPlugin.getPluginId(), 
-				fExtensionPoint); 
-			for (int i= 0; i < ces.length; i++) {
-				IConfigurationElement config= ces[i];
-				String typeAttr= config.getAttribute(TYPE);
-				List typeConfigs= (List)fConfigurationElementMap.get(typeAttr);
-				if (typeConfigs == null) {
-					typeConfigs= new ArrayList();
-					fConfigurationElementMap.put(typeAttr, typeConfigs);
-				}
-				typeConfigs.add(config);
-			}
-		}
-		String typeName= type.getName();
-		List typeConfigs= (List)fConfigurationElementMap.get(typeName);
-		if (typeConfigs == null)
-			return EMPTY_PROPERTY_TESTER_ARRAY;
-		else {
-			IPropertyTester[] result= new IPropertyTester[typeConfigs.size()];
-			for (int i= 0; i < result.length; i++) {
-				IConfigurationElement config= (IConfigurationElement)typeConfigs.get(i);
-				try {
-					result[i]= new PropertyTesterDescriptor(config);
-				} catch (CoreException e) {
-					ExpressionPlugin.getDefault().getLog().log(e.getStatus());
-					result[i]= NULL_PROPERTY_TESTER;
-				}
-			}
-			fConfigurationElementMap.remove(typeName);
-			return result;
-		}
-	}
-	
-	public void registryChanged(IRegistryChangeEvent event) {
-		IExtensionDelta[] deltas= event.getExtensionDeltas(ExpressionPlugin.getPluginId(), fExtensionPoint);
-		if (deltas.length > 0) {
-			initializeCaches();
-		}
-	}
-	
-	private synchronized void initializeCaches() {
-		fTypeExtensionMap= new HashMap();
-		fConfigurationElementMap= null;
-		fPropertyCache= new PropertyCache(1000);
-	}
-}
diff --git a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/WithExpression.java b/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/WithExpression.java
deleted file mode 100644
index 61e0a82..0000000
--- a/bundles/org.eclipse.core.expressions/src/org/eclipse/core/internal/expressions/WithExpression.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.core.internal.expressions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.ExpressionInfo;
-
-public class WithExpression extends CompositeExpression {
-
-	private String fVariable;
-	private static final String ATT_VARIABLE= "variable";  //$NON-NLS-1$
-	
-	public WithExpression(IConfigurationElement configElement) throws CoreException {
-		fVariable= configElement.getAttribute(ATT_VARIABLE);
-		Expressions.checkAttribute(ATT_VARIABLE, fVariable);
-	}
-	
-	public WithExpression(String variable) {
-		fVariable= variable;
-	}
-
-	public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-		Object variable= context.getVariable(fVariable);
-		if (variable == null) {
-			throw new CoreException(new ExpressionStatus(
-				ExpressionStatus.VARIABLE_NOT_DEFINED,
-				Messages.format(ExpressionMessages.WithExpression_variable_not_defined, fVariable))); 
-		}
-		return evaluateAnd(new EvaluationContext(context, variable));
-	}
-
-	public void collectExpressionInfo(ExpressionInfo info) {
-		ExpressionInfo other= new ExpressionInfo();
-		super.collectExpressionInfo(other);
-		if (other.hasDefaultVariableAccess()) {
-			info.addVariableNameAccess(fVariable);
-		}
-		info.mergeExceptDefaultVariable(other);
-	}	
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.jobs/.classpath b/bundles/org.eclipse.core.jobs/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/bundles/org.eclipse.core.jobs/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.jobs/.cvsignore b/bundles/org.eclipse.core.jobs/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.core.jobs/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.core.jobs/.options b/bundles/org.eclipse.core.jobs/.options
deleted file mode 100644
index 994faa5..0000000
--- a/bundles/org.eclipse.core.jobs/.options
+++ /dev/null
@@ -1,19 +0,0 @@
-# Debugging options for the org.eclipse.core.runtime plugin
-
-# NOTE: There is a deadlock risk when using these debug flags in a workspace
-# launched from Eclipse due to interaction with a lock in the debugger console.  
-# For details: https://bugs.eclipse.org/bugs/show_bug.cgi?id=93968
-
-# Prints debug information on running background jobs
-org.eclipse.core.jobs/jobs=false
-# Includes current date and time in job debug information
-org.eclipse.core.jobs/jobs/timing=false
-# Computes location of error on mismatched IJobManager.beginRule/endRule
-org.eclipse.core.jobs/jobs/beginend=false
-# Pedantic assertion checking on locks and deadlock reporting
-org.eclipse.core.jobs/jobs/locks=false
-# Throws an IllegalStateException when deadlock occurs
-org.eclipse.core.jobs/jobs/errorondeadlock=false
-# Debug shutdown behaviour
-org.eclipse.core.jobs/jobs/shutdown=false
-
diff --git a/bundles/org.eclipse.core.jobs/.project b/bundles/org.eclipse.core.jobs/.project
deleted file mode 100644
index 06b10a8..0000000
--- a/bundles/org.eclipse.core.jobs/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.jobs</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.jobs/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.core.jobs/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 772aee9..0000000
--- a/bundles/org.eclipse.core.jobs/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Wed Feb 01 11:53:31 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
diff --git a/bundles/org.eclipse.core.jobs/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.core.jobs/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 671fd9c..0000000
--- a/bundles/org.eclipse.core.jobs/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri Jan 06 16:47:44 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=;
-org.eclipse.jdt.ui.ondemandthreshold=3
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="New classes and interfaces" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n *******************************************************************************/\r\n${filecomment}\r\n${package_declaration}\r\n\r\n/**\r\n * \r\n */\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block&\#13;\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.core.jobs/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.jobs/META-INF/MANIFEST.MF
deleted file mode 100644
index f10bb3e..0000000
--- a/bundles/org.eclipse.core.jobs/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.core.jobs; singleton:=true
-Bundle-Version: 3.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.core.internal.jobs;x-internal:=true,
- org.eclipse.core.runtime.jobs
-Bundle-Activator: org.eclipse.core.internal.jobs.JobActivator
-Require-Bundle: org.eclipse.equinox.common,
- system.bundle;resolution:=optional
-Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0,
- J2SE-1.3
diff --git a/bundles/org.eclipse.core.jobs/about.html b/bundles/org.eclipse.core.jobs/about.html
deleted file mode 100644
index cdc1e50..0000000
--- a/bundles/org.eclipse.core.jobs/about.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<p>September 26, 2005</p> 
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html" target="_blank">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<small>Java and all Java-based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries.</small>
-
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.jobs/build.properties b/bundles/org.eclipse.core.jobs/build.properties
deleted file mode 100644
index 730faf8..0000000
--- a/bundles/org.eclipse.core.jobs/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               .options,\
-               about.html
-src.includes = about.html
diff --git a/bundles/org.eclipse.core.jobs/plugin.properties b/bundles/org.eclipse.core.jobs/plugin.properties
deleted file mode 100644
index 7db1f71..0000000
--- a/bundles/org.eclipse.core.jobs/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = Eclipse Jobs Mechanism
-providerName = Eclipse.org
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Deadlock.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Deadlock.java
deleted file mode 100644
index 775a695..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Deadlock.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-/**
- * The deadlock class stores information about a deadlock that just occurred.
- * It contains an array of the threads that were involved in the deadlock
- * as well as the thread that was chosen to be suspended and an array of locks
- * held by that thread that are going to be suspended to resolve the deadlock.
- */
-class Deadlock {
-	//all the threads which are involved in the deadlock
-	private Thread[] threads;
-	//the thread whose locks will be suspended to resolve deadlock
-	private Thread candidate;
-	//the locks that will be suspended
-	private ISchedulingRule[] locks;
-
-	public Deadlock(Thread[] threads, ISchedulingRule[] locks, Thread candidate) {
-		this.threads = threads;
-		this.locks = locks;
-		this.candidate = candidate;
-	}
-
-	public ISchedulingRule[] getLocks() {
-		return locks;
-	}
-
-	public Thread getCandidate() {
-		return candidate;
-	}
-
-	public Thread[] getThreads() {
-		return threads;
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/DeadlockDetector.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/DeadlockDetector.java
deleted file mode 100644
index 889b7e8..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/DeadlockDetector.java
+++ /dev/null
@@ -1,695 +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.core.internal.jobs;
-
-import java.util.ArrayList;
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-/**
- * Stores all the relationships between locks (rules are also considered locks), 
- * and the threads that own them. All the relationships are stored in a 2D integer array.
- * The rows in the array are threads, while the columns are locks.
- * Two corresponding arrayLists store the actual threads and locks.
- * The index of a thread in the first arrayList is the index of the row in the graph.
- * The index of a lock in the second arrayList is the index of the column in the graph. 
- * An entry greater than 0 in the graph is the number of times a thread in the entry's row
- * acquired the lock in the entry's column.
- * An entry of -1 means that the thread is waiting to acquire the lock.
- * An entry of 0 means that the thread and the lock have no relationship.
- * 
- * The difference between rules and locks is that locks can be suspended, while
- * rules are implicit locks and as such cannot be suspended.
- * To resolve deadlock, the graph will first try to find a thread that only owns
- * locks. Failing that, it will find a thread in the deadlock that owns at least
- * one lock and suspend it.
- * 
- * Deadlock can only occur among locks, or among locks in combination with rules.
- * Deadlock among rules only is impossible. Therefore, in any deadlock one can always
- * find a thread that owns at least one lock that can be suspended.
- * 
- * The implementation of the graph assumes that a thread can only own 1 rule at
- * any one time. It can acquire that rule several times, but a thread cannot
- * acquire 2 non-conflicting rules at the same time.
- * 
- * The implementation of the graph will sometimes also find and resolve bogus deadlocks.
- * 		graph:				assuming this rule hierarchy:
- * 		   R2 R3 L1						R1
- * 		J1  1  0  0					   /  \
- * 		J2  0  1 -1					  R2  R3
- * 		J3 -1  0  1
- * 		 
- * If in the above situation job4 decides to acquire rule1, then the graph will transform
- * to the following:
- * 		   R2 R3 R1 L1
- * 		J1  1  0  1  0
- * 		J2  1  1  1 -1
- * 		J3 -1  0  0  1
- * 		J4  0  0 -1  0
- * 
- * and the graph will assume that job2 and job3 are deadlocked and suspend lock1 of job3.
- * The reason the deadlock is bogus is that the deadlock is unlikely to actually happen (the threads
- * are currently not deadlocked, but might deadlock later on when it is too late to detect it)
- * Therefore, in order to make sure that no deadlock is possible, 
- * the deadlock will still be resolved at this point.
- */
-class DeadlockDetector {
-	private static int NO_STATE = 0;
-	//state variables in the graph
-	private static int WAITING_FOR_LOCK = -1;
-	//empty matrix
-	private static final int[][] EMPTY_MATRIX = new int[0][0];
-	//matrix of relationships between threads and locks
-	private int[][] graph = EMPTY_MATRIX;
-	//index is column in adjacency matrix for the lock
-	private final ArrayList locks = new ArrayList();
-	//index is row in adjacency matrix for the thread
-	private final ArrayList lockThreads = new ArrayList();
-	//whether the graph needs to be resized
-	private boolean resize = false;
-
-	/**
-	 * Recursively check if any of the threads that prevent the current thread from running
-	 * are actually deadlocked with the current thread.
-	 * Add the threads that form deadlock to the deadlockedThreads list.
-	 */
-	private boolean addCycleThreads(ArrayList deadlockedThreads, Thread next) {
-		//get the thread that block the given thread from running
-		Thread[] blocking = blockingThreads(next);
-		//if the thread is not blocked by other threads, then it is not part of a deadlock
-		if (blocking.length == 0)
-			return false;
-		boolean inCycle = false;
-		for (int i = 0; i < blocking.length; i++) {
-			//if we have already visited the given thread, then we found a cycle
-			if (deadlockedThreads.contains(blocking[i])) {
-				inCycle = true;
-			} else {
-				//otherwise, add the thread to our list and recurse deeper
-				deadlockedThreads.add(blocking[i]);
-				//if the thread is not part of a cycle, remove it from the list
-				if (addCycleThreads(deadlockedThreads, blocking[i]))
-					inCycle = true;
-				else
-					deadlockedThreads.remove(blocking[i]);
-			}
-		}
-		return inCycle;
-	}
-
-	/**
-	 * Get the thread(s) that own the lock this thread is waiting for.
-	 */
-	private Thread[] blockingThreads(Thread current) {
-		//find the lock this thread is waiting for
-		ISchedulingRule lock = (ISchedulingRule) getWaitingLock(current);
-		return getThreadsOwningLock(lock);
-	}
-
-	/**
-	 * Check that the addition of a waiting thread did not produce deadlock. 
-	 * If deadlock is detected return true, else return false.
-	 */
-	private boolean checkWaitCycles(int[] waitingThreads, int lockIndex) {
-		/**
-		 * find the lock that this thread is waiting for
-		 * recursively check if this is a cycle (i.e. a thread waiting on itself)
-		 */
-		for (int i = 0; i < graph.length; i++) {
-			if (graph[i][lockIndex] > NO_STATE) {
-				if (waitingThreads[i] > NO_STATE) {
-					return true;
-				}
-				//keep track that we already visited this thread
-				waitingThreads[i]++;
-				for (int j = 0; j < graph[i].length; j++) {
-					if (graph[i][j] == WAITING_FOR_LOCK) {
-						if (checkWaitCycles(waitingThreads, j))
-							return true;
-					}
-				}
-				//this thread is not involved in a cycle yet, so remove the visited flag
-				waitingThreads[i]--;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns true IFF the matrix contains a row for the given thread.
-	 * (meaning the given thread either owns locks or is waiting for locks)
-	 */
-	boolean contains(Thread t) {
-		return lockThreads.contains(t);
-	}
-
-	/**
-	 * A new rule was just added to the graph.
-	 * Find a rule it conflicts with and update the new rule with the number of times 
-	 * it was acquired implicitly when threads acquired conflicting rule.
-	 */
-	private void fillPresentEntries(ISchedulingRule newLock, int lockIndex) {
-		//fill in the entries for the new rule from rules it conflicts with
-		for (int j = 0; j < locks.size(); j++) {
-			if ((j != lockIndex) && (newLock.isConflicting((ISchedulingRule) locks.get(j)))) {
-				for (int i = 0; i < graph.length; i++) {
-					if ((graph[i][j] > NO_STATE) && (graph[i][lockIndex] == NO_STATE))
-						graph[i][lockIndex] = graph[i][j];
-				}
-			}
-		}
-		//now back fill the entries for rules the current rule conflicts with
-		for (int j = 0; j < locks.size(); j++) {
-			if ((j != lockIndex) && (newLock.isConflicting((ISchedulingRule) locks.get(j)))) {
-				for (int i = 0; i < graph.length; i++) {
-					if ((graph[i][lockIndex] > NO_STATE) && (graph[i][j] == NO_STATE))
-						graph[i][j] = graph[i][lockIndex];
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns all the locks owned by the given thread
-	 */
-	private Object[] getOwnedLocks(Thread current) {
-		ArrayList ownedLocks = new ArrayList(1);
-		int index = indexOf(current, false);
-
-		for (int j = 0; j < graph[index].length; j++) {
-			if (graph[index][j] > NO_STATE)
-				ownedLocks.add(locks.get(j));
-		}
-		if (ownedLocks.size() == 0)
-			Assert.isLegal(false, "A thread with no locks is part of a deadlock."); //$NON-NLS-1$
-		return ownedLocks.toArray();
-	}
-
-	/**
-	 * Returns an array of threads that form the deadlock (usually 2).
-	 */
-	private Thread[] getThreadsInDeadlock(Thread cause) {
-		ArrayList deadlockedThreads = new ArrayList(2);
-		/**
-		 * if the thread that caused deadlock doesn't own any locks, then it is not part
-		 * of the deadlock (it just caused it because of a rule it tried to acquire)
-		 */
-		if (ownsLocks(cause))
-			deadlockedThreads.add(cause);
-		addCycleThreads(deadlockedThreads, cause);
-		return (Thread[]) deadlockedThreads.toArray(new Thread[deadlockedThreads.size()]);
-	}
-
-	/**
-	 * Returns the thread(s) that own the given lock.
-	 */
-	private Thread[] getThreadsOwningLock(ISchedulingRule rule) {
-		if (rule == null)
-			return new Thread[0];
-		int lockIndex = indexOf(rule, false);
-		ArrayList blocking = new ArrayList(1);
-		for (int i = 0; i < graph.length; i++) {
-			if (graph[i][lockIndex] > NO_STATE)
-				blocking.add(lockThreads.get(i));
-		}
-		if ((blocking.size() == 0) && (JobManager.DEBUG_LOCKS))
-			System.out.println("Lock " + rule + " is involved in deadlock but is not owned by any thread."); //$NON-NLS-1$ //$NON-NLS-2$
-		if ((blocking.size() > 1) && (rule instanceof ILock) && (JobManager.DEBUG_LOCKS))
-			System.out.println("Lock " + rule + " is owned by more than 1 thread, but it is not a rule."); //$NON-NLS-1$ //$NON-NLS-2$
-		return (Thread[]) blocking.toArray(new Thread[blocking.size()]);
-	}
-
-	/**
-	 * Returns the lock the given thread is waiting for.
-	 */
-	private Object getWaitingLock(Thread current) {
-		int index = indexOf(current, false);
-		//find the lock that this thread is waiting for
-		for (int j = 0; j < graph[index].length; j++) {
-			if (graph[index][j] == WAITING_FOR_LOCK)
-				return locks.get(j);
-		}
-		//it can happen that a thread is not waiting for any lock (it is not really part of the deadlock)
-		return null;
-	}
-
-	/**
-	 * Returns the index of the given lock in the lock array. If the lock is
-	 * not present in the array, it is added to the end.
-	 */
-	private int indexOf(ISchedulingRule lock, boolean add) {
-		int index = locks.indexOf(lock);
-		if ((index < 0) && add) {
-			locks.add(lock);
-			resize = true;
-			index = locks.size() - 1;
-		}
-		return index;
-	}
-
-	/**
-	 * Returns the index of the given thread in the thread array. If the thread
-	 * is not present in the array, it is added to the end.
-	 */
-	private int indexOf(Thread owner, boolean add) {
-		int index = lockThreads.indexOf(owner);
-		if ((index < 0) && add) {
-			lockThreads.add(owner);
-			resize = true;
-			index = lockThreads.size() - 1;
-		}
-		return index;
-	}
-
-	/**
-	 * Returns true IFF the adjacency matrix is empty.
-	 */
-	boolean isEmpty() {
-		return (locks.size() == 0) && (lockThreads.size() == 0) && (graph.length == 0);
-	}
-
-	/**
-	 * The given lock was acquired by the given thread.
-	 */
-	void lockAcquired(Thread owner, ISchedulingRule lock) {
-		int lockIndex = indexOf(lock, true);
-		int threadIndex = indexOf(owner, true);
-		if (resize)
-			resizeGraph();
-		if (graph[threadIndex][lockIndex] == WAITING_FOR_LOCK)
-			graph[threadIndex][lockIndex] = NO_STATE;
-		/**
-		 * acquire all locks that conflict with the given lock
-		 * or conflict with a lock the given lock will acquire implicitly
-		 * (locks are acquired implicitly when a conflicting lock is acquired)
-		 */
-		ArrayList conflicting = new ArrayList(1);
-		//only need two passes through all the locks to pick up all conflicting rules
-		int NUM_PASSES = 2;
-		conflicting.add(lock);
-		graph[threadIndex][lockIndex]++;
-		for (int i = 0; i < NUM_PASSES; i++) {
-			for (int k = 0; k < conflicting.size(); k++) {
-				ISchedulingRule current = (ISchedulingRule) conflicting.get(k);
-				for (int j = 0; j < locks.size(); j++) {
-					ISchedulingRule possible = (ISchedulingRule) locks.get(j);
-					if (current.isConflicting(possible) && !conflicting.contains(possible)) {
-						conflicting.add(possible);
-						graph[threadIndex][j]++;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * The given lock was released by the given thread. Update the graph.
-	 */
-	void lockReleased(Thread owner, ISchedulingRule lock) {
-		int lockIndex = indexOf(lock, false);
-		int threadIndex = indexOf(owner, false);
-		//make sure the lock and thread exist in the graph
-		if (threadIndex < 0) {
-			if (JobManager.DEBUG_LOCKS)
-				System.out.println("[lockReleased] Lock " + lock + " was already released by thread " + owner.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		if (lockIndex < 0) {
-			if (JobManager.DEBUG_LOCKS)
-				System.out.println("[lockReleased] Thread " + owner.getName() + " already released lock " + lock); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		//if this lock was suspended, set it to NO_STATE
-		if ((lock instanceof ILock) && (graph[threadIndex][lockIndex] == WAITING_FOR_LOCK)) {
-			graph[threadIndex][lockIndex] = NO_STATE;
-			return;
-		}
-		//release all locks that conflict with the given lock
-		//or release all rules that are owned by the given thread, if we are releasing a rule
-		for (int j = 0; j < graph[threadIndex].length; j++) {
-			if ((lock.isConflicting((ISchedulingRule) locks.get(j))) || (!(lock instanceof ILock) && !(locks.get(j) instanceof ILock) && (graph[threadIndex][j] > NO_STATE))) {
-				if (graph[threadIndex][j] == NO_STATE) {
-					if (JobManager.DEBUG_LOCKS)
-						System.out.println("[lockReleased] More releases than acquires for thread " + owner.getName() + " and lock " + lock); //$NON-NLS-1$ //$NON-NLS-2$
-				} else {
-					graph[threadIndex][j]--;
-				}
-			}
-		}
-		//if this thread just released the given lock, try to simplify the graph
-		if (graph[threadIndex][lockIndex] == NO_STATE)
-			reduceGraph(threadIndex, lock);
-	}
-
-	/**
-	 * The given scheduling rule is no longer used because the job that invoked it is done.
-	 * Release this rule regardless of how many times it was acquired.
-	 */
-	void lockReleasedCompletely(Thread owner, ISchedulingRule rule) {
-		int ruleIndex = indexOf(rule, false);
-		int threadIndex = indexOf(owner, false);
-		//need to make sure that the given thread and rule were not already removed from the graph
-		if (threadIndex < 0) {
-			if (JobManager.DEBUG_LOCKS)
-				System.out.println("[lockReleasedCompletely] Lock " + rule + " was already released by thread " + owner.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		if (ruleIndex < 0) {
-			if (JobManager.DEBUG_LOCKS)
-				System.out.println("[lockReleasedCompletely] Thread " + owner.getName() + " already released lock " + rule); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		/**
-		 * set all rules that are owned by the given thread to NO_STATE 
-		 * (not just rules that conflict with the rule we are releasing)
-		 * if we are releasing a lock, then only update the one entry for the lock
-		 */
-		for (int j = 0; j < graph[threadIndex].length; j++) {
-			if (!(locks.get(j) instanceof ILock) && (graph[threadIndex][j] > NO_STATE))
-				graph[threadIndex][j] = NO_STATE;
-		}
-		reduceGraph(threadIndex, rule);
-	}
-
-	/**
-	 * The given thread could not get the given lock and is waiting for it.
-	 * Update the graph.
-	 */
-	Deadlock lockWaitStart(Thread client, ISchedulingRule lock) {
-		setToWait(client, lock, false);
-		int lockIndex = indexOf(lock, false);
-		int[] temp = new int[lockThreads.size()];
-		//check if the addition of the waiting thread caused deadlock
-		if (!checkWaitCycles(temp, lockIndex))
-			return null;
-		//there is a deadlock in the graph
-		Thread[] threads = getThreadsInDeadlock(client);
-		Thread candidate = resolutionCandidate(threads);
-		ISchedulingRule[] locksToSuspend = realLocksForThread(candidate);
-		Deadlock deadlock = new Deadlock(threads, locksToSuspend, candidate);
-		//find a thread whose locks can be suspended to resolve the deadlock
-		if (JobManager.DEBUG_LOCKS)
-			reportDeadlock(deadlock);
-		if (JobManager.DEBUG_DEADLOCK)
-			throw new IllegalStateException("Deadlock detected. Caused by thread " + client.getName() + '.'); //$NON-NLS-1$
-		// Update the graph to indicate that the locks will now be suspended.
-		// To indicate that the lock will be suspended, we set the thread to wait for the lock.
-		// When the lock is forced to be released, the entry will be cleared.
-		for (int i = 0; i < locksToSuspend.length; i++)
-			setToWait(deadlock.getCandidate(), locksToSuspend[i], true);
-		return deadlock;
-	}
-
-	/**
-	 * The given thread has stopped waiting for the given lock. 
-	 * Update the graph.
-	 */
-	void lockWaitStop(Thread owner, ISchedulingRule lock) {
-		int lockIndex = indexOf(lock, false);
-		int threadIndex = indexOf(owner, false);
-		//make sure the thread and lock exist in the graph
-		if (threadIndex < 0) {
-			if (JobManager.DEBUG_LOCKS)
-				System.out.println("Thread " + owner.getName() + " was already removed."); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		if (lockIndex < 0) {
-			if (JobManager.DEBUG_LOCKS)
-				System.out.println("Lock " + lock + " was already removed."); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		if (graph[threadIndex][lockIndex] != WAITING_FOR_LOCK)
-			Assert.isTrue(false, "Thread " + owner.getName() + " was not waiting for lock " + lock.toString() + " so it could not time out."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		graph[threadIndex][lockIndex] = NO_STATE;
-		reduceGraph(threadIndex, lock);
-	}
-
-	/**
-	 * Returns true IFF the given thread owns a single lock
-	 */
-	private boolean ownsLocks(Thread cause) {
-		int threadIndex = indexOf(cause, false);
-		for (int j = 0; j < graph[threadIndex].length; j++) {
-			if (graph[threadIndex][j] > NO_STATE)
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Returns true IFF the given thread owns a single real lock.
-	 * A real lock is a lock that can be suspended.
-	 */
-	private boolean ownsRealLocks(Thread owner) {
-		int threadIndex = indexOf(owner, false);
-		for (int j = 0; j < graph[threadIndex].length; j++) {
-			if (graph[threadIndex][j] > NO_STATE) {
-				Object lock = locks.get(j);
-				if (lock instanceof ILock)
-					return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Return true IFF this thread owns rule locks (i.e. implicit locks which
-	 * cannot be suspended)
-	 */
-	private boolean ownsRuleLocks(Thread owner) {
-		int threadIndex = indexOf(owner, false);
-		for (int j = 0; j < graph[threadIndex].length; j++) {
-			if (graph[threadIndex][j] > NO_STATE) {
-				Object lock = locks.get(j);
-				if (!(lock instanceof ILock))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns an array of real locks that are owned by the given thread.
-	 * Real locks are locks that implement the ILock interface and can be suspended.
-	 */
-	private ISchedulingRule[] realLocksForThread(Thread owner) {
-		int threadIndex = indexOf(owner, false);
-		ArrayList ownedLocks = new ArrayList(1);
-		for (int j = 0; j < graph[threadIndex].length; j++) {
-			if ((graph[threadIndex][j] > NO_STATE) && (locks.get(j) instanceof ILock))
-				ownedLocks.add(locks.get(j));
-		}
-		if (ownedLocks.size() == 0)
-			Assert.isLegal(false, "A thread with no real locks was chosen to resolve deadlock."); //$NON-NLS-1$
-		return (ISchedulingRule[]) ownedLocks.toArray(new ISchedulingRule[ownedLocks.size()]);
-	}
-
-	/**
-	 * The matrix has been simplified. Check if any unnecessary rows or columns
-	 * can be removed.
-	 */
-	private void reduceGraph(int row, ISchedulingRule lock) {
-		int numLocks = locks.size();
-		boolean[] emptyColumns = new boolean[numLocks];
-
-		/**
-		 * find all columns that could possibly be empty
-		 * (consist of locks which conflict with the given lock, or of locks which are rules)
-		 */
-		for (int j = 0; j < numLocks; j++) {
-			if ((lock.isConflicting((ISchedulingRule) locks.get(j))) || !(locks.get(j) instanceof ILock))
-				emptyColumns[j] = true;
-		}
-
-		boolean rowEmpty = true;
-		int numEmpty = 0;
-		//check if the given row is empty
-		for (int j = 0; j < graph[row].length; j++) {
-			if (graph[row][j] != NO_STATE) {
-				rowEmpty = false;
-				break;
-			}
-		}
-		/**
-		 * Check if the possibly empty columns are actually empty.
-		 * If a column is actually empty, remove the corresponding lock from the list of locks
-		 * Start at the last column so that when locks are removed from the list, 
-		 * the index of the remaining locks is unchanged. Store the number of empty columns.
-		 */
-		for (int j = emptyColumns.length - 1; j >= 0; j--) {
-			for (int i = 0; i < graph.length; i++) {
-				if (emptyColumns[j] && (graph[i][j] != NO_STATE)) {
-					emptyColumns[j] = false;
-					break;
-				}
-			}
-			if (emptyColumns[j]) {
-				locks.remove(j);
-				numEmpty++;
-			}
-		}
-		//if no columns or rows are empty, return right away
-		if ((numEmpty == 0) && (!rowEmpty))
-			return;
-
-		if (rowEmpty)
-			lockThreads.remove(row);
-
-		//new graph (the list of locks and the list of threads are already updated)
-		final int numThreads = lockThreads.size();
-		numLocks = locks.size();
-		//optimize empty graph case
-		if (numThreads == 0 && numLocks == 0) {
-			graph = EMPTY_MATRIX;
-			return;
-		}
-		int[][] tempGraph = new int[numThreads][numLocks];
-
-		//the number of rows we need to skip to get the correct entry from the old graph
-		int numRowsSkipped = 0;
-		for (int i = 0; i < graph.length - numRowsSkipped; i++) {
-			if ((i == row) && rowEmpty) {
-				numRowsSkipped++;
-				//check if we need to skip the last row
-				if (i >= graph.length - numRowsSkipped)
-					break;
-			}
-			//the number of columns we need to skip to get the correct entry from the old graph
-			//needs to be reset for every new row
-			int numColsSkipped = 0;
-			for (int j = 0; j < graph[i].length - numColsSkipped; j++) {
-				while (emptyColumns[j + numColsSkipped]) {
-					numColsSkipped++;
-					//check if we need to skip the last column
-					if (j >= graph[i].length - numColsSkipped)
-						break;
-				}
-				//need to break out of the outer loop
-				if (j >= graph[i].length - numColsSkipped)
-					break;
-				tempGraph[i][j] = graph[i + numRowsSkipped][j + numColsSkipped];
-			}
-		}
-		graph = tempGraph;
-		Assert.isTrue(numThreads == graph.length, "Rows and threads don't match."); //$NON-NLS-1$
-		Assert.isTrue(numLocks == ((graph.length > 0) ? graph[0].length : 0), "Columns and locks don't match."); //$NON-NLS-1$
-	}
-
-	/**
-	 * Adds a 'deadlock detected' message to the log with a stack trace.
-	 */
-	private void reportDeadlock(Deadlock deadlock) {
-		String msg = "Deadlock detected. All locks owned by thread " + deadlock.getCandidate().getName() + " will be suspended."; //$NON-NLS-1$ //$NON-NLS-2$
-		MultiStatus main = new MultiStatus(JobManager.PI_JOBS, JobManager.PLUGIN_ERROR, msg, new IllegalStateException());
-		Thread[] threads = deadlock.getThreads();
-		for (int i = 0; i < threads.length; i++) {
-			Object[] ownedLocks = getOwnedLocks(threads[i]);
-			Object waitLock = getWaitingLock(threads[i]);
-			StringBuffer buf = new StringBuffer("Thread "); //$NON-NLS-1$
-			buf.append(threads[i].getName());
-			buf.append(" has locks: "); //$NON-NLS-1$
-			for (int j = 0; j < ownedLocks.length; j++) {
-				buf.append(ownedLocks[j]);
-				buf.append((j < ownedLocks.length - 1) ? ", " : " "); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			buf.append("and is waiting for lock "); //$NON-NLS-1$
-			buf.append(waitLock);
-			Status child = new Status(IStatus.ERROR, JobManager.PI_JOBS, JobManager.PLUGIN_ERROR, buf.toString(), null);
-			main.add(child);
-		}
-		RuntimeLog.log(main);
-	}
-
-	/**
-	 * The number of threads/locks in the graph has changed. Update the
-	 * underlying matrix.
-	 */
-	private void resizeGraph() {
-		// a new row and/or a new column was added to the graph.
-		// since new rows/columns are always added to the end, just transfer
-		// old entries to the new graph, with the same indices.
-		final int newRows = lockThreads.size();
-		final int newCols = locks.size();
-		//optimize 0x0 and 1x1 matrices
-		if (newRows == 0 && newCols == 0) {
-			graph = EMPTY_MATRIX;
-			return;
-		}
-		int[][] tempGraph = new int[newRows][newCols];
-		for (int i = 0; i < graph.length; i++)
-			System.arraycopy(graph[i], 0, tempGraph[i], 0, graph[i].length);
-		graph = tempGraph;
-		resize = false;
-	}
-
-	/**
-	 * Get the thread whose locks can be suspended. (i.e. all locks it owns are
-	 * actual locks and not rules). Return the first thread in the array by default.
-	 */
-	private Thread resolutionCandidate(Thread[] candidates) {
-		//first look for a candidate that has no scheduling rules
-		for (int i = 0; i < candidates.length; i++) {
-			if (!ownsRuleLocks(candidates[i]))
-				return candidates[i];
-		}
-		//next look for any candidate with a real lock (a lock that can be suspended)
-		for (int i = 0; i < candidates.length; i++) {
-			if (ownsRealLocks(candidates[i]))
-				return candidates[i];
-		}
-		//unnecessary, return the first entry in the array by default
-		return candidates[0];
-	}
-
-	/**
-	 * The given thread is waiting for the given lock. Update the graph.
-	 */
-	private void setToWait(Thread owner, ISchedulingRule lock, boolean suspend) {
-		boolean needTransfer = false;
-		/**
-		 * if we are adding an entry where a thread is waiting on a scheduling rule,
-		 * then we need to transfer all positive entries for a conflicting rule to the
-		 * newly added rule in order to synchronize the graph.
-		 */
-		if (!suspend && !(lock instanceof ILock))
-			needTransfer = true;
-		int lockIndex = indexOf(lock, !suspend);
-		int threadIndex = indexOf(owner, !suspend);
-		if (resize)
-			resizeGraph();
-
-		graph[threadIndex][lockIndex] = WAITING_FOR_LOCK;
-		if (needTransfer)
-			fillPresentEntries(lock, lockIndex);
-	}
-
-	/**
-	 * Prints out the current matrix to standard output. 
-	 * Only used for debugging.
-	 */
-	public void toDebugString() {
-		System.out.println(" :: "); //$NON-NLS-1$
-		for (int j = 0; j < locks.size(); j++) {
-			System.out.print(" " + locks.get(j) + ','); //$NON-NLS-1$
-		}
-		System.out.println();
-		for (int i = 0; i < graph.length; i++) {
-			System.out.print(" " + ((Thread) lockThreads.get(i)).getName() + " : "); //$NON-NLS-1$ //$NON-NLS-2$
-			for (int j = 0; j < graph[i].length; j++) {
-				System.out.print(" " + graph[i][j] + ','); //$NON-NLS-1$
-			}
-			System.out.println();
-		}
-		System.out.println("-------"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/ImplicitJobs.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/ImplicitJobs.java
deleted file mode 100644
index c12d74b..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/ImplicitJobs.java
+++ /dev/null
@@ -1,247 +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
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import java.util.*;
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * Implicit jobs are jobs that are running by virtue of a JobManager.begin/end
- * pair. They act like normal jobs, except they are tied to an arbitrary thread
- * of the client's choosing, and they can be nested.
- */
-class ImplicitJobs {
-	/**
-	 * Cached unused instance that can be reused 
-	 */
-	private ThreadJob jobCache = null;
-	protected JobManager manager;
-
-	/**
-	 * Set of suspended scheduling rules.
-	 */
-	private final Set suspendedRules = new HashSet(20);
-
-	/**
-	 * Maps (Thread->ThreadJob), threads to the currently running job for that
-	 * thread.
-	 */
-	private final Map threadJobs = new HashMap(20);
-
-	ImplicitJobs(JobManager manager) {
-		this.manager = manager;
-	}
-
-	/* (Non-javadoc) 
-	 * @see IJobManager#beginRule 
-	 */
-	void begin(ISchedulingRule rule, IProgressMonitor monitor, boolean suspend) {
-		if (JobManager.DEBUG_BEGIN_END)
-			JobManager.debug("Begin rule: " + rule); //$NON-NLS-1$
-		final Thread currentThread = Thread.currentThread();
-		ThreadJob threadJob;
-		synchronized (this) {
-			threadJob = (ThreadJob) threadJobs.get(currentThread);
-			if (threadJob != null) {
-				//nested rule, just push on stack and return
-				threadJob.push(rule);
-				return;
-			}
-			//no need to schedule a thread job for a null rule
-			if (rule == null)
-				return;
-			//create a thread job for this thread, use the rule from the real job if it has one
-			Job realJob = manager.currentJob();
-			if (realJob != null && realJob.getRule() != null)
-				threadJob = newThreadJob(realJob.getRule());
-			else {
-				threadJob = newThreadJob(rule);
-				threadJob.acquireRule = true;
-			}
-			//don't acquire rule if it is a suspended rule
-			if (isSuspended(rule))
-				threadJob.acquireRule = false;
-			//indicate if it is a system job to ensure isBlocking works correctly
-			threadJob.setRealJob(realJob);
-			threadJob.setThread(currentThread);
-		}
-		try {
-			threadJob.push(rule);
-			//join the thread job outside sync block
-			if (threadJob.acquireRule) {
-				//no need to re-aquire any locks because the thread did not wait to get this lock
-				if (manager.runNow(threadJob))
-					manager.getLockManager().addLockThread(Thread.currentThread(), rule);
-				else
-					threadJob = threadJob.joinRun(monitor);
-			}
-		} finally {
-			//remember this thread job  - only do this
-			//after the rule is acquired because it is ok for this thread to acquire
-			//and release other rules while waiting.
-			synchronized (this) {
-				threadJobs.put(currentThread, threadJob);
-				if (suspend)
-					suspendedRules.add(rule);
-			}
-			if (threadJob.isBlocked) {
-				threadJob.isBlocked = false;
-				manager.reportUnblocked(monitor);
-			}
-		}
-	}
-
-	/* (Non-javadoc) 
-	 * @see IJobManager#endRule 
-	 */
-	synchronized void end(ISchedulingRule rule, boolean resume) {
-		if (JobManager.DEBUG_BEGIN_END)
-			JobManager.debug("End rule: " + rule); //$NON-NLS-1$
-		ThreadJob threadJob = (ThreadJob) threadJobs.get(Thread.currentThread());
-		if (threadJob == null)
-			Assert.isLegal(rule == null, "endRule without matching beginRule: " + rule); //$NON-NLS-1$
-		else if (threadJob.pop(rule)) {
-			endThreadJob(threadJob, resume);
-		}
-	}
-
-	/**
-	 * Called when a worker thread has finished running a job. At this
-	 * point, the worker thread must not own any scheduling rules
-	 * @param lastJob The last job to run in this thread
-	 */
-	void endJob(InternalJob lastJob) {
-		final Thread currentThread = Thread.currentThread();
-		IStatus error;
-		synchronized (this) {
-			ThreadJob threadJob = (ThreadJob) threadJobs.get(currentThread);
-			if (threadJob == null)
-				return;
-			String msg = "Worker thread ended job: " + lastJob + ", but still holds rule: " + threadJob; //$NON-NLS-1$ //$NON-NLS-2$
-			error = new Status(IStatus.ERROR, JobManager.PI_JOBS, 1, msg, null);
-			//end the thread job
-			endThreadJob(threadJob, false);
-		}
-		try {
-			RuntimeLog.log(error);
-		} catch (RuntimeException e) {
-			//failed to log, so print to console instead
-			System.err.println(error.getMessage());
-		}
-	}
-
-	private void endThreadJob(ThreadJob threadJob, boolean resume) {
-		Thread currentThread = Thread.currentThread();
-		//clean up when last rule scope exits
-		threadJobs.remove(currentThread);
-		ISchedulingRule rule = threadJob.getRule();
-		if (resume && rule != null)
-			suspendedRules.remove(rule);
-		//if this job had a rule, then we are essentially releasing a lock
-		//note it is safe to do this even if the acquire was aborted
-		if (threadJob.acquireRule)
-			manager.getLockManager().removeLockThread(currentThread, rule);
-		//if the job was started, we need to notify job manager to end it
-		if (threadJob.isRunning())
-			manager.endJob(threadJob, Status.OK_STATUS, false);
-		recycle(threadJob);
-	}
-
-	/**
-	 * Returns true if this rule has been suspended, and false otherwise.
-	 */
-	private boolean isSuspended(ISchedulingRule rule) {
-		if (suspendedRules.size() == 0)
-			return false;
-		for (Iterator it = suspendedRules.iterator(); it.hasNext();)
-			if (((ISchedulingRule) it.next()).contains(rule))
-				return true;
-		return false;
-	}
-
-	/**
-	 * Returns a new or reused ThreadJob instance. 
-	 */
-	private ThreadJob newThreadJob(ISchedulingRule rule) {
-		if (jobCache != null) {
-			ThreadJob job = jobCache;
-			job.setRule(rule);
-			job.acquireRule = job.isRunning = false;
-			job.realJob = null;
-			jobCache = null;
-			return job;
-		}
-		return new ThreadJob(manager, rule);
-	}
-
-	/**
-	 * Indicates that a thread job is no longer in use and can be reused. 
-	 */
-	private void recycle(ThreadJob job) {
-		if (jobCache == null && job.recycle())
-			jobCache = job;
-	}
-
-	/**
-	 * Implements IJobManager#resume(ISchedulingRule)
-	 * @param rule
-	 */
-	void resume(ISchedulingRule rule) {
-		//resume happens as a consequence of freeing the last rule in the stack
-		end(rule, true);
-		if (JobManager.DEBUG_BEGIN_END)
-			JobManager.debug("Resume rule: " + rule); //$NON-NLS-1$
-	}
-
-	/**
-	 * Implements IJobManager#suspend(ISchedulingRule, IProgressMonitor)
-	 * @param rule
-	 * @param monitor
-	 */
-	void suspend(ISchedulingRule rule, IProgressMonitor monitor) {
-		if (JobManager.DEBUG_BEGIN_END)
-			JobManager.debug("Suspend rule: " + rule); //$NON-NLS-1$
-		//the suspend job will be remembered once the rule is acquired
-		begin(rule, monitor, true);
-	}
-
-	/**
-	 * Implements IJobManager#transferRule(ISchedulingRule, Thread)
-	 */
-	synchronized void transfer(ISchedulingRule rule, Thread destinationThread) {
-		//nothing to do for null
-		if (rule == null)
-			return;
-		final Thread currentThread = Thread.currentThread();
-		//nothing to do if transferring to the same thread
-		if (currentThread == destinationThread)
-			return;
-		//ensure destination thread doesn't already have a rule
-		ThreadJob job = (ThreadJob) threadJobs.get(destinationThread);
-		Assert.isLegal(job == null);
-		//ensure calling thread owns the job being transferred
-		job = (ThreadJob) threadJobs.get(currentThread);
-		Assert.isLegal(job != null);
-		Assert.isLegal(job.getRule() == rule);
-		//transfer the thread job without ending it
-		job.setThread(destinationThread);
-		threadJobs.remove(currentThread);
-		threadJobs.put(destinationThread, job);
-		//transfer lock
-		if (job.acquireRule) {
-			manager.getLockManager().removeLockThread(currentThread, rule);
-			manager.getLockManager().addLockThread(destinationThread, rule);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/InternalJob.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/InternalJob.java
deleted file mode 100644
index 824cc13..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/InternalJob.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import java.util.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.*;
-
-/**
- * Internal implementation class for jobs. Clients must not implement this class
- * directly.  All jobs must be subclasses of the API <code>org.eclipse.core.runtime.jobs.Job</code> class.
- */
-public abstract class InternalJob extends PlatformObject implements Comparable {
-	/** 
-	 * Job state code (value 16) indicating that a job has been removed from
-	 * the wait queue and is about to start running. From an API point of view, 
-	 * this is the same as RUNNING.
-	 */
-	static final int ABOUT_TO_RUN = 0x10;
-
-	/** 
-	 * Job state code (value 32) indicating that a job has passed scheduling
-	 * precondition checks and is about to be added to the wait queue. From an API point of view, 
-	 * this is the same as WAITING.
-	 */
-	static final int ABOUT_TO_SCHEDULE = 0x20;
-	/** 
-	 * Job state code (value 8) indicating that a job is blocked by another currently
-	 * running job.  From an API point of view, this is the same as WAITING.
-	 */
-	static final int BLOCKED = 0x08;
-
-	//flag mask bits
-	private static final int M_STATE = 0xFF;
-	private static final int M_SYSTEM = 0x0100;
-	private static final int M_USER = 0x0200;
-
-	protected static final JobManager manager = JobManager.getInstance();
-	private static int nextJobNumber = 0;
-
-	/**
-	 * Start time constant indicating a job should be started at
-	 * a time in the infinite future, causing it to sleep forever.
-	 */
-	static final long T_INFINITE = Long.MAX_VALUE;
-	/**
-	 * Start time constant indicating that the job has no start time.
-	 */
-	static final long T_NONE = -1;
-
-	private volatile int flags = Job.NONE;
-	private final int jobNumber = nextJobNumber++;
-	private ListenerList listeners = null;
-	private IProgressMonitor monitor;
-	private String name;
-	/**
-	 * The job ahead of me in a queue or list.
-	 */
-	private InternalJob next;
-	/**
-	 * The job behind me in a queue or list.
-	 */
-	private InternalJob previous;
-	private int priority = Job.LONG;
-	/**
-	 * Arbitrary properties (key,value) pairs, attached
-	 * to a job instance by a third party.
-	 */
-	private ObjectMap properties;
-	private IStatus result;
-	private ISchedulingRule schedulingRule;
-	/**
-	 * If the job is waiting, this represents the time the job should start by.  
-	 * If this job is sleeping, this represents the time the job should wake up.
-	 * If this job is running, this represents the delay automatic rescheduling,
-	 * or -1 if the job should not be rescheduled.
-	 */
-	private long startTime;
-	/*
-	 * The thread that is currently running this job
-	 */
-	private volatile Thread thread = null;
-
-	protected InternalJob(String name) {
-		Assert.isNotNull(name);
-		this.name = name;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#addJobListener(IJobChangeListener)
-	 */
-	protected void addJobChangeListener(IJobChangeListener listener) {
-		if (listeners == null)
-			listeners = new ListenerList(ListenerList.IDENTITY);
-		listeners.add(listener);
-	}
-
-	/**
-	 * Adds an entry at the end of the list of which this item is the head.
-	 */
-	final void addLast(InternalJob entry) {
-		if (previous == null) {
-			previous = entry;
-			entry.next = this;
-			entry.previous = null;
-		} else {
-			Assert.isTrue(previous.next() == this);
-			previous.addLast(entry);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#belongsTo(Object)
-	 */
-	protected boolean belongsTo(Object family) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#cancel()
-	 */
-	protected boolean cancel() {
-		return manager.cancel(this);
-	}
-
-	/* (on-Javadoc)
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public final int compareTo(Object otherJob) {
-		return ((InternalJob) otherJob).startTime >= startTime ? 1 : -1;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#done(IStatus)
-	 */
-	protected void done(IStatus endResult) {
-		manager.endJob(this, endResult, true);
-	}
-
-	/**
-	 * Returns the job listeners that are only listening to this job.  Returns 
-	 * <code>null</code> if this job has no listeners.
-	 */
-	final ListenerList getListeners() {
-		return listeners;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#getName()
-	 */
-	protected String getName() {
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#getPriority()
-	 */
-	protected int getPriority() {
-		return priority;
-	}
-
-	/**
-	 * Returns the job's progress monitor, or null if it is not running.
-	 */
-	final IProgressMonitor getProgressMonitor() {
-		return monitor;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#getProperty
-	 */
-	protected Object getProperty(QualifiedName key) {
-		// thread safety: (Concurrency001 - copy on write)
-		Map temp = properties;
-		if (temp == null)
-			return null;
-		return temp.get(key);
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#getResult
-	 */
-	protected IStatus getResult() {
-		return result;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#getRule
-	 */
-	protected ISchedulingRule getRule() {
-		return schedulingRule;
-	}
-
-	/**
-	 * Returns the time that this job should be started, awakened, or
-	 * rescheduled, depending on the current state.
-	 * @return time in milliseconds
-	 */
-	final long getStartTime() {
-		return startTime;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#getState()
-	 */
-	protected int getState() {
-		int state = flags & M_STATE;
-		switch (state) {
-			//blocked state is equivalent to waiting state for clients
-			case BLOCKED :
-				return Job.WAITING;
-			case ABOUT_TO_RUN :
-				return Job.RUNNING;
-			case ABOUT_TO_SCHEDULE :
-				return Job.WAITING;
-			default :
-				return state;
-		}
-	}
-
-	/* (non-javadoc)
-	 * @see Job.getThread
-	 */
-	protected Thread getThread() {
-		return thread;
-	}
-
-	/**
-	 * Returns the raw job state, including internal states no exposed as API.
-	 */
-	final int internalGetState() {
-		return flags & M_STATE;
-	}
-
-	/**
-	 * Must be called from JobManager#setPriority
-	 */
-	final void internalSetPriority(int newPriority) {
-		this.priority = newPriority;
-	}
-
-	/**
-	 * Must be called from JobManager#setRule
-	 */
-	final void internalSetRule(ISchedulingRule rule) {
-		this.schedulingRule = rule;
-	}
-
-	/**
-	 * Must be called from JobManager#changeState
-	 */
-	final void internalSetState(int i) {
-		flags = (flags & ~M_STATE) | i;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#isBlocking()
-	 */
-	protected boolean isBlocking() {
-		return manager.isBlocking(this);
-	}
-
-	/**
-	 * Returns true if this job conflicts with the given job, and false otherwise.
-	 */
-	final boolean isConflicting(InternalJob otherJob) {
-		ISchedulingRule otherRule = otherJob.getRule();
-		if (schedulingRule == null || otherRule == null)
-			return false;
-		//if one of the rules is a compound rule, it must be asked the question.
-		if (schedulingRule.getClass() == MultiRule.class)
-			return schedulingRule.isConflicting(otherRule);
-		return otherRule.isConflicting(schedulingRule);
-	}
-
-	/* (non-javadoc)
-	 * @see Job.isSystem()
-	 */
-	protected boolean isSystem() {
-		return (flags & M_SYSTEM) != 0;
-	}
-
-	/* (non-javadoc)
-	 * @see Job.isUser()
-	 */
-	protected boolean isUser() {
-		return (flags & M_USER) != 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#join()
-	 */
-	protected void join() throws InterruptedException {
-		manager.join(this);
-	}
-
-	/**
-	 * Returns the next entry (ahead of this one) in the list, or null if there is no next entry
-	 */
-	final InternalJob next() {
-		return next;
-	}
-
-	/**
-	 * Returns the previous entry (behind this one) in the list, or null if there is no previous entry
-	 */
-	final InternalJob previous() {
-		return previous;
-	}
-
-	/**
-	 * Removes this entry from any list it belongs to.  Returns the receiver.
-	 */
-	final InternalJob remove() {
-		if (next != null)
-			next.setPrevious(previous);
-		if (previous != null)
-			previous.setNext(next);
-		next = previous = null;
-		return this;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#removeJobListener(IJobChangeListener)
-	 */
-	protected void removeJobChangeListener(IJobChangeListener listener) {
-		if (listeners != null)
-			listeners.remove(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#run(IProgressMonitor)
-	 */
-	protected abstract IStatus run(IProgressMonitor progressMonitor);
-
-	/* (non-Javadoc)
-	 * @see Job#schedule(long)
-	 */
-	protected void schedule(long delay) {
-		if (shouldSchedule())
-			manager.schedule(this, delay, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#setName(String)
-	 */
-	protected void setName(String name) {
-		Assert.isNotNull(name);
-		this.name = name;
-	}
-
-	/**
-	 * Sets the next entry in this linked list of jobs.
-	 * @param entry
-	 */
-	final void setNext(InternalJob entry) {
-		this.next = entry;
-	}
-
-	/**
-	 * Sets the previous entry in this linked list of jobs.
-	 * @param entry
-	 */
-	final void setPrevious(InternalJob entry) {
-		this.previous = entry;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#setPriority(int)
-	 */
-	protected void setPriority(int newPriority) {
-		switch (newPriority) {
-			case Job.INTERACTIVE :
-			case Job.SHORT :
-			case Job.LONG :
-			case Job.BUILD :
-			case Job.DECORATE :
-				manager.setPriority(this, newPriority);
-				break;
-			default :
-				throw new IllegalArgumentException(String.valueOf(newPriority));
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#setProgressGroup(IProgressMonitor, int)
-	 */
-	protected void setProgressGroup(IProgressMonitor group, int ticks) {
-		Assert.isNotNull(group);
-		IProgressMonitor pm = manager.createMonitor(this, group, ticks);
-		if (pm != null)
-			setProgressMonitor(pm);
-	}
-
-	/**
-	 * Sets the progress monitor to use for the next execution of this job,
-	 * or for clearing the monitor when a job completes.
-	 * @param monitor a progress monitor
-	 */
-	final void setProgressMonitor(IProgressMonitor monitor) {
-		this.monitor = monitor;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#setProperty(QualifiedName,Object)
-	 */
-	protected void setProperty(QualifiedName key, Object value) {
-		// thread safety: (Concurrency001 - copy on write)
-		if (value == null) {
-			if (properties == null)
-				return;
-			ObjectMap temp = (ObjectMap) properties.clone();
-			temp.remove(key);
-			if (temp.isEmpty())
-				properties = null;
-			else
-				properties = temp;
-		} else {
-			ObjectMap temp = properties;
-			if (temp == null)
-				temp = new ObjectMap(5);
-			else
-				temp = (ObjectMap) properties.clone();
-			temp.put(key, value);
-			properties = temp;
-		}
-	}
-
-	/**
-	 * Sets or clears the result of an execution of this job.
-	 * @param result a result status, or <code>null</code>
-	 */
-	final void setResult(IStatus result) {
-		this.result = result;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#setRule(ISchedulingRule)
-	 */
-	protected void setRule(ISchedulingRule rule) {
-		manager.setRule(this, rule);
-	}
-
-	/**
-	 * Sets a time to start, wake up, or schedule this job, 
-	 * depending on the current state
-	 * @param time a time in milliseconds
-	 */
-	final void setStartTime(long time) {
-		startTime = time;
-	}
-
-	/* (non-javadoc)
-	 * @see Job.setSystem
-	 */
-	protected void setSystem(boolean value) {
-		if (getState() != Job.NONE)
-			throw new IllegalStateException();
-		flags = value ? flags | M_SYSTEM : flags & ~M_SYSTEM;
-	}
-
-	/* (non-javadoc)
-	 * @see Job.setThread
-	 */
-	protected void setThread(Thread thread) {
-		this.thread = thread;
-	}
-
-	/* (non-javadoc)
-	 * @see Job.setUser
-	 */
-	protected void setUser(boolean value) {
-		if (getState() != Job.NONE)
-			throw new IllegalStateException();
-		flags = value ? flags | M_USER : flags & ~M_USER;
-	}
-
-	/* (Non-javadoc)
-	 * @see Job#shouldSchedule
-	 */
-	protected boolean shouldSchedule() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#sleep()
-	 */
-	protected boolean sleep() {
-		return manager.sleep(this);
-	}
-
-	/* (non-Javadoc)
-	 * Prints a string-based representation of this job instance. 
-	 * For debugging purposes only.
-	 */
-	public String toString() {
-		return getName() + "(" + jobNumber + ")"; //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#wakeUp(long)
-	 */
-	protected void wakeUp(long delay) {
-		manager.wakeUp(this, delay);
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobActivator.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobActivator.java
deleted file mode 100644
index fc9bc11..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobActivator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import java.util.Hashtable;
-import org.eclipse.core.runtime.jobs.IJobManager;
-import org.osgi.framework.*;
-
-/**
- * The Jobs plugin class.
- */
-public class JobActivator implements BundleActivator {
-
-	/**
-	 * The bundle associated this plug-in
-	 */
-	private static BundleContext bundleContext;
-
-	/**
-	 * This plugin provides a JobManager service.
-	 */
-	private ServiceRegistration jobManagerService = null;
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		bundleContext = context;
-		registerServices();
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		unregisterServices();
-		JobManager.shutdown();
-		JobOSGiUtils.getDefault().closeServices();
-		bundleContext = null;
-	}
-
-	static BundleContext getContext() {
-		return bundleContext;
-	}
-
-	private void registerServices() {
-		jobManagerService = bundleContext.registerService(IJobManager.class.getName(), JobManager.getInstance(), new Hashtable());
-	}
-
-	private void unregisterServices() {
-		if (jobManagerService != null) {
-			jobManagerService.unregister();
-			jobManagerService = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobChangeEvent.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobChangeEvent.java
deleted file mode 100644
index f2889d2..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobChangeEvent.java
+++ /dev/null
@@ -1,57 +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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.Job;
-
-public class JobChangeEvent implements IJobChangeEvent {
-	/**
-	 * The job on which this event occurred.
-	 */
-	Job job = null;
-	/**
-	 * The result returned by the job's run method, or <code>null</code> if
-	 * not applicable.
-	 */
-	IStatus result = null;
-	/**
-	 * The amount of time to wait after scheduling the job before it should be run,
-	 * or <code>-1</code> if not applicable for this type of event.
-	 */
-	long delay = -1;
-	/**
-	 * Whether this job is being immediately rescheduled.
-	 */
-	boolean reschedule = false;
-
-	/* (non-Javadoc)
-	 * Method declared on IJobChangeEvent
-	 */
-	public long getDelay() {
-		return delay;
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IJobChangeEvent
-	 */
-	public Job getJob() {
-		return job;
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IJobChangeEvent
-	 */
-	public IStatus getResult() {
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobListeners.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobListeners.java
deleted file mode 100644
index f03b747..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobListeners.java
+++ /dev/null
@@ -1,168 +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
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.*;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Responsible for notifying all job listeners about job lifecycle events.  Uses a
- * specialized iterator to ensure the complex iteration logic is contained in one place.
- */
-class JobListeners {
-	interface IListenerDoit {
-		public void notify(IJobChangeListener listener, IJobChangeEvent event);
-	}
-
-	private final IListenerDoit aboutToRun = new IListenerDoit() {
-		public void notify(IJobChangeListener listener, IJobChangeEvent event) {
-			listener.aboutToRun(event);
-		}
-	};
-	private final IListenerDoit awake = new IListenerDoit() {
-		public void notify(IJobChangeListener listener, IJobChangeEvent event) {
-			listener.awake(event);
-		}
-	};
-	private final IListenerDoit done = new IListenerDoit() {
-		public void notify(IJobChangeListener listener, IJobChangeEvent event) {
-			listener.done(event);
-		}
-	};
-	private final IListenerDoit running = new IListenerDoit() {
-		public void notify(IJobChangeListener listener, IJobChangeEvent event) {
-			listener.running(event);
-		}
-	};
-	private final IListenerDoit scheduled = new IListenerDoit() {
-		public void notify(IJobChangeListener listener, IJobChangeEvent event) {
-			listener.scheduled(event);
-		}
-	};
-	private final IListenerDoit sleeping = new IListenerDoit() {
-		public void notify(IJobChangeListener listener, IJobChangeEvent event) {
-			listener.sleeping(event);
-		}
-	};
-	/**
-	 * The global job listeners.
-	 */
-	protected final ListenerList global = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * TODO Could use an instance pool to re-use old event objects
-	 */
-	static JobChangeEvent newEvent(Job job) {
-		JobChangeEvent instance = new JobChangeEvent();
-		instance.job = job;
-		return instance;
-	}
-
-	static JobChangeEvent newEvent(Job job, IStatus result) {
-		JobChangeEvent instance = new JobChangeEvent();
-		instance.job = job;
-		instance.result = result;
-		return instance;
-	}
-
-	static JobChangeEvent newEvent(Job job, long delay) {
-		JobChangeEvent instance = new JobChangeEvent();
-		instance.job = job;
-		instance.delay = delay;
-		return instance;
-	}
-
-	/**
-	 * Process the given doit for all global listeners and all local listeners
-	 * on the given job.
-	 */
-	private void doNotify(final IListenerDoit doit, final IJobChangeEvent event) {
-		//notify all global listeners
-		Object[] listeners = global.getListeners();
-		int size = listeners.length;
-		for (int i = 0; i < size; i++) {
-			try {
-				if (listeners[i] != null)
-					doit.notify((IJobChangeListener) listeners[i], event);
-			} catch (Exception e) {
-				handleException(listeners[i], e);
-			} catch (LinkageError e) {
-				handleException(listeners[i], e);
-			}
-		}
-		//notify all local listeners
-		ListenerList list = ((InternalJob) event.getJob()).getListeners();
-		listeners = list == null ? null : list.getListeners();
-		if (listeners == null)
-			return;
-		size = listeners.length;
-		for (int i = 0; i < size; i++) {
-			try {
-				if (listeners[i] != null)
-					doit.notify((IJobChangeListener) listeners[i], event);
-			} catch (Exception e) {
-				handleException(listeners[i], e);
-			} catch (LinkageError e) {
-				handleException(listeners[i], e);
-			}
-		}
-	}
-
-	private void handleException(Object listener, Throwable e) {
-		//this code is roughly copied from InternalPlatform.run(ISafeRunnable), 
-		//but in-lined here for performance reasons
-		if (e instanceof OperationCanceledException)
-			return;
-		String pluginId = JobOSGiUtils.getDefault().getBundleId(listener);
-		if (pluginId == null)
-			pluginId = JobManager.PI_JOBS;
-		String message = NLS.bind(JobMessages.meta_pluginProblems, pluginId);
-		RuntimeLog.log(new Status(IStatus.ERROR, pluginId, JobManager.PLUGIN_ERROR, message, e));
-	}
-
-	public void add(IJobChangeListener listener) {
-		global.add(listener);
-	}
-
-	public void remove(IJobChangeListener listener) {
-		global.remove(listener);
-	}
-
-	public void aboutToRun(Job job) {
-		doNotify(aboutToRun, newEvent(job));
-	}
-
-	public void awake(Job job) {
-		doNotify(awake, newEvent(job));
-	}
-
-	public void done(Job job, IStatus result, boolean reschedule) {
-		JobChangeEvent event = newEvent(job, result);
-		event.reschedule = reschedule;
-		doNotify(done, event);
-	}
-
-	public void running(Job job) {
-		doNotify(running, newEvent(job));
-	}
-
-	public void scheduled(Job job, long delay, boolean reschedule) {
-		JobChangeEvent event = newEvent(job, delay);
-		event.reschedule = reschedule;
-		doNotify(scheduled, event);
-	}
-
-	public void sleeping(Job job) {
-		doNotify(sleeping, newEvent(job));
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobManager.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobManager.java
deleted file mode 100644
index 37a9306..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobManager.java
+++ /dev/null
@@ -1,1199 +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.core.internal.jobs;
-
-import java.text.*;
-import java.util.*;
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.*;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Implementation of API type IJobManager
- * 
- * Implementation note: all the data structures of this class are protected
- * by a single lock object held as a private field in this class.  The JobManager
- * instance itself is not used because this class is publicly reachable, and third
- * party clients may try to synchronize on it.
- * 
- * The WorkerPool class uses its own monitor for synchronizing its data
- * structures. To avoid deadlock between the two classes, the JobManager
- * must NEVER call the worker pool while its own monitor is held.
- */
-public class JobManager implements IJobManager {
-
-	/**
-	 * Status code constant indicating an error occurred while running a plug-in.
-	 * For backward compatibility with Platform.PLUGIN_ERROR left at (value = 2).
-	 */
-	public static final int PLUGIN_ERROR = 2;
-
-	private static final String PLUGIN_NAME = "org.eclipse.core.jobs"; //$NON-NLS-1$
-	private static final String OPTION_DEADLOCK_ERROR = PLUGIN_NAME + "/jobs/errorondeadlock"; //$NON-NLS-1$
-	private static final String OPTION_DEBUG_BEGIN_END = PLUGIN_NAME + "/jobs/beginend"; //$NON-NLS-1$
-	private static final String OPTION_DEBUG_JOBS = PLUGIN_NAME + "/jobs"; //$NON-NLS-1$
-	private static final String OPTION_DEBUG_JOBS_TIMING = PLUGIN_NAME + "/jobs/timing"; //$NON-NLS-1$
-	private static final String OPTION_LOCKS = PLUGIN_NAME + "/jobs/locks"; //$NON-NLS-1$
-	private static final String OPTION_SHUTDOWN = PLUGIN_NAME + "/jobs/shutdown"; //$NON-NLS-1$
-
-	static boolean DEBUG = false;
-	static boolean DEBUG_BEGIN_END = false;
-	static boolean DEBUG_DEADLOCK = false;
-	static boolean DEBUG_LOCKS = false;
-	static boolean DEBUG_TIMING = false;
-	static boolean DEBUG_SHUTDOWN = false;
-	private static DateFormat DEBUG_FORMAT;
-
-	/**
-	 * The singleton job manager instance. It must be a singleton because
-	 * all job instances maintain a reference (as an optimization) and have no way 
-	 * of updating it.
-	 */
-	private static JobManager instance;
-	/**
-	 * Scheduling rule used for validation of client-defined rules.
-	 */
-	private static final ISchedulingRule nullRule = new ISchedulingRule() {
-		public boolean contains(ISchedulingRule rule) {
-			return rule == this;
-		}
-
-		public boolean isConflicting(ISchedulingRule rule) {
-			return rule == this;
-		}
-	};
-
-	/**
-	 * True if this manager is active, and false otherwise.  A job manager
-	 * starts out active, and becomes inactive if it has been shutdown
-	 * and not restarted.
-	 */
-	private volatile boolean active = true;
-
-	final ImplicitJobs implicitJobs = new ImplicitJobs(this);
-
-	private final JobListeners jobListeners = new JobListeners();
-
-	/**
-	 * The lock for synchronizing all activity in the job manager.  To avoid deadlock,
-	 * this lock must never be held for extended periods, and must never be
-	 * held while third party code is being called.
-	 */
-	private final Object lock = new Object();
-
-	private final LockManager lockManager = new LockManager();
-
-	/**
-	 * The pool of worker threads.
-	 */
-	private WorkerPool pool;
-
-	private ProgressProvider progressProvider = null;
-	/**
-	 * Jobs that are currently running. Should only be modified from changeState
-	 */
-	private final HashSet running;
-
-	/**
-	 * Jobs that are sleeping.  Some sleeping jobs are scheduled to wake
-	 * up at a given start time, while others will sleep indefinitely until woken.
-	 * Should only be modified from changeState
-	 */
-	private final JobQueue sleeping;
-	/**
-	 * True if this manager has been suspended, and false otherwise.  A job manager
-	 * starts out not suspended, and becomes suspended when <code>suspend</code>
-	 * is invoked. Once suspended, no jobs will start running until <code>resume</code>
-	 * is called.
-	 */
-	private boolean suspended = false;
-
-	/**
-	 * jobs that are waiting to be run. Should only be modified from changeState
-	 */
-	private final JobQueue waiting;
-
-	/**
-	 * The unique identifier constant of this plug-in.
-	 */
-	public static final String PI_JOBS = "org.eclipse.core.jobs"; //$NON-NLS-1$
-
-	public static void debug(String msg) {
-		StringBuffer msgBuf = new StringBuffer(msg.length() + 40);
-		if (DEBUG_TIMING) {
-			//lazy initialize to avoid overhead when not debugging
-			if (DEBUG_FORMAT == null)
-				DEBUG_FORMAT = new SimpleDateFormat("HH:mm:ss.SSS"); //$NON-NLS-1$
-			DEBUG_FORMAT.format(new Date(), msgBuf, new FieldPosition(0));
-			msgBuf.append('-');
-		}
-		msgBuf.append('[').append(Thread.currentThread()).append(']').append(msg);
-		System.out.println(msgBuf.toString());
-	}
-
-	/**
-	 * Returns the job manager singleton. For internal use only.
-	 */
-	public static synchronized JobManager getInstance() {
-		if (instance == null)
-			new JobManager();
-		return instance;
-	}
-
-	/**
-	 * For debugging purposes only
-	 */
-	private static String printJobName(Job job) {
-		if (job instanceof ThreadJob) {
-			Job realJob = ((ThreadJob) job).realJob;
-			if (realJob != null)
-				return realJob.getClass().getName();
-			return "ThreadJob on rule: " + job.getRule(); //$NON-NLS-1$
-		}
-		return job.getClass().getName();
-	}
-
-	/**
-	 * For debugging purposes only
-	 */
-	public static String printState(int state) {
-		switch (state) {
-			case Job.NONE :
-				return "NONE"; //$NON-NLS-1$
-			case Job.WAITING :
-				return "WAITING"; //$NON-NLS-1$
-			case Job.SLEEPING :
-				return "SLEEPING"; //$NON-NLS-1$
-			case Job.RUNNING :
-				return "RUNNING"; //$NON-NLS-1$
-			case InternalJob.BLOCKED :
-				return "BLOCKED"; //$NON-NLS-1$
-			case InternalJob.ABOUT_TO_RUN :
-				return "ABOUT_TO_RUN"; //$NON-NLS-1$
-			case InternalJob.ABOUT_TO_SCHEDULE :
-				return "ABOUT_TO_SCHEDULE";//$NON-NLS-1$
-		}
-		return "UNKNOWN"; //$NON-NLS-1$
-	}
-
-	public static void shutdown() {
-		if (instance != null) {
-			instance.doShutdown();
-			instance = null;
-		}
-	}
-
-	private JobManager() {
-		instance = this;
-		initDebugOptions();
-		synchronized (lock) {
-			waiting = new JobQueue(false);
-			sleeping = new JobQueue(true);
-			running = new HashSet(10);
-			pool = new WorkerPool(this);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#addJobListener(org.eclipse.core.runtime.jobs.IJobChangeListener)
-	 */
-	public void addJobChangeListener(IJobChangeListener listener) {
-		jobListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#beginRule(org.eclipse.core.runtime.jobs.ISchedulingRule, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void beginRule(ISchedulingRule rule, IProgressMonitor monitor) {
-		validateRule(rule);
-		implicitJobs.begin(rule, monitorFor(monitor), false);
-	}
-
-	/**
-	 * Cancels a job
-	 */
-	protected boolean cancel(InternalJob job) {
-		IProgressMonitor monitor = null;
-		synchronized (lock) {
-			switch (job.getState()) {
-				case Job.NONE :
-					return true;
-				case Job.RUNNING :
-					//cannot cancel a job that has already started (as opposed to ABOUT_TO_RUN)
-					if (job.internalGetState() == Job.RUNNING) {
-						monitor = job.getProgressMonitor();
-						break;
-					}
-				//fall through for ABOUT_TO_RUN case
-				default :
-					changeState(job, Job.NONE);
-			}
-		}
-		//call monitor outside sync block
-		if (monitor != null) {
-			if (!monitor.isCanceled())
-				monitor.setCanceled(true);
-			return false;
-		}
-		//only notify listeners if the job was waiting or sleeping
-		jobListeners.done((Job) job, Status.CANCEL_STATUS, false);
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#cancel(java.lang.String)
-	 */
-	public void cancel(Object family) {
-		//don't synchronize because cancel calls listeners
-		for (Iterator it = select(family).iterator(); it.hasNext();)
-			cancel((Job) it.next());
-	}
-
-	/**
-	 * Atomically updates the state of a job, adding or removing from the
-	 * necessary queues or sets.
-	 */
-	private void changeState(InternalJob job, int newState) {
-		synchronized (lock) {
-			int oldState = job.internalGetState();
-			switch (oldState) {
-				case Job.NONE :
-				case InternalJob.ABOUT_TO_SCHEDULE :
-					break;
-				case InternalJob.BLOCKED :
-					//remove this job from the linked list of blocked jobs
-					job.remove();
-					break;
-				case Job.WAITING :
-					try {
-						waiting.remove(job);
-					} catch (RuntimeException e) {
-						Assert.isLegal(false, "Tried to remove a job that wasn't in the queue"); //$NON-NLS-1$
-					}
-					break;
-				case Job.SLEEPING :
-					try {
-						sleeping.remove(job);
-					} catch (RuntimeException e) {
-						Assert.isLegal(false, "Tried to remove a job that wasn't in the queue"); //$NON-NLS-1$
-					}
-					break;
-				case Job.RUNNING :
-				case InternalJob.ABOUT_TO_RUN :
-					running.remove(job);
-					break;
-				default :
-					Assert.isLegal(false, "Invalid job state: " + job + ", state: " + oldState); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			job.internalSetState(newState);
-			switch (newState) {
-				case Job.NONE :
-					job.setStartTime(InternalJob.T_NONE);
-				case InternalJob.BLOCKED :
-					break;
-				case Job.WAITING :
-					waiting.enqueue(job);
-					break;
-				case Job.SLEEPING :
-					try {
-						sleeping.enqueue(job);
-					} catch (RuntimeException e) {
-						throw new RuntimeException("Error changing from state: " + oldState); //$NON-NLS-1$
-					}
-					break;
-				case Job.RUNNING :
-				case InternalJob.ABOUT_TO_RUN :
-					job.setStartTime(InternalJob.T_NONE);
-					running.add(job);
-					break;
-				case InternalJob.ABOUT_TO_SCHEDULE :
-					break;
-				default :
-					Assert.isLegal(false, "Invalid job state: " + job + ", state: " + newState); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	/**
-	 * Returns a new progress monitor for this job, belonging to the given
-	 * progress group.  Returns null if it is not a valid time to set the job's group.
-	 */
-	protected IProgressMonitor createMonitor(InternalJob job, IProgressMonitor group, int ticks) {
-		synchronized (lock) {
-			//group must be set before the job is scheduled
-			//this includes the ABOUT_TO_SCHEDULE state, during which it is still
-			//valid to set the progress monitor
-			if (job.getState() != Job.NONE)
-				return null;
-			IProgressMonitor monitor = null;
-			if (progressProvider != null)
-				monitor = progressProvider.createMonitor((Job) job, group, ticks);
-			if (monitor == null)
-				monitor = new NullProgressMonitor();
-			return monitor;
-		}
-	}
-
-	/**
-	 * Returns a new progress monitor for this job.  Never returns null.
-	 */
-	private IProgressMonitor createMonitor(Job job) {
-		IProgressMonitor monitor = null;
-		if (progressProvider != null)
-			monitor = progressProvider.createMonitor(job);
-		if (monitor == null)
-			monitor = new NullProgressMonitor();
-		return monitor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#createProgressGroup()
-	 */
-	public IProgressMonitor createProgressGroup() {
-		if (progressProvider != null)
-			return progressProvider.createProgressGroup();
-		return new NullProgressMonitor();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#currentJob()
-	 */
-	public Job currentJob() {
-		Thread current = Thread.currentThread();
-		if (current instanceof Worker)
-			return ((Worker) current).currentJob();
-		synchronized (lock) {
-			for (Iterator it = running.iterator(); it.hasNext();) {
-				Job job = (Job) it.next();
-				if (job.getThread() == current)
-					return job;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the delay in milliseconds that a job with a given priority can
-	 * tolerate waiting.
-	 */
-	private long delayFor(int priority) {
-		//these values may need to be tweaked based on machine speed
-		switch (priority) {
-			case Job.INTERACTIVE :
-				return 0L;
-			case Job.SHORT :
-				return 50L;
-			case Job.LONG :
-				return 100L;
-			case Job.BUILD :
-				return 500L;
-			case Job.DECORATE :
-				return 1000L;
-			default :
-				Assert.isTrue(false, "Job has invalid priority: " + priority); //$NON-NLS-1$
-				return 0;
-		}
-	}
-
-	/**
-	 * Performs the scheduling of a job.  Does not perform any notifications.
-	 */
-	private void doSchedule(InternalJob job, long delay) {
-		synchronized (lock) {
-			//if it's a decoration job, don't run it right now if the system is busy
-			if (job.getPriority() == Job.DECORATE) {
-				long minDelay = running.size() * 100;
-				delay = Math.max(delay, minDelay);
-			}
-			if (delay > 0) {
-				job.setStartTime(System.currentTimeMillis() + delay);
-				changeState(job, Job.SLEEPING);
-			} else {
-				job.setStartTime(System.currentTimeMillis() + delayFor(job.getPriority()));
-				changeState(job, Job.WAITING);
-			}
-		}
-	}
-
-	/**
-	 * Shuts down the job manager.  Currently running jobs will be told
-	 * to stop, but worker threads may still continue processing.
-	 * (note: This implemented IJobManager.shutdown which was removed
-	 * due to problems caused by premature shutdown)
-	 */
-	private void doShutdown() {
-		Job[] toCancel = null;
-		synchronized (lock) {
-			if (active) {
-				active = false;
-				//cancel all running jobs
-				toCancel = (Job[]) running.toArray(new Job[running.size()]);
-				//clean up
-				sleeping.clear();
-				waiting.clear();
-				running.clear();
-			}
-		}
-
-		// Give running jobs a chance to finish. Wait 0.1 seconds for up to 3 times.
-		if (toCancel != null && toCancel.length > 0) {
-			for (int i = 0; i < toCancel.length; i++) {
-				cancel(toCancel[i]); // cancel jobs outside sync block to avoid deadlock
-			}
-
-			for (int waitAttempts = 0; waitAttempts < 3; waitAttempts++) {
-				Thread.yield();
-				synchronized (lock) {
-					if (running.isEmpty())
-						break;
-				}
-				if (DEBUG_SHUTDOWN) {
-					JobManager.debug("Shutdown - job wait cycle #" + (waitAttempts + 1)); //$NON-NLS-1$
-					Job[] stillRunning = null;
-					synchronized (lock) {
-						stillRunning = (Job[]) running.toArray(new Job[running.size()]);
-					}
-					if (stillRunning != null) {
-						for (int j = 0; j < stillRunning.length; j++) {
-							JobManager.debug("\tJob: " + printJobName(stillRunning[j])); //$NON-NLS-1$
-						}
-					}
-				}
-				try {
-					Thread.sleep(100);
-				} catch (InterruptedException e) {
-					//ignore
-				}
-				Thread.yield();
-			}
-
-			synchronized (lock) { // retrieve list of the jobs that are still running
-				toCancel = (Job[]) running.toArray(new Job[running.size()]);
-			}
-		}
-
-		if (toCancel != null) {
-			for (int i = 0; i < toCancel.length; i++) {
-				String jobName = printJobName(toCancel[i]);
-				//this doesn't need to be translated because it's just being logged
-				String msg = "Job found still running after platform shutdown.  Jobs should be canceled by the plugin that scheduled them during shutdown: " + jobName; //$NON-NLS-1$
-				RuntimeLog.log(new Status(IStatus.WARNING, JobManager.PI_JOBS, JobManager.PLUGIN_ERROR, msg, null));
-				
-				// TODO the RuntimeLog.log in its current implementation won't produce a log 
-				// during this stage of shutdown. For now add a standard error output.
-				// One the logging story is improved, the System.err output below can be removed:
-				System.err.println(msg);
-			}
-		}
-
-		pool.shutdown();
-	}
-
-	/**
-	 * Indicates that a job was running, and has now finished.  Note that this method 
-	 * can be called under OutOfMemoryError conditions and thus must be paranoid 
-	 * about allocating objects.
-	 */
-	protected void endJob(InternalJob job, IStatus result, boolean notify) {
-		InternalJob blocked = null;
-		int blockedJobCount = 0;
-		long rescheduleDelay = InternalJob.T_NONE;
-		synchronized (lock) {
-			//if the job is finishing asynchronously, there is nothing more to do for now
-			if (result == Job.ASYNC_FINISH)
-				return;
-			//if job is not known then it cannot be done
-			if (job.getState() == Job.NONE)
-				return;
-			if (JobManager.DEBUG && notify)
-				JobManager.debug("Ending job: " + job); //$NON-NLS-1$
-			job.setResult(result);
-			job.setProgressMonitor(null);
-			job.setThread(null);
-			rescheduleDelay = job.getStartTime();
-			changeState(job, Job.NONE);
-			blocked = job.previous();
-			job.remove();
-
-			//add any blocked jobs back to the wait queue
-			while (blocked != null) {
-				InternalJob previous = blocked.previous();
-				changeState(blocked, Job.WAITING);
-				blockedJobCount++;
-				blocked = previous;
-			}
-		}
-		//notify queue outside sync block
-		for (int i = 0; i < blockedJobCount; i++)
-			pool.jobQueued(blocked);
-		//notify listeners outside sync block
-		final boolean reschedule = active && rescheduleDelay > InternalJob.T_NONE && job.shouldSchedule();
-		if (notify)
-			jobListeners.done((Job) job, result, reschedule);
-		//reschedule the job if requested and we are still active
-		if (reschedule)
-			schedule(job, rescheduleDelay, reschedule);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#endRule(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public void endRule(ISchedulingRule rule) {
-		implicitJobs.end(rule, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#find(java.lang.String)
-	 */
-	public Job[] find(Object family) {
-		List members = select(family);
-		return (Job[]) members.toArray(new Job[members.size()]);
-	}
-
-	/**
-	 * Returns a running or blocked job whose scheduling rule conflicts with the 
-	 * scheduling rule of the given waiting job.  Returns null if there are no 
-	 * conflicting jobs.  A job can only run if there are no running jobs and no blocked
-	 * jobs whose scheduling rule conflicts with its rule.
-	 */
-	protected InternalJob findBlockingJob(InternalJob waitingJob) {
-		if (waitingJob.getRule() == null)
-			return null;
-		synchronized (lock) {
-			if (running.isEmpty())
-				return null;
-			//check the running jobs
-			boolean hasBlockedJobs = false;
-			for (Iterator it = running.iterator(); it.hasNext();) {
-				InternalJob job = (InternalJob) it.next();
-				if (waitingJob.isConflicting(job))
-					return job;
-				if (!hasBlockedJobs)
-					hasBlockedJobs = job.previous() != null;
-			}
-			//there are no blocked jobs, so we are done
-			if (!hasBlockedJobs)
-				return null;
-			//check all jobs blocked by running jobs
-			for (Iterator it = running.iterator(); it.hasNext();) {
-				InternalJob job = (InternalJob) it.next();
-				while (true) {
-					job = job.previous();
-					if (job == null)
-						break;
-					if (waitingJob.isConflicting(job))
-						return job;
-				}
-			}
-		}
-		return null;
-	}
-
-	public LockManager getLockManager() {
-		return lockManager;
-	}
-
-	private void initDebugOptions() {
-		DEBUG = JobOSGiUtils.getDefault().getBooleanDebugOption(OPTION_DEBUG_JOBS, false);
-		DEBUG_BEGIN_END = JobOSGiUtils.getDefault().getBooleanDebugOption(OPTION_DEBUG_BEGIN_END, false);
-		DEBUG_DEADLOCK = JobOSGiUtils.getDefault().getBooleanDebugOption(OPTION_DEADLOCK_ERROR, false);
-		DEBUG_LOCKS = JobOSGiUtils.getDefault().getBooleanDebugOption(OPTION_LOCKS, false);
-		DEBUG_TIMING = JobOSGiUtils.getDefault().getBooleanDebugOption(OPTION_DEBUG_JOBS_TIMING, false);
-		DEBUG_SHUTDOWN = JobOSGiUtils.getDefault().getBooleanDebugOption(OPTION_SHUTDOWN, false);
-	}
-
-	/**
-	 * Returns whether the job manager is active (has not been shutdown).
-	 */
-	protected boolean isActive() {
-		return active;
-	}
-
-	/**
-	 * Returns true if the given job is blocking the execution of a non-system
-	 * job.
-	 */
-	protected boolean isBlocking(InternalJob runningJob) {
-		synchronized (lock) {
-			//if this job isn't running, it can't be blocking anyone
-			if (runningJob.getState() != Job.RUNNING)
-				return false;
-			//if any job is queued behind this one, it is blocked by it
-			InternalJob previous = runningJob.previous();
-			while (previous != null) {
-				if (!previous.isSystem())
-					return true;
-				//implicit jobs should interrupt unless they act on behalf of system jobs
-				if (previous instanceof ThreadJob && ((ThreadJob) previous).shouldInterrupt())
-					return true;
-				previous = previous.previous();
-			}
-			//none found
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#isIdle()
-	 */
-	public boolean isIdle() {
-		synchronized (lock) {
-			return running.isEmpty() && waiting.isEmpty();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.Job#job(org.eclipse.core.runtime.jobs.Job)
-	 */
-	protected void join(InternalJob job) {
-		final IJobChangeListener listener;
-		final Semaphore barrier;
-		synchronized (lock) {
-			int state = job.getState();
-			if (state == Job.NONE)
-				return;
-			//don't join a waiting or sleeping job when suspended (deadlock risk)
-			if (suspended && state != Job.RUNNING)
-				return;
-			//the semaphore will be released when the job is done
-			barrier = new Semaphore(null);
-			listener = new JobChangeAdapter() {
-				public void done(IJobChangeEvent event) {
-					barrier.release();
-				}
-			};
-			job.addJobChangeListener(listener);
-			//compute set of all jobs that must run before this one
-			//add a listener that removes jobs from the blocking set when they finish
-		}
-		//wait until listener notifies this thread.
-		try {
-			while (true) {
-				//notify hook to service pending syncExecs before falling asleep
-				lockManager.aboutToWait(job.getThread());
-				try {
-					if (barrier.acquire(Long.MAX_VALUE))
-						break;
-				} catch (InterruptedException e) {
-					//loop and keep trying
-				}
-			}
-		} finally {
-			lockManager.aboutToRelease();
-			job.removeJobChangeListener(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobManager#join(String, IProgressMonitor)
-	 */
-	public void join(final Object family, IProgressMonitor monitor) throws InterruptedException, OperationCanceledException {
-		monitor = monitorFor(monitor);
-		IJobChangeListener listener = null;
-		final Set jobs;
-		int jobCount;
-		Job blocking = null;
-		synchronized (lock) {
-			//don't join a waiting or sleeping job when suspended (deadlock risk)
-			int states = suspended ? Job.RUNNING : Job.RUNNING | Job.WAITING | Job.SLEEPING;
-			jobs = Collections.synchronizedSet(new HashSet(select(family, states)));
-			jobCount = jobs.size();
-			if (jobCount == 0)
-				return;
-			//if there is only one blocking job, use it in the blockage callback below
-			if (jobCount == 1)
-				blocking = (Job) jobs.iterator().next();
-			listener = new JobChangeAdapter() {
-				public void done(IJobChangeEvent event) {
-					//don't remove from list if job is being rescheduled
-					if (!((JobChangeEvent) event).reschedule)
-						jobs.remove(event.getJob());
-				}
-
-				//update the list of jobs if new ones are added during the join
-				public void scheduled(IJobChangeEvent event) {
-					//don't add to list if job is being rescheduled
-					if (((JobChangeEvent) event).reschedule)
-						return;
-					Job job = event.getJob();
-					if (job.belongsTo(family))
-						jobs.add(job);
-				}
-			};
-			addJobChangeListener(listener);
-		}
-		//spin until all jobs are completed
-		try {
-			monitor.beginTask(JobMessages.jobs_blocked0, jobCount);
-			monitor.subTask(NLS.bind(JobMessages.jobs_waitFamSub, Integer.toString(jobCount)));
-			reportBlocked(monitor, blocking);
-			int jobsLeft;
-			int reportedWorkDone = 0;
-			while ((jobsLeft = jobs.size()) > 0) {
-				//don't let there be negative work done if new jobs have
-				//been added since the join began
-				int actualWorkDone = Math.max(0, jobCount - jobsLeft);
-				if (reportedWorkDone < actualWorkDone) {
-					monitor.worked(actualWorkDone - reportedWorkDone);
-					reportedWorkDone = actualWorkDone;
-					monitor.subTask(NLS.bind(JobMessages.jobs_waitFamSub, Integer.toString(jobsLeft)));
-				}
-				if (Thread.interrupted())
-					throw new InterruptedException();
-				if (monitor.isCanceled())
-					throw new OperationCanceledException();
-				//notify hook to service pending syncExecs before falling asleep
-				lockManager.aboutToWait(null);
-				Thread.sleep(100);
-			}
-		} finally {
-			removeJobChangeListener(listener);
-			reportUnblocked(monitor);
-			monitor.done();
-		}
-	}
-
-	/**
-	 * Returns a non-null progress monitor instance.  If the monitor is null,
-	 * returns the default monitor supplied by the progress provider, or a 
-	 * NullProgressMonitor if no default monitor is available.
-	 */
-	private IProgressMonitor monitorFor(IProgressMonitor monitor) {
-		if (monitor == null || (monitor instanceof NullProgressMonitor)) {
-			if (progressProvider != null) {
-				try {
-					monitor = progressProvider.getDefaultMonitor();
-				} catch (Exception e) {
-					String msg = NLS.bind(JobMessages.meta_pluginProblems, JobManager.PI_JOBS);
-					RuntimeLog.log(new Status(IStatus.ERROR, JobManager.PI_JOBS, JobManager.PLUGIN_ERROR, msg, e));
-				}
-			}
-		}
-
-		if (monitor == null)
-			return new NullProgressMonitor();
-		return monitor;
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobManager#newLock(java.lang.String)
-	 */
-	public ILock newLock() {
-		return lockManager.newLock();
-	}
-
-	/**
-	 * Removes and returns the first waiting job in the queue. Returns null if there
-	 * are no items waiting in the queue.  If an item is removed from the queue,
-	 * it is moved to the running jobs list.
-	 */
-	private Job nextJob() {
-		synchronized (lock) {
-			//do nothing if the job manager is suspended
-			if (suspended)
-				return null;
-			//tickle the sleep queue to see if anyone wakes up
-			long now = System.currentTimeMillis();
-			InternalJob job = sleeping.peek();
-			while (job != null && job.getStartTime() < now) {
-				job.setStartTime(now + delayFor(job.getPriority()));
-				changeState(job, Job.WAITING);
-				job = sleeping.peek();
-			}
-			//process the wait queue until we find a job whose rules are satisfied.
-			while ((job = waiting.peek()) != null) {
-				InternalJob blocker = findBlockingJob(job);
-				if (blocker == null)
-					break;
-				//queue this job after the job that's blocking it
-				changeState(job, InternalJob.BLOCKED);
-				//assert job does not already belong to some other data structure
-				Assert.isTrue(job.next() == null);
-				Assert.isTrue(job.previous() == null);
-				blocker.addLast(job);
-			}
-			//the job to run must be in the running list before we exit
-			//the sync block, otherwise two jobs with conflicting rules could start at once
-			if (job != null) {
-				changeState(job, InternalJob.ABOUT_TO_RUN);
-				if (JobManager.DEBUG)
-					JobManager.debug("Starting job: " + job); //$NON-NLS-1$
-			}
-			return (Job) job;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#removeJobListener(org.eclipse.core.runtime.jobs.IJobChangeListener)
-	 */
-	public void removeJobChangeListener(IJobChangeListener listener) {
-		jobListeners.remove(listener);
-	}
-
-	/**
-	 * Report to the progress monitor that this thread is blocked, supplying
-	 * an information message, and if possible the job that is causing the blockage.
-	 * Important: An invocation of this method MUST be followed eventually be
-	 * an invocation of reportUnblocked.
-	 * @param monitor The monitor to report blocking to
-	 * @param blockingJob The job that is blocking this thread, or <code>null</code>
-	 * @see #reportUnblocked
-	 */
-	final void reportBlocked(IProgressMonitor monitor, InternalJob blockingJob) {
-		if (!(monitor instanceof IProgressMonitorWithBlocking))
-			return;
-		IStatus reason;
-		if (blockingJob == null || blockingJob instanceof ThreadJob || blockingJob.isSystem()) {
-			reason = new Status(IStatus.INFO, JobManager.PI_JOBS, 1, JobMessages.jobs_blocked0, null);
-		} else {
-			String msg = NLS.bind(JobMessages.jobs_blocked1, blockingJob.getName());
-			reason = new JobStatus(IStatus.INFO, (Job) blockingJob, msg);
-		}
-		((IProgressMonitorWithBlocking) monitor).setBlocked(reason);
-	}
-
-	/**
-	 * Reports that this thread was blocked, but is no longer blocked and is able
-	 * to proceed.
-	 * @param monitor The monitor to report unblocking to.
-	 * @see #reportBlocked
-	 */
-	final void reportUnblocked(IProgressMonitor monitor) {
-		if (monitor instanceof IProgressMonitorWithBlocking)
-			((IProgressMonitorWithBlocking) monitor).clearBlocked();
-	}
-
-	/*(non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#resume()
-	 */
-	public final void resume() {
-		synchronized (lock) {
-			suspended = false;
-			//poke the job pool
-			pool.jobQueued(null);
-		}
-	}
-
-	/** (non-Javadoc)
-	 * @deprecated this method should not be used
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#resume(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public final void resume(ISchedulingRule rule) {
-		implicitJobs.resume(rule);
-	}
-
-	/**
-	 * Attempts to immediately start a given job.  Returns true if the job was
-	 * successfully started, and false if it could not be started immediately
-	 * due to a currently running job with a conflicting rule.  Listeners will never
-	 * be notified of jobs that are run in this way.
-	 */
-	protected boolean runNow(InternalJob job) {
-		synchronized (lock) {
-			//cannot start if there is a conflicting job
-			if (findBlockingJob(job) != null)
-				return false;
-			changeState(job, Job.RUNNING);
-			job.setProgressMonitor(new NullProgressMonitor());
-			job.run(null);
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.Job#schedule(long)
-	 */
-	protected void schedule(InternalJob job, long delay, boolean reschedule) {
-		if (!active)
-			throw new IllegalStateException("Job manager has been shut down."); //$NON-NLS-1$
-		Assert.isNotNull(job, "Job is null"); //$NON-NLS-1$
-		Assert.isLegal(delay >= 0, "Scheduling delay is negative"); //$NON-NLS-1$
-		synchronized (lock) {
-			//if the job is already running, set it to be rescheduled when done
-			if (job.getState() == Job.RUNNING) {
-				job.setStartTime(delay);
-				return;
-			}
-			//can't schedule a job that is waiting or sleeping
-			if (job.internalGetState() != Job.NONE)
-				return;
-			if (JobManager.DEBUG)
-				JobManager.debug("Scheduling job: " + job); //$NON-NLS-1$
-			//remember that we are about to schedule the job
-			//to prevent multiple schedule attempts from succeeding (bug 68452)
-			changeState(job, InternalJob.ABOUT_TO_SCHEDULE);
-		}
-		//notify listeners outside sync block
-		jobListeners.scheduled((Job) job, delay, reschedule);
-		//schedule the job
-		doSchedule(job, delay);
-		//call the pool outside sync block to avoid deadlock
-		pool.jobQueued(job);
-	}
-
-	/**
-	 * Adds all family members in the list of jobs to the collection
-	 */
-	private void select(List members, Object family, InternalJob firstJob, int stateMask) {
-		if (firstJob == null)
-			return;
-		InternalJob job = firstJob;
-		do {
-			//note that job state cannot be NONE at this point
-			if ((family == null || job.belongsTo(family)) && ((job.getState() & stateMask) != 0))
-				members.add(job);
-			job = job.previous();
-		} while (job != null && job != firstJob);
-	}
-
-	/**
-	 * Returns a list of all jobs known to the job manager that belong to the given family.
-	 */
-	private List select(Object family) {
-		return select(family, Job.WAITING | Job.SLEEPING | Job.RUNNING);
-	}
-
-	/**
-	 * Returns a list of all jobs known to the job manager that belong to the given 
-	 * family and are in one of the provided states.
-	 */
-	private List select(Object family, int stateMask) {
-		List members = new ArrayList();
-		synchronized (lock) {
-			if ((stateMask & Job.RUNNING) != 0) {
-				for (Iterator it = running.iterator(); it.hasNext();) {
-					select(members, family, (InternalJob) it.next(), stateMask);
-				}
-			}
-			if ((stateMask & Job.WAITING) != 0)
-				select(members, family, waiting.peek(), stateMask);
-			if ((stateMask & Job.SLEEPING) != 0)
-				select(members, family, sleeping.peek(), stateMask);
-		}
-		return members;
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobManager#setLockListener(LockListener)
-	 */
-	public void setLockListener(LockListener listener) {
-		lockManager.setLockListener(listener);
-	}
-
-	/**
-	 * Changes a job priority.
-	 */
-	protected void setPriority(InternalJob job, int newPriority) {
-		synchronized (lock) {
-			int oldPriority = job.getPriority();
-			if (oldPriority == newPriority)
-				return;
-			job.internalSetPriority(newPriority);
-			//if the job is waiting to run, re-shuffle the queue
-			if (job.getState() == Job.WAITING) {
-				long oldStart = job.getStartTime();
-				job.setStartTime(oldStart + (delayFor(newPriority) - delayFor(oldPriority)));
-				waiting.resort(job);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobManager#setProgressProvider(IProgressProvider)
-	 */
-	public void setProgressProvider(ProgressProvider provider) {
-		progressProvider = provider;
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#setRule
-	 */
-	public void setRule(InternalJob job, ISchedulingRule rule) {
-		synchronized (lock) {
-			//cannot change the rule of a job that is already running
-			Assert.isLegal(job.getState() == Job.NONE);
-			validateRule(rule);
-			job.internalSetRule(rule);
-		}
-	}
-
-	/**
-	 * Puts a job to sleep. Returns true if the job was successfully put to sleep.
-	 */
-	protected boolean sleep(InternalJob job) {
-		synchronized (lock) {
-			switch (job.getState()) {
-				case Job.RUNNING :
-					//cannot be paused if it is already running (as opposed to ABOUT_TO_RUN)
-					if (job.internalGetState() == Job.RUNNING)
-						return false;
-					//job hasn't started running yet (aboutToRun listener)
-					break;
-				case Job.SLEEPING :
-					//update the job wake time
-					job.setStartTime(InternalJob.T_INFINITE);
-					//change state again to re-shuffle the sleep queue
-					changeState(job, Job.SLEEPING);
-					return true;
-				case Job.NONE :
-					return true;
-				case Job.WAITING :
-					//put the job to sleep
-					break;
-			}
-			job.setStartTime(InternalJob.T_INFINITE);
-			changeState(job, Job.SLEEPING);
-		}
-		jobListeners.sleeping((Job) job);
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobManager#sleep(String)
-	 */
-	public void sleep(Object family) {
-		//don't synchronize because sleep calls listeners
-		for (Iterator it = select(family).iterator(); it.hasNext();) {
-			sleep((InternalJob) it.next());
-		}
-	}
-
-	/**
-	 * Returns the estimated time in milliseconds before the next job is scheduled
-	 * to wake up. The result may be negative.  Returns InternalJob.T_INFINITE if
-	 * there are no sleeping or waiting jobs.
-	 */
-	protected long sleepHint() {
-		synchronized (lock) {
-			//wait forever if job manager is suspended
-			if (suspended)
-				return InternalJob.T_INFINITE;
-			if (!waiting.isEmpty())
-				return 0L;
-			//return the anticipated time that the next sleeping job will wake
-			InternalJob next = sleeping.peek();
-			if (next == null)
-				return InternalJob.T_INFINITE;
-			return next.getStartTime() - System.currentTimeMillis();
-		}
-	}
-
-	/**
-	 * Returns the next job to be run, or null if no jobs are waiting to run.
-	 * The worker must call endJob when the job is finished running.  
-	 */
-	protected Job startJob() {
-		Job job = null;
-		while (true) {
-			job = nextJob();
-			if (job == null)
-				return null;
-			//must perform this outside sync block because it is third party code
-			if (job.shouldRun()) {
-				//check for listener veto
-				jobListeners.aboutToRun(job);
-				//listeners may have canceled or put the job to sleep
-				synchronized (lock) {
-					if (job.getState() == Job.RUNNING) {
-						InternalJob internal = job;
-						if (internal.getProgressMonitor() == null)
-							internal.setProgressMonitor(createMonitor(job));
-						//change from ABOUT_TO_RUN to RUNNING
-						internal.internalSetState(Job.RUNNING);
-						break;
-					}
-				}
-			}
-			if (job.getState() != Job.SLEEPING) {
-				//job has been vetoed or canceled, so mark it as done
-				endJob(job, Status.CANCEL_STATUS, true);
-				continue;
-			}
-		}
-		jobListeners.running(job);
-		return job;
-
-	}
-
-	/* non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#suspend()
-	 */
-	public final void suspend() {
-		synchronized (lock) {
-			suspended = true;
-		}
-	}
-
-	/** (non-Javadoc)
-	 * @deprecated this method should not be used
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#suspend(org.eclipse.core.runtime.jobs.ISchedulingRule, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public final void suspend(ISchedulingRule rule, IProgressMonitor monitor) {
-		Assert.isNotNull(rule);
-		implicitJobs.suspend(rule, monitorFor(monitor));
-	}
-
-	/* non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobManager#transferRule()
-	 */
-	public void transferRule(ISchedulingRule rule, Thread destinationThread) {
-		implicitJobs.transfer(rule, destinationThread);
-	}
-
-	/**
-	 * Validates that the given scheduling rule obeys the constraints of
-	 * scheduling rules as described in the <code>ISchedulingRule</code>
-	 * javadoc specification.
-	 */
-	private void validateRule(ISchedulingRule rule) {
-		//null rule always valid
-		if (rule == null)
-			return;
-		//contains method must be reflexive
-		Assert.isLegal(rule.contains(rule));
-		//contains method must return false when given an unknown rule
-		Assert.isLegal(!rule.contains(nullRule));
-		//isConflicting method must be reflexive
-		Assert.isLegal(rule.isConflicting(rule));
-		//isConflicting method must return false when given an unknown rule
-		Assert.isLegal(!rule.isConflicting(nullRule));
-	}
-
-	/* (non-Javadoc)
-	 * @see Job#wakeUp(long)
-	 */
-	protected void wakeUp(InternalJob job, long delay) {
-		Assert.isLegal(delay >= 0, "Scheduling delay is negative"); //$NON-NLS-1$
-		synchronized (lock) {
-			//cannot wake up if it is not sleeping
-			if (job.getState() != Job.SLEEPING)
-				return;
-			doSchedule(job, delay);
-		}
-		//call the pool outside sync block to avoid deadlock
-		pool.jobQueued(job);
-
-		//only notify of wake up if immediate
-		if (delay == 0)
-			jobListeners.awake((Job) job);
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobFamily#wakeUp(String)
-	 */
-	public void wakeUp(Object family) {
-		//don't synchronize because wakeUp calls listeners
-		for (Iterator it = select(family).iterator(); it.hasNext();) {
-			wakeUp((InternalJob) it.next(), 0L);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobMessages.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobMessages.java
deleted file mode 100644
index 562d750..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobMessages.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 - Initial API and implementation
- **********************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import java.util.Date;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Job plugin message catalog
- */
-public class JobMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.core.internal.jobs.messages"; //$NON-NLS-1$
-
-	// Job Manager and Locks
-	public static String jobs_blocked0;
-	public static String jobs_blocked1;
-	public static String jobs_internalError;
-	public static String jobs_waitFamSub;
-
-	// metadata
-	public static String meta_pluginProblems;
-
-	static {
-		// load message values from bundle file
-		reloadMessages();
-	}
-
-	public static void reloadMessages() {
-		NLS.initializeMessages(BUNDLE_NAME, JobMessages.class);
-	}
-
-	/**
-	 * Print a debug message to the console. 
-	 * Pre-pend the message with the current date and the name of the current thread.
-	 */
-	public static void message(String message) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(new Date(System.currentTimeMillis()));
-		buffer.append(" - ["); //$NON-NLS-1$
-		buffer.append(Thread.currentThread().getName());
-		buffer.append("] "); //$NON-NLS-1$
-		buffer.append(message);
-		System.out.println(buffer.toString());
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobOSGiUtils.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobOSGiUtils.java
deleted file mode 100644
index 40dc3da..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobOSGiUtils.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.jobs;
-
-import org.eclipse.osgi.service.debug.DebugOptions;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.packageadmin.PackageAdmin;
-import org.osgi.util.tracker.ServiceTracker;
-
-/**
- * The class contains a set of helper methods for the runtime Jobs plugin.
- * The following utility methods are supplied:
- * - provides access to debug options
- * - provides some bundle discovery functionality
- * 
- * The closeServices() method should be called before the plugin is stopped. 
- * 
- * @since org.eclipse.core.jobs 3.2
- */
-public class JobOSGiUtils {
-	private ServiceTracker debugTracker = null;
-	private ServiceTracker bundleTracker = null;
-
-	private static final JobOSGiUtils singleton = new JobOSGiUtils();
-
-	/**
-	 * Accessor for the singleton instance
-	 * @return The JobOSGiUtils instance
-	 */
-	public static JobOSGiUtils getDefault() {
-		return singleton;
-	}
-
-	/**
-	 * Private constructor to block instance creation.
-	 */
-	private JobOSGiUtils() {
-		initServices();
-	}
-
-	private void initServices() {
-		BundleContext context = JobActivator.getContext();
-		if (context == null) {
-			if (JobManager.DEBUG)
-				JobMessages.message("JobsOSGiUtils called before plugin started"); //$NON-NLS-1$
-			return;
-		}
-
-		debugTracker = new ServiceTracker(context, DebugOptions.class.getName(), null);
-		debugTracker.open();
-
-		bundleTracker = new ServiceTracker(context, PackageAdmin.class.getName(), null);
-		bundleTracker.open();
-	}
-
-	void closeServices() {
-		if (debugTracker != null) {
-			debugTracker.close();
-			debugTracker = null;
-		}
-		if (bundleTracker != null) {
-			bundleTracker.close();
-			bundleTracker = null;
-		}
-	}
-
-	public boolean getBooleanDebugOption(String option, boolean defaultValue) {
-		if (debugTracker == null) {
-			if (JobManager.DEBUG)
-				JobMessages.message("Debug tracker is not set"); //$NON-NLS-1$
-			return defaultValue;
-		}
-		DebugOptions options = (DebugOptions) debugTracker.getService();
-		if (options != null) {
-			String value = options.getOption(option);
-			if (value != null)
-				return value.equalsIgnoreCase("true"); //$NON-NLS-1$
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * Returns the bundle id of the bundle that contains the provided object, or
-	 * <code>null</code> if the bundle could not be determined.
-	 */
-	public String getBundleId(Object object) {
-		if (bundleTracker == null) {
-			if (JobManager.DEBUG)
-				JobMessages.message("Bundle tracker is not set"); //$NON-NLS-1$
-			return null;
-		}
-		PackageAdmin packageAdmin = (PackageAdmin) bundleTracker.getService();
-		if (object == null)
-			return null;
-		if (packageAdmin == null)
-			return null;
-		Bundle source = packageAdmin.getBundle(object.getClass());
-		if (source != null && source.getSymbolicName() != null)
-			return source.getSymbolicName();
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobQueue.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobQueue.java
deleted file mode 100644
index aa12cd1..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobQueue.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import org.eclipse.core.runtime.*;
-
-/**
- * A linked list based priority queue. Either the elements in the queue must
- * implement Comparable, or a Comparator must be provided.
- */
-public class JobQueue {
-	/**
-	 * The dummy entry sits between the head and the tail of the queue.
-	 * dummy.previous() is the head, and dummy.next() is the tail.
-	 */
-	private final InternalJob dummy;
-
-	/**
-	 * If true, conflicting jobs will be allowed to overtake others in the
-	 * queue that have lower priority. If false, higher priority jumps can only
-	 * move up the queue by overtaking jobs that they don't conflict with.
-	 */
-	private boolean allowConflictOvertaking;
-
-	/**
-	 * Create a new job queue. 
-	 */
-	public JobQueue(boolean allowConflictOvertaking) {
-		//compareTo on dummy is never called
-		dummy = new InternalJob("Queue-Head") {//$NON-NLS-1$
-			public IStatus run(IProgressMonitor m) {
-				return Status.OK_STATUS;
-			}
-		};
-		dummy.setNext(dummy);
-		dummy.setPrevious(dummy);
-		this.allowConflictOvertaking = allowConflictOvertaking;
-	}
-
-	/** 
-	 * remove all elements 
-	 */
-	public void clear() {
-		dummy.setNext(dummy);
-		dummy.setPrevious(dummy);
-	}
-
-	/**
-	 * Return and remove the element with highest priority, or null if empty. 
-	 */
-	public InternalJob dequeue() {
-		InternalJob toRemove = dummy.previous();
-		if (toRemove == dummy)
-			return null;
-		return toRemove.remove();
-	}
-
-	/**
-	 * Adds an item to the queue 
-	 */
-	public void enqueue(InternalJob newEntry) {
-		//assert new entry is does not already belong to some other data structure
-		Assert.isTrue(newEntry.next() == null);
-		Assert.isTrue(newEntry.previous() == null);
-		InternalJob tail = dummy.next();
-		//overtake lower priority jobs. Only overtake conflicting jobs if allowed to
-		while (tail != dummy && tail.compareTo(newEntry) < 0 && (allowConflictOvertaking || !newEntry.isConflicting(tail)))
-			tail = tail.next();
-		//new entry is smaller than tail
-		final InternalJob tailPrevious = tail.previous();
-		newEntry.setNext(tail);
-		newEntry.setPrevious(tailPrevious);
-		tailPrevious.setNext(newEntry);
-		tail.setPrevious(newEntry);
-	}
-
-	/**
-	 * Removes the given element from the queue. 
-	 */
-	public void remove(InternalJob toRemove) {
-		toRemove.remove();
-		//previous of toRemove might now bubble up
-	}
-
-	/**
-	 * The given object has changed priority. Reshuffle the heap until it is
-	 * valid.
-	 */
-	public void resort(InternalJob entry) {
-		remove(entry);
-		enqueue(entry);
-	}
-
-	/**
-	 * Returns true if the queue is empty, and false otherwise. 
-	 */
-	public boolean isEmpty() {
-		return dummy.next() == dummy;
-	}
-
-	/** 
-	 * Return greatest element without removing it, or null if empty 
-	 */
-	public InternalJob peek() {
-		return dummy.previous() == dummy ? null : dummy.previous();
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobStatus.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobStatus.java
deleted file mode 100644
index 4e9b56b..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/JobStatus.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.IJobStatus;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * Standard implementation of the IJobStatus interface.
- */
-public class JobStatus extends Status implements IJobStatus {
-	private Job job;
-
-	/**
-	 * Creates a new job status with no interesting error code or exception.
-	 * @param severity
-	 * @param job
-	 * @param message
-	 */
-	public JobStatus(int severity, Job job, String message) {
-		super(severity, JobManager.PI_JOBS, 1, message, null);
-		this.job = job;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.IJobStatus#getJob()
-	 */
-	public Job getJob() {
-		return job;
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/LockManager.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/LockManager.java
deleted file mode 100644
index 9fc3cd6..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/LockManager.java
+++ /dev/null
@@ -1,286 +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
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import java.util.HashMap;
-import java.util.Stack;
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.LockListener;
-
-/**
- * Stores the only reference to the graph that contains all the known
- * relationships between locks, rules, and the threads that own them.
- * Synchronizes all access to the graph on the only instance that exists in this class.
- * 
- * Also stores the state of suspended locks so that they can be re-acquired with 
- * the proper lock depth. 
- */
-public class LockManager {
-	/**
-	 * This class captures the state of suspended locks.
-	 * Locks are suspended if deadlock is detected.
-	 */
-	private static class LockState {
-		private int depth;
-		private OrderedLock lock;
-
-		/**
-		 * Suspends ownership of the given lock, and returns the saved state.
-		 */
-		protected static LockState suspend(OrderedLock lock) {
-			LockState state = new LockState();
-			state.lock = lock;
-			state.depth = lock.forceRelease();
-			return state;
-		}
-
-		/**
-		 * Re-acquires a suspended lock and reverts to the correct lock depth.
-		 */
-		public void resume() {
-			//spin until the lock is successfully acquired
-			//NOTE: spinning here allows the UI thread to service pending syncExecs
-			//if the UI thread is waiting to acquire a lock.
-			while (true) {
-				try {
-					if (lock.acquire(Long.MAX_VALUE))
-						break;
-				} catch (InterruptedException e) {
-					//ignore and loop
-				}
-			}
-			lock.setDepth(depth);
-		}
-	}
-
-	//the lock listener for this lock manager
-	protected LockListener lockListener;
-	/* 
-	 * The internal data structure that stores all the relationships 
-	 * between the locks (or rules) and the threads that own them.
-	 */
-	private DeadlockDetector locks = new DeadlockDetector();
-	/* 
-	 * Stores thread - stack pairs where every entry in the stack is an array 
-	 * of locks that were suspended while the thread was acquiring more locks
-	 * (a stack is needed because when a thread tries to re-aquire suspended locks,
-	 * it can cause deadlock, and some locks it owns can be suspended again)
-	 */
-	private HashMap suspendedLocks = new HashMap();
-
-	public LockManager() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on LockListener
-	 */
-	public void aboutToRelease() {
-		if (lockListener == null)
-			return;
-		try {
-			lockListener.aboutToRelease();
-		} catch (Exception e) {
-			handleException(e);
-		} catch (LinkageError e) {
-			handleException(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on LockListener
-	 */
-	public boolean aboutToWait(Thread lockOwner) {
-		if (lockListener == null)
-			return false;
-		try {
-			return lockListener.aboutToWait(lockOwner);
-		} catch (Exception e) {
-			handleException(e);
-		} catch (LinkageError e) {
-			handleException(e);
-		}
-		return false;
-	}
-
-	/**
-	 * This thread has just acquired a lock.  Update graph.
-	 */
-	void addLockThread(Thread thread, ISchedulingRule lock) {
-		if (locks == null)
-			return;
-		try {
-			synchronized (locks) {
-				locks.lockAcquired(thread, lock);
-			}
-		} catch (Exception e) {
-			handleInternalError(e);
-		}
-	}
-
-	/**
-	 * This thread has just been refused a lock.  Update graph and check for deadlock.
-	 */
-	void addLockWaitThread(Thread thread, ISchedulingRule lock) {
-		if (locks == null)
-			return;
-		try {
-			Deadlock found = null;
-			synchronized (locks) {
-				found = locks.lockWaitStart(thread, lock);
-			}
-			if (found == null)
-				return;
-			// if deadlock was detected, the found variable will contain all the information about it,
-			// including which locks to suspend for which thread to resolve the deadlock.
-			ISchedulingRule[] toSuspend = found.getLocks();
-			LockState[] suspended = new LockState[toSuspend.length];
-			for (int i = 0; i < toSuspend.length; i++)
-				suspended[i] = LockState.suspend((OrderedLock) toSuspend[i]);
-			synchronized (suspendedLocks) {
-				Stack prevLocks = (Stack) suspendedLocks.get(found.getCandidate());
-				if (prevLocks == null)
-					prevLocks = new Stack();
-				prevLocks.push(suspended);
-				suspendedLocks.put(found.getCandidate(), prevLocks);
-			}
-		} catch (Exception e) {
-			handleInternalError(e);
-		}
-	}
-
-	/**
-	 * Handles exceptions that occur while calling third party code from within the
-	 * LockManager. This is essentially an in-lined version of Platform.run(ISafeRunnable)
-	 */
-	private static void handleException(Throwable e) {
-		IStatus status;
-		if (e instanceof CoreException) {
-			//logged message should not be translated
-			status = new MultiStatus(JobManager.PI_JOBS, JobManager.PLUGIN_ERROR, "LockManager.handleException", e); //$NON-NLS-1$
-			((MultiStatus) status).merge(((CoreException) e).getStatus());
-		} else {
-			status = new Status(IStatus.ERROR, JobManager.PI_JOBS, JobManager.PLUGIN_ERROR, "LockManager.handleException", e); //$NON-NLS-1$
-		}
-		RuntimeLog.log(status);
-	}
-
-	/**
-	 * There was an internal error in the deadlock detection code.  Shut the entire
-	 * thing down to prevent further errors.  Recovery is too complex as it
-	 * requires freezing all threads and inferring the present lock state.
-	 */
-	private void handleInternalError(Throwable t) {
-		try {
-			handleException(t);
-			locks.toDebugString();
-		} catch (Exception e2) {
-			//ignore failure to log or to create the debug string
-		}
-		//discard the deadlock detector for good
-		locks = null;
-	}
-
-	/**
-	 * Returns true IFF the underlying graph is empty.
-	 * For debugging purposes only.
-	 */
-	public boolean isEmpty() {
-		return locks.isEmpty();
-	}
-
-	/**
-	 * Returns true IFF this thread either owns, or is waiting for, any locks or rules.
-	 */
-	public boolean isLockOwner() {
-		//all job threads have to be treated as lock owners because UI thread 
-		//may try to join a job
-		Thread current = Thread.currentThread();
-		if (current instanceof Worker)
-			return true;
-		if (locks == null)
-			return false;
-		synchronized (locks) {
-			return locks.contains(Thread.currentThread());
-		}
-	}
-
-	/**
-	 * Creates and returns a new lock.
-	 */
-	public synchronized OrderedLock newLock() {
-		return new OrderedLock(this);
-	}
-
-	/**
-	 * Releases all the acquires that were called on the given rule. Needs to be called only once.
-	 */
-	void removeLockCompletely(Thread thread, ISchedulingRule rule) {
-		if (locks == null)
-			return;
-		try {
-			synchronized (locks) {
-				locks.lockReleasedCompletely(thread, rule);
-			}
-		} catch (Exception e) {
-			handleInternalError(e);
-		}
-	}
-
-	/**
-	 * This thread has just released a lock.  Update graph.
-	 */
-	void removeLockThread(Thread thread, ISchedulingRule lock) {
-		try {
-			synchronized (locks) {
-				locks.lockReleased(thread, lock);
-			}
-		} catch (Exception e) {
-			handleInternalError(e);
-		}
-	}
-
-	/**
-	 * This thread has just stopped waiting for a lock. Update graph.
-	 */
-	void removeLockWaitThread(Thread thread, ISchedulingRule lock) {
-		try {
-			synchronized (locks) {
-				locks.lockWaitStop(thread, lock);
-			}
-		} catch (Exception e) {
-			handleInternalError(e);
-		}
-	}
-
-	/**
-	 * Resumes all the locks that were suspended while this thread was waiting to acquire another lock.
-	 */
-	void resumeSuspendedLocks(Thread owner) {
-		LockState[] toResume;
-		synchronized (suspendedLocks) {
-			Stack prevLocks = (Stack) suspendedLocks.get(owner);
-			if (prevLocks == null)
-				return;
-			toResume = (LockState[]) prevLocks.pop();
-			if (prevLocks.empty())
-				suspendedLocks.remove(owner);
-		}
-		for (int i = 0; i < toResume.length; i++)
-			toResume[i].resume();
-	}
-
-	public void setLockListener(LockListener listener) {
-		this.lockListener = listener;
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/ObjectMap.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/ObjectMap.java
deleted file mode 100644
index 4564990..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/ObjectMap.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.jobs;
-
-import java.util.*;
-
-/**
- * A specialized map implementation that is optimized for a small set of object
- * keys.
- * 
- * Implemented as a single array that alternates keys and values.
- * 
- * Note: This class is copied from org.eclipse.core.resources
- */
-public class ObjectMap implements Map {
-	// 8 attribute keys, 8 attribute values
-	protected static final int DEFAULT_SIZE = 16;
-	protected static final int GROW_SIZE = 10;
-	protected int count = 0;
-	protected Object[] elements = null;
-
-	/**
-	 * Creates a new object map.
-	 */
-	public ObjectMap() {
-		this(DEFAULT_SIZE);
-	}
-
-	/**
-	 * Creates a new object map.
-	 * 
-	 * @param initialCapacity
-	 *                  The initial number of elements that will fit in the map.
-	 */
-	public ObjectMap(int initialCapacity) {
-		elements = new Object[Math.max(initialCapacity * 2, 0)];
-	}
-
-	/**
-	 * Creates a new object map of the same size as the given map and populate
-	 * it with the key/attribute pairs found in the map.
-	 * 
-	 * @param map
-	 *                  The entries in the given map will be added to the new map.
-	 */
-	public ObjectMap(Map map) {
-		this(map.size());
-		putAll(map);
-	}
-
-	/**
-	 * @see Map#clear()
-	 */
-	public void clear() {
-		elements = null;
-		count = 0;
-	}
-
-	/**
-	 * @see java.lang.Object#clone()
-	 */
-	public Object clone() {
-		return new ObjectMap(this);
-	}
-
-	/**
-	 * @see Map#containsKey(java.lang.Object)
-	 */
-	public boolean containsKey(Object key) {
-		if (elements == null || count == 0)
-			return false;
-		for (int i = 0; i < elements.length; i = i + 2)
-			if (elements[i] != null && elements[i].equals(key))
-				return true;
-		return false;
-	}
-
-	/**
-	 * @see Map#containsValue(java.lang.Object)
-	 */
-	public boolean containsValue(Object value) {
-		if (elements == null || count == 0)
-			return false;
-		for (int i = 1; i < elements.length; i = i + 2)
-			if (elements[i] != null && elements[i].equals(value))
-				return true;
-		return false;
-	}
-
-	/**
-	 * @see Map#entrySet()
-	 *  
-	 * Note: This implementation does not conform properly to the
-	 * specification in the Map interface. The returned collection will not
-	 * be bound to this map and will not remain in sync with this map.
-	 */
-	public Set entrySet() {
-		return toHashMap().entrySet();
-	}
-
-	/**
-	 * @see Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object o) {
-		if (!(o instanceof Map))
-			return false;
-		Map other = (Map) o;
-		//must be same size
-		if (count != other.size())
-			return false;
-		//keysets must be equal
-		if (!keySet().equals(other.keySet()))
-			return false;
-		//values for each key must be equal
-		for (int i = 0; i < elements.length; i = i + 2) {
-			if (elements[i] != null && (!elements[i + 1].equals(other.get(elements[i]))))
-				return false;
-		}
-		return true;
-	}
-
-	/**
-	 * @see Map#get(java.lang.Object)
-	 */
-	public Object get(Object key) {
-		if (elements == null || count == 0)
-			return null;
-		for (int i = 0; i < elements.length; i = i + 2)
-			if (elements[i] != null && elements[i].equals(key))
-				return elements[i + 1];
-		return null;
-	}
-
-	/**
-	 * The capacity of the map has been exceeded, grow the array by GROW_SIZE to
-	 * accomodate more entries.
-	 */
-	protected void grow() {
-		Object[] expanded = new Object[elements.length + GROW_SIZE];
-		System.arraycopy(elements, 0, expanded, 0, elements.length);
-		elements = expanded;
-	}
-
-	/**
-	 * @see Object#hashCode()
-	 */
-	public int hashCode() {
-		int hash = 0;
-		for (int i = 0; i < elements.length; i = i + 2) {
-			if (elements[i] != null) {
-				hash += elements[i].hashCode();
-			}
-		}
-		return hash;
-	}
-
-	/**
-	 * @see Map#isEmpty()
-	 */
-	public boolean isEmpty() {
-		return count == 0;
-	}
-
-	/**
-	 * Returns all keys in this table as an array.
-	 */
-	public String[] keys() {
-		String[] result = new String[count];
-		int next = 0;
-		for (int i = 0; i < elements.length; i = i + 2)
-			if (elements[i] != null)
-				result[next++] = (String) elements[i];
-		return result;
-	}
-
-	/**
-	 * @see Map#keySet() 
-	 * 
-	 * Note: This implementation does not conform properly to the
-	 * specification in the Map interface. The returned collection will not
-	 * be bound to this map and will not remain in sync with this map.
-	 */
-	public Set keySet() {
-		Set result = new HashSet(size());
-		for (int i = 0; i < elements.length; i = i + 2) {
-			if (elements[i] != null) {
-				result.add(elements[i]);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @see Map#put(java.lang.Object, java.lang.Object)
-	 */
-	public Object put(Object key, Object value) {
-		if (key == null)
-			throw new NullPointerException();
-		if (value == null)
-			return remove(key);
-
-		// handle the case where we don't have any attributes yet
-		if (elements == null)
-			elements = new Object[DEFAULT_SIZE];
-		if (count == 0) {
-			elements[0] = key;
-			elements[1] = value;
-			count++;
-			return null;
-		}
-
-		int emptyIndex = -1;
-		// replace existing value if it exists
-		for (int i = 0; i < elements.length; i += 2) {
-			if (elements[i] != null) {
-				if (elements[i].equals(key)) {
-					Object oldValue = elements[i + 1];
-					elements[i + 1] = value;
-					return oldValue;
-				}
-			} else if (emptyIndex == -1) {
-				// keep track of the first empty index
-				emptyIndex = i;
-			}
-		}
-		// this will put the emptyIndex greater than the size but
-		// that's ok because we will grow first.
-		if (emptyIndex == -1)
-			emptyIndex = count * 2;
-
-		// otherwise add it to the list of elements.
-		// grow if necessary
-		if (elements.length <= (count * 2))
-			grow();
-		elements[emptyIndex] = key;
-		elements[emptyIndex + 1] = value;
-		count++;
-		return null;
-	}
-
-	/**
-	 * @see Map#putAll(java.util.Map)
-	 */
-	public void putAll(Map map) {
-		for (Iterator i = map.keySet().iterator(); i.hasNext();) {
-			Object key = i.next();
-			Object value = map.get(key);
-			put(key, value);
-		}
-	}
-
-	/**
-	 * @see Map#remove(java.lang.Object)
-	 */
-	public Object remove(Object key) {
-		if (elements == null || count == 0)
-			return null;
-		for (int i = 0; i < elements.length; i = i + 2) {
-			if (elements[i] != null && elements[i].equals(key)) {
-				elements[i] = null;
-				Object result = elements[i + 1];
-				elements[i + 1] = null;
-				count--;
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc
-	 * Method declared on IStringPoolParticipant
-	 */
-	public void shareStrings(StringPool set) {
-		//copy elements for thread safety
-		Object[] array = elements;
-		if (array == null)
-			return;
-		for (int i = 0; i < array.length; i++) {
-			Object o = array[i];
-			if (o instanceof String)
-				array[i] = set.add((String) o);
-		}
-	}
-
-	/**
-	 * @see Map#size()
-	 */
-	public int size() {
-		return count;
-	}
-
-	/**
-	 * Creates a new hash map with the same contents as this map.
-	 */
-	private HashMap toHashMap() {
-		HashMap result = new HashMap(size());
-		for (int i = 0; i < elements.length; i = i + 2) {
-			if (elements[i] != null) {
-				result.put(elements[i], elements[i + 1]);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @see Map#values() 
-	 * 
-	 * Note: This implementation does not conform properly to the
-	 * specification in the Map interface. The returned collection will not
-	 * be bound to this map and will not remain in sync with this map.
-	 */
-	public Collection values() {
-		Set result = new HashSet(size());
-		for (int i = 1; i < elements.length; i = i + 2) {
-			if (elements[i] != null) {
-				result.add(elements[i]);
-			}
-		}
-		return result;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/OrderedLock.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/OrderedLock.java
deleted file mode 100644
index 4926ed5..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/OrderedLock.java
+++ /dev/null
@@ -1,297 +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
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-/**
- * A lock used to control write access to an exclusive resource.
- * 
- * The lock avoids circular waiting deadlocks by detecting the deadlocks
- * and resolving them through the suspension of all locks owned by one 
- * of the threads involved in the deadlock. This makes it impossible for n such 
- * locks to deadlock while waiting for each other.  The downside is that this means
- * that during an interval when a process owns a lock, it can be forced
- * to give the lock up and wait until all locks it requires become
- * available.  This removes the feature of exclusive access to the
- * resource in contention for the duration between acquire() and
- * release() calls.
- * 
- * The lock implementation prevents starvation by granting the
- * lock in the same order in which acquire() requests arrive. In
- * this scheme, starvation is only possible if a thread retains
- * a lock indefinitely.
- */
-public class OrderedLock implements ILock, ISchedulingRule {
-
-	private static final boolean DEBUG = false;
-	/**
-	 * Locks are sequentially ordered for debugging purposes.
-	 */
-	private static int nextLockNumber = 0;
-	/**
-	 * The thread of the operation that currently owns the lock.
-	 */
-	private volatile Thread currentOperationThread;
-	/**
-	 * Records the number of successive acquires in the same
-	 * thread. The lock is released only when the depth
-	 * reaches zero.
-	 */
-	private int depth;
-	/**
-	 * The manager that implements the deadlock detection and resolution protocol.
-	 */
-	private final LockManager manager;
-	private final int number;
-
-	/**
-	 * Queue of semaphores for threads currently waiting
-	 * on the lock. This queue is not thread-safe, so access
-	 * to this queue must be synchronized on the lock instance.
-	 */
-	private final Queue operations = new Queue();
-
-	/**
-	 * Creates a new workspace lock.
-	 */
-	OrderedLock(LockManager manager) {
-		this.manager = manager;
-		this.number = nextLockNumber++;
-	}
-
-	/* (non-Javadoc)
-	 * @see Locks.ILock#acquire()
-	 */
-	public void acquire() {
-		//spin until the lock is successfully acquired
-		//NOTE: spinning here allows the UI thread to service pending syncExecs
-		//if the UI thread is waiting to acquire a lock.
-		while (true) {
-			try {
-				if (acquire(Long.MAX_VALUE))
-					return;
-			} catch (InterruptedException e) {
-				//ignore and loop
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see Locks.ILock#acquire(long)
-	 */
-	public boolean acquire(long delay) throws InterruptedException {
-		if (Thread.interrupted())
-			throw new InterruptedException();
-
-		boolean success = false;
-		if (delay <= 0)
-			return attempt();
-		Semaphore semaphore = createSemaphore();
-		if (semaphore == null)
-			return true;
-		if (DEBUG)
-			System.out.println("[" + Thread.currentThread() + "] Operation waiting to be executed... " + this); //$NON-NLS-1$ //$NON-NLS-2$
-		success = doAcquire(semaphore, delay);
-		manager.resumeSuspendedLocks(Thread.currentThread());
-		if (DEBUG && success)
-			System.out.println("[" + Thread.currentThread() + "] Operation started... " + this); //$NON-NLS-1$ //$NON-NLS-2$
-		else if (DEBUG)
-			System.out.println("[" + Thread.currentThread() + "] Operation timed out... " + this); //$NON-NLS-1$ //$NON-NLS-2$	
-		return success;
-	}
-
-	/**
-	 * Attempts to acquire the lock.  Returns false if the lock is not available and
-	 * true if the lock has been successfully acquired.
-	 */
-	private synchronized boolean attempt() {
-		//return true if we already own the lock
-		//also, if nobody is waiting, grant the lock immediately
-		if ((currentOperationThread == Thread.currentThread()) || (currentOperationThread == null && operations.isEmpty())) {
-			depth++;
-			setCurrentOperationThread(Thread.currentThread());
-			return true;
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean contains(ISchedulingRule rule) {
-		return false;
-	}
-
-	/**
-	 * Returns null if acquired and a Semaphore object otherwise. If a
-	 * waiting semaphore already exists for this thread, it will be returned, 
-	 * otherwise a new semaphore will be created, enqueued, and returned.
-	 */
-	private synchronized Semaphore createSemaphore() {
-		return attempt() ? null : enqueue(new Semaphore(Thread.currentThread()));
-	}
-
-	/**
-	 * Attempts to acquire this lock.  Callers will block  until this lock comes available to 
-	 * them, or until the specified delay has elapsed.
-	 */
-	private boolean doAcquire(Semaphore semaphore, long delay) throws InterruptedException {
-		boolean success = false;
-		//notify hook to service pending syncExecs before falling asleep
-		if (manager.aboutToWait(this.currentOperationThread)) {
-			//hook granted immediate access
-			//remove semaphore for the lock request from the queue
-			//do not log in graph because this thread did not really get the lock
-			removeFromQueue(semaphore);
-			depth++;
-			manager.addLockThread(currentOperationThread, this);
-			return true;
-		}
-		//Make sure the semaphore is in the queue before we start waiting
-		//It might have been removed from the queue while servicing syncExecs
-		//This is will return our existing semaphore if it is still in the queue
-		semaphore = createSemaphore();
-		if (semaphore == null)
-			return true;
-		manager.addLockWaitThread(Thread.currentThread(), this);
-		try {
-			success = semaphore.acquire(delay);
-		} catch (InterruptedException e) {
-			if (DEBUG)
-				System.out.println("[" + Thread.currentThread() + "] Operation interrupted while waiting... :-|"); //$NON-NLS-1$ //$NON-NLS-2$
-			throw e;
-		}
-		if (success) {
-			depth++;
-			updateCurrentOperation();
-		} else {
-			removeFromQueue(semaphore);
-			manager.removeLockWaitThread(Thread.currentThread(), this);
-		}
-		return success;
-	}
-
-	/**
-	 * Releases this lock from the thread that used to own it.
-	 * Grants this lock to the next thread in the queue.  
-	 */
-	private synchronized void doRelease() {
-		//notify hook
-		manager.aboutToRelease();
-		depth = 0;
-		Semaphore next = (Semaphore) operations.peek();
-		setCurrentOperationThread(null);
-		if (next != null)
-			next.release();
-	}
-
-	/**
-	 * If there is another semaphore with the same runnable in the
-	 * queue, the other is returned and the new one is not added.
-	 */
-	private synchronized Semaphore enqueue(Semaphore newSemaphore) {
-		Semaphore semaphore = (Semaphore) operations.get(newSemaphore);
-		if (semaphore == null) {
-			operations.enqueue(newSemaphore);
-			return newSemaphore;
-		}
-		return semaphore;
-	}
-
-	/**
-	 * Suspend this lock by granting the lock to the next lock in the queue.
-	 * Return the depth of the suspended lock. 
-	 */
-	protected int forceRelease() {
-		int oldDepth = depth;
-		doRelease();
-		return oldDepth;
-	}
-
-	/* (non-Javadoc)
-	 * @see Locks.ILock#getDepth()
-	 */
-	public int getDepth() {
-		return depth;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean isConflicting(ISchedulingRule rule) {
-		return rule == this;
-	}
-
-	/* (non-Javadoc)
-	 * @see Locks.ILock#release()
-	 */
-	public void release() {
-		if (depth == 0)
-			return;
-		//only release the lock when the depth reaches zero
-		Assert.isTrue(depth >= 0, "Lock released too many times"); //$NON-NLS-1$
-		if (--depth == 0)
-			doRelease();
-		else
-			manager.removeLockThread(currentOperationThread, this);
-	}
-
-	/**
-	 * Removes a semaphore from the queue of waiting operations.
-	 * 
-	 * @param semaphore The semaphore to remove
-	 */
-	private synchronized void removeFromQueue(Semaphore semaphore) {
-		operations.remove(semaphore);
-	}
-
-	/**
-	 * If newThread is null, release this lock from its previous owner.
-	 * If newThread is not null, grant this lock to newThread.
-	 */
-	private void setCurrentOperationThread(Thread newThread) {
-		if ((currentOperationThread != null) && (newThread == null))
-			manager.removeLockThread(currentOperationThread, this);
-		this.currentOperationThread = newThread;
-		if (currentOperationThread != null)
-			manager.addLockThread(currentOperationThread, this);
-	}
-
-	/**
-	 * Forces the lock to be at the given depth.
-	 * Used when re-acquiring a suspended lock.
-	 */
-	protected void setDepth(int newDepth) {
-		for (int i = depth; i < newDepth; i++) {
-			manager.addLockThread(currentOperationThread, this);
-		}
-		this.depth = newDepth;
-	}
-
-	/**
-	 * For debugging purposes only.
-	 */
-	public String toString() {
-		return "OrderedLock (" + number + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This lock has just been granted to a new thread (the thread waited for it).
-	 * Remove the request from the queue and update both the graph and the lock.
-	 */
-	private synchronized void updateCurrentOperation() {
-		operations.dequeue();
-		setCurrentOperationThread(Thread.currentThread());
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Queue.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Queue.java
deleted file mode 100644
index 4262b44..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Queue.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import java.util.*;
-
-/**
- * A Queue of objects.
- */
-public class Queue {
-	protected Object[] elements;
-	protected int head;
-	protected boolean reuse;
-	protected int tail;
-
-	public Queue() {
-		this(20, false);
-	}
-
-	/**
-	 * The parameter reuse indicates what do you want to happen with
-	 * the object reference when you remove it from the queue. If
-	 * reuse is false the queue no longer holds a reference to the
-	 * object when it is removed. If reuse is true you can use the
-	 * method getNextAvailableObject to get an used object, set its
-	 * new values and add it again to the queue.
-	 */
-	public Queue(int size, boolean reuse) {
-		elements = new Object[size];
-		head = tail = 0;
-		this.reuse = reuse;
-	}
-
-	/**
-	 * Adds an object to the tail of the queue.
-	 */
-	public void enqueue(Object element) {
-		int newTail = increment(tail);
-		if (newTail == head) {
-			grow();
-			newTail = tail + 1;
-		}
-		elements[tail] = element;
-		tail = newTail;
-	}
-
-	/**
-	 * This method does not affect the queue itself. It is only a
-	 * helper to decrement an index in the queue.
-	 */
-	public int decrement(int index) {
-		return (index == 0) ? (elements.length - 1) : index - 1;
-	}
-
-	public Iterator elements() {
-		/**/
-		if (isEmpty())
-			return new ArrayList(0).iterator();
-
-		/* if head < tail we can use the same array */
-		if (head <= tail)
-			return Arrays.asList(elements).iterator();
-
-		/* otherwise we need to create a new array */
-		Object[] newElements = new Object[size()];
-		int end = (elements.length - head);
-		System.arraycopy(elements, head, newElements, 0, end);
-		System.arraycopy(elements, 0, newElements, end, tail);
-		return Arrays.asList(newElements).iterator();
-	}
-
-	public Object get(Object o) {
-		int index = head;
-		while (index != tail) {
-			if (elements[index].equals(o))
-				return elements[index];
-			index = increment(index);
-		}
-		return null;
-	}
-
-	/**
-	 * Removes the given object from the queue. Shifts the underlying array.
-	 */
-	public boolean remove(Object o) {
-		int index = head;
-		//find the object to remove
-		while (index != tail) {
-			if (elements[index].equals(o))
-				break;
-			index = increment(index);
-		}
-		//if element wasn't found, return
-		if (index == tail)
-			return false;
-		//store a reference to it (needed for reuse of objects)
-		Object toRemove = elements[index];
-		int nextIndex = -1;
-		while (index != tail) {
-			nextIndex = increment(index);
-			if (nextIndex != tail)
-				elements[index] = elements[nextIndex];
-
-			index = nextIndex;
-		}
-		//decrement tail
-		tail = decrement(tail);
-
-		//if objects are reused, transfer the reference that is removed to the end of the queue
-		//otherwise set the element after the last one to null (to avoid duplicate references)
-		elements[tail] = reuse ? toRemove : null;
-		return true;
-	}
-
-	protected void grow() {
-		int newSize = (int) (elements.length * 1.5);
-		Object[] newElements = new Object[newSize];
-		if (tail >= head)
-			System.arraycopy(elements, head, newElements, head, size());
-		else {
-			int newHead = newSize - (elements.length - head);
-			System.arraycopy(elements, 0, newElements, 0, tail + 1);
-			System.arraycopy(elements, head, newElements, newHead, (newSize - newHead));
-			head = newHead;
-		}
-		elements = newElements;
-	}
-
-	/**
-	 * This method does not affect the queue itself. It is only a
-	 * helper to increment an index in the queue.
-	 */
-	public int increment(int index) {
-		return (index == (elements.length - 1)) ? 0 : index + 1;
-	}
-
-	public boolean isEmpty() {
-		return tail == head;
-	}
-
-	public Object peek() {
-		return elements[head];
-	}
-
-	/**
-	 * Removes an returns the item at the head of the queue.
-	 */
-	public Object dequeue() {
-		if (isEmpty())
-			return null;
-		Object result = peek();
-		if (!reuse)
-			elements[head] = null;
-		head = increment(head);
-		return result;
-	}
-
-	public int size() {
-		return tail > head ? (tail - head) : ((elements.length - head) + tail);
-	}
-
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("["); //$NON-NLS-1$
-		if (!isEmpty()) {
-			Iterator it = elements();
-			while (true) {
-				sb.append(it.next());
-				if (it.hasNext())
-					sb.append(", "); //$NON-NLS-1$
-				else
-					break;
-			}
-		}
-		sb.append("]"); //$NON-NLS-1$
-		return sb.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Semaphore.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Semaphore.java
deleted file mode 100644
index ff43402..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Semaphore.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-public class Semaphore {
-	protected long notifications;
-	protected Runnable runnable;
-
-	public Semaphore(Runnable runnable) {
-		this.runnable = runnable;
-		notifications = 0;
-	}
-
-	/**
-	 * Attempts to acquire this semaphore.  Returns true if it was successfully acquired,
-	 * and false otherwise.
-	 */
-	public synchronized boolean acquire(long delay) throws InterruptedException {
-		if (Thread.interrupted())
-			throw new InterruptedException();
-		long start = System.currentTimeMillis();
-		long timeLeft = delay;
-		while (true) {
-			if (notifications > 0) {
-				notifications--;
-				return true;
-			}
-			if (timeLeft <= 0)
-				return false;
-			wait(timeLeft);
-			timeLeft = start + delay - System.currentTimeMillis();
-		}
-	}
-
-	public boolean equals(Object obj) {
-		return (runnable == ((Semaphore) obj).runnable);
-	}
-
-	public int hashCode() {
-		return runnable == null ? 0 : runnable.hashCode();
-	}
-
-	public synchronized void release() {
-		notifications++;
-		notifyAll();
-	}
-
-	// for debug only
-	public String toString() {
-		return "Semaphore(" + runnable + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/StringPool.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/StringPool.java
deleted file mode 100644
index 53a302a..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/StringPool.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import java.util.HashMap;
-
-/**
- * A string pool is used for sharing strings in a way that eliminates duplicate
- * equal strings.  A string pool instance can be maintained over a long period
- * of time, or used as a temporary structure during a string sharing pass over
- * a data structure.
- * <p>
- * This class is not intended to be subclassed by clients.
- * </p>
- * 
- * Note: This class is copied from org.eclipse.core.resources
- * 
- * @since 3.1
- */
-public final class StringPool {
-	private int savings;
-	private final HashMap map = new HashMap();
-
-	/**
-	 * Adds a <code>String</code> to the pool.  Returns a <code>String</code>
-	 * that is equal to the argument but that is unique within this pool.
-	 * @param string The string to add to the pool
-	 * @return A string that is equal to the argument.
-	 */
-	public String add(String string) {
-		if (string == null)
-			return string;
-		Object result = map.get(string);
-		if (result != null) {
-			if (result != string)
-				savings += 44 + 2 * string.length();
-			return (String) result;
-		}
-		map.put(string, string);
-		return string;
-	}
-
-	/**
-	 * Returns an estimate of the size in bytes that was saved by sharing strings in 
-	 * the pool.  In particular, this returns the size of all strings that were added to the
-	 * pool after an equal string had already been added.  This value can be used
-	 * to estimate the effectiveness of a string sharing operation, in order to 
-	 * determine if or when it should be performed again.
-	 * 
-	 * In some cases this does not precisely represent the number of bytes that 
-	 * were saved.  For example, say the pool already contains string S1.  Now 
-	 * string S2, which is equal to S1 but not identical, is added to the pool five 
-	 * times. This method will return the size of string S2 multiplied by the 
-	 * number of times it was added, even though the actual savings in this case
-	 * is only the size of a single copy of S2.
-	 */
-	public int getSavedStringCount() {
-		return savings;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/ThreadJob.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/ThreadJob.java
deleted file mode 100644
index b37c215..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/ThreadJob.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of 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.jobs;
-
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * Captures the implicit job state for a given thread. 
- */
-class ThreadJob extends Job {
-	private final JobManager manager;
-	/**
-	 * Set to true if this thread job is running in a thread that did
-	 * not own a rule already.  This means it needs to acquire the
-	 * rule during beginRule, and must release the rule during endRule.
-	 */
-	protected boolean acquireRule = false;
-
-	/**
-	 * Indicates that this thread job did report to the progress manager
-	 * that it will be blocked, and therefore when it begins it must
-	 * be reported to the job manager when it is no longer blocked.
-	 */
-	boolean isBlocked = false;
-
-	/**
-	 * True if this ThreadJob has begun execution
-	 */
-	protected boolean isRunning = false;
-
-	/**
-	 * Used for diagnosing mismatched begin/end pairs. This field
-	 * is only used when in debug mode, to capture the stack trace
-	 * of the last call to beginRule.
-	 */
-	private RuntimeException lastPush = null;
-	/**
-	 * The actual job that is running in the thread that this 
-	 * ThreadJob represents.  This will be null if this thread
-	 * job is capturing a rule acquired outside of a job.
-	 */
-	protected Job realJob;
-	/**
-	 * The stack of rules that have been begun in this thread, but not yet ended.
-	 */
-	private ISchedulingRule[] ruleStack;
-	/**
-	 * Rule stack pointer.
-	 */
-	private int top;
-
-	ThreadJob(JobManager manager, ISchedulingRule rule) {
-		super("Implicit Job"); //$NON-NLS-1$
-		this.manager = manager;
-		setSystem(true);
-		setPriority(Job.INTERACTIVE);
-		ruleStack = new ISchedulingRule[2];
-		top = -1;
-		setRule(rule);
-	}
-
-	/**
-	 * An endRule was called that did not match the last beginRule in
-	 * the stack.  Report and log a detailed informational message.
-	 * @param rule The rule that was popped
-	 */
-	private void illegalPop(ISchedulingRule rule) {
-		StringBuffer buf = new StringBuffer("Attempted to endRule: "); //$NON-NLS-1$
-		buf.append(rule);
-		if (top >= 0 && top < ruleStack.length) {
-			buf.append(", does not match most recent begin: "); //$NON-NLS-1$
-			buf.append(ruleStack[top]);
-		} else {
-			if (top < 0)
-				buf.append(", but there was no matching beginRule"); //$NON-NLS-1$
-			else
-				buf.append(", but the rule stack was out of bounds: " + top); //$NON-NLS-1$
-		}
-		buf.append(".  See log for trace information if rule tracing is enabled."); //$NON-NLS-1$
-		String msg = buf.toString();
-		if (JobManager.DEBUG || JobManager.DEBUG_BEGIN_END) {
-			System.out.println(msg);
-			Throwable t = lastPush == null ? new IllegalArgumentException() : lastPush;
-			IStatus error = new Status(IStatus.ERROR, JobManager.PI_JOBS, 1, msg, t);
-			RuntimeLog.log(error);
-		}
-		Assert.isLegal(false, msg);
-	}
-
-	/**
-	 * Client has attempted to begin a rule that is not contained within
-	 * the outer rule.
-	 */
-	private void illegalPush(ISchedulingRule pushRule, ISchedulingRule baseRule) {
-		StringBuffer buf = new StringBuffer("Attempted to beginRule: "); //$NON-NLS-1$
-		buf.append(pushRule);
-		buf.append(", does not match outer scope rule: "); //$NON-NLS-1$
-		buf.append(baseRule);
-		String msg = buf.toString();
-		if (JobManager.DEBUG) {
-			System.out.println(msg);
-			IStatus error = new Status(IStatus.ERROR, JobManager.PI_JOBS, 1, msg, new IllegalArgumentException());
-			RuntimeLog.log(error);
-		}
-		Assert.isLegal(false, msg);
-
-	}
-
-	/**
-	 * Returns true if the monitor is canceled, and false otherwise.
-	 * Protects the caller from exception in the monitor implementation.
-	 */
-	private boolean isCanceled(IProgressMonitor monitor) {
-		try {
-			return monitor.isCanceled();
-		} catch (RuntimeException e) {
-			//logged message should not be translated
-			IStatus status = new Status(IStatus.ERROR, JobManager.PI_JOBS, JobManager.PLUGIN_ERROR, "ThreadJob.isCanceled", e); //$NON-NLS-1$
-			RuntimeLog.log(status);
-		}
-		return false;
-	}
-
-	/**
-	 * Returns true if this thread job was scheduled and actually started running.
-	 */
-	synchronized boolean isRunning() {
-		return isRunning;
-	}
-	
-	/**
-	 * Schedule the job and block the calling thread until the job starts running.
-	 * Returns the ThreadJob instance that was started.
-	 */
-	ThreadJob joinRun(IProgressMonitor monitor) {
-		if (isCanceled(monitor))
-			throw new OperationCanceledException();
-		//check if there is a blocking thread before waiting
-		InternalJob blockingJob = manager.findBlockingJob(this);
-		Thread blocker = blockingJob == null ? null : blockingJob.getThread();
-		ThreadJob result = this;
-		//lock listener decided to grant immediate access
-		try {
-			if (manager.getLockManager().aboutToWait(blocker))
-				return this;
-			try {
-				waitStart(monitor, blockingJob);
-				final Thread currentThread = Thread.currentThread();
-				while (true) {
-					if (isCanceled(monitor))
-						throw new OperationCanceledException();
-					//try to run the job 
-					if (manager.runNow(this))
-						return this;
-					//update blocking job
-					blockingJob = manager.findBlockingJob(this);
-					//the rule could have been transferred to this thread while we were waiting
-					blocker = blockingJob == null ? null : blockingJob.getThread();
-					if (blocker == currentThread && blockingJob instanceof ThreadJob) {
-						//now we are just the nested acquire case
-						result = (ThreadJob)blockingJob;
-						result.push(getRule());
-						result.isBlocked = this.isBlocked;
-						return result;
-					}
-					if (manager.getLockManager().aboutToWait(blocker))
-						return this;
-					//must lock instance before calling wait
-					synchronized (this) {
-						try {
-							wait(250);
-						} catch (InterruptedException e) {
-							//ignore
-						}
-					}
-				}
-			} finally {
-				if (this == result)
-					waitEnd(monitor);
-			}
-		} finally {
-			manager.getLockManager().aboutToRelease();
-		}
-	}
-
-	/**
-	 * Pops a rule. Returns true if it was the last rule for this thread
-	 * job, and false otherwise.
-	 */
-	boolean pop(ISchedulingRule rule) {
-		if (top < 0 || ruleStack[top] != rule)
-			illegalPop(rule);
-		ruleStack[top--] = null;
-		return top < 0;
-	}
-
-	/**
-	 * Adds a new scheduling rule to the stack of rules for this thread. Throws
-	 * a runtime exception if the new rule is not compatible with the base
-	 * scheduling rule for this thread.
-	 */
-	void push(final ISchedulingRule rule) {
-		final ISchedulingRule baseRule = getRule();
-		if (++top >= ruleStack.length) {
-			ISchedulingRule[] newStack = new ISchedulingRule[ruleStack.length * 2];
-			System.arraycopy(ruleStack, 0, newStack, 0, ruleStack.length);
-			ruleStack = newStack;
-		}
-		ruleStack[top] = rule;
-		if (JobManager.DEBUG_BEGIN_END)
-			lastPush = (RuntimeException) new RuntimeException().fillInStackTrace();
-		//check for containment last because we don't want to fail again on endRule
-		if (baseRule != null && rule != null && !baseRule.contains(rule))
-			illegalPush(rule, baseRule);
-	}
-
-	/**
-	 * Reset all of this job's fields so it can be reused.  Returns false if
-	 * reuse is not possible
-	 */
-	boolean recycle() {
-		//don't recycle if still running for any reason
-		if (getState() != Job.NONE)
-			return false;
-		//clear and reset all fields
-		acquireRule = isRunning = isBlocked = false;
-		realJob = null;
-		setRule(null);
-		setThread(null);
-		if (ruleStack.length != 2)
-			ruleStack = new ISchedulingRule[2];
-		else
-			ruleStack[0] = ruleStack[1] = null;
-		top = -1;
-		return true;
-	}
-
-	/** (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus run(IProgressMonitor monitor) {
-		synchronized (this) {
-			isRunning = true;
-			notify();
-		}
-		return ASYNC_FINISH;
-	}
-
-	/**
-	 * Records the job that is actually running in this thread, if any
-	 * @param realJob The running job
-	 */
-	void setRealJob(Job realJob) {
-		this.realJob = realJob;
-	}
-
-	/**
-	 * Returns true if this job should cause a self-canceling job
-	 * to cancel itself, and false otherwise.
-	 */
-	boolean shouldInterrupt() {
-		return realJob == null ? true : !realJob.isSystem();
-	}
-
-	/* (non-javadoc)
-	 * For debugging purposes only
-	 */
-	public String toString() {
-		StringBuffer buf = new StringBuffer("ThreadJob"); //$NON-NLS-1$
-		buf.append('(').append(realJob).append(',').append('[');
-		for (int i = 0; i <= top && i < ruleStack.length; i++)
-			buf.append(ruleStack[i]).append(',');
-		buf.append(']').append(')');
-		return buf.toString();
-	}
-
-	/**
-	 * Reports that this thread was blocked, but is no longer blocked and is able
-	 * to proceed.
-	 * @param monitor The monitor to report unblocking to.
-	 */
-	private void waitEnd(IProgressMonitor monitor) {
-		final LockManager lockManager = manager.getLockManager();
-		final Thread currentThread = Thread.currentThread();
-		if (isRunning()) {
-			lockManager.addLockThread(currentThread, getRule());
-			//need to re-aquire any locks that were suspended while this thread was blocked on the rule
-			lockManager.resumeSuspendedLocks(currentThread);
-		} else {
-			//tell lock manager that this thread gave up waiting
-			lockManager.removeLockWaitThread(currentThread, getRule());
-		}
-	}
-
-	/**
-	 * Indicates the start of a wait on a scheduling rule. Report the
-	 * blockage to the progress manager and update the lock manager.
-	 * @param monitor The monitor to report blocking to
-	 * @param blockingJob The job that is blocking this thread, or <code>null</code>
-	 */
-	private void waitStart(IProgressMonitor monitor, InternalJob blockingJob) {
-		manager.getLockManager().addLockWaitThread(Thread.currentThread(), getRule());
-		isBlocked = true;
-		manager.reportBlocked(monitor, blockingJob);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Worker.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Worker.java
deleted file mode 100644
index 1a2bda3..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/Worker.java
+++ /dev/null
@@ -1,87 +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.core.internal.jobs;
-
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * A worker thread processes jobs supplied to it by the worker pool.  When
- * the worker pool gives it a null job, the worker dies.
- */
-public class Worker extends Thread {
-	//worker number used for debugging purposes only
-	private static int nextWorkerNumber = 0;
-	private volatile InternalJob currentJob;
-	private final WorkerPool pool;
-
-	public Worker(WorkerPool pool) {
-		super("Worker-" + nextWorkerNumber++); //$NON-NLS-1$
-		this.pool = pool;
-		//set the context loader to avoid leaking the current context loader
-		//for the thread that spawns this worker (bug 98376)
-		setContextClassLoader(pool.defaultContextLoader);
-	}
-
-	/**
-	 * Returns the currently running job, or null if none.
-	 */
-	public Job currentJob() {
-		return (Job) currentJob;
-	}
-
-	private IStatus handleException(InternalJob job, Throwable t) {
-		String message = NLS.bind(JobMessages.jobs_internalError, job.getName());
-		return new Status(IStatus.ERROR, JobManager.PI_JOBS, JobManager.PLUGIN_ERROR, message, t);
-	}
-
-	public void run() {
-		setPriority(Thread.NORM_PRIORITY);
-		try {
-			while ((currentJob = pool.startJob(this)) != null) {
-				//if job is null we've been shutdown
-				if (currentJob == null)
-					return;
-				currentJob.setThread(this);
-				IStatus result = Status.OK_STATUS;
-				try {
-					result = currentJob.run(currentJob.getProgressMonitor());
-				} catch (OperationCanceledException e) {
-					result = Status.CANCEL_STATUS;
-				} catch (Exception e) {
-					result = handleException(currentJob, e);
-				} catch (ThreadDeath e) {
-					//must not consume thread death
-					throw e;
-				} catch (Error e) {
-					result = handleException(currentJob, e);
-				} finally {
-					//clear interrupted state for this thread
-					Thread.interrupted();
-					//result must not be null
-					if (result == null)
-						result = handleException(currentJob, new NullPointerException());
-					pool.endJob(currentJob, result);
-					if ((result.getSeverity() & (IStatus.ERROR | IStatus.WARNING)) != 0)
-						RuntimeLog.log(result);
-					currentJob = null;
-				}
-			}
-		} catch (Throwable t) {
-			t.printStackTrace();
-		} finally {
-			currentJob = null;
-			pool.endWorker(this);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/WorkerPool.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/WorkerPool.java
deleted file mode 100644
index b1c2783..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/WorkerPool.java
+++ /dev/null
@@ -1,235 +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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.jobs;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * Maintains a pool of worker threads. Threads are constructed lazily as
- * required, and are eventually discarded if not in use for awhile. This class
- * maintains the thread creation/destruction policies for the job manager.
- * 
- * Implementation note: all the data structures of this class are protected
- * by the instance's object monitor.  To avoid deadlock with third party code,
- * this lock is never held when calling methods outside this class that may in
- * turn use locks.
- */
-class WorkerPool {
-	/**
-	 * Threads not used by their best before timestamp are destroyed. 
-	 */
-	private static final int BEST_BEFORE = 60000;
-	/**
-	 * There will always be at least MIN_THREADS workers in the pool.
-	 */
-	private static final int MIN_THREADS = 1;
-	/**
-	 * Use the busy thread count to avoid starting new threads when a living
-	 * thread is just doing house cleaning (notifying listeners, etc).
-	 */
-	private int busyThreads = 0;
-
-	/**
-	 * The default context class loader to use when creating worker threads.
-	 */
-	protected final ClassLoader defaultContextLoader;
-
-	private JobManager manager;
-	/**
-	 * The number of workers in the threads array
-	 */
-	private int numThreads = 0;
-	/**
-	 * The number of threads that are currently sleeping 
-	 */
-	private int sleepingThreads = 0;
-	/**
-	 * The living set of workers in this pool.
-	 */
-	private Worker[] threads = new Worker[10];
-
-	protected WorkerPool(JobManager manager) {
-		this.manager = manager;
-		this.defaultContextLoader = Thread.currentThread().getContextClassLoader();
-	}
-
-	/**
-	 * Adds a worker to the list of workers.
-	 */
-	private synchronized void add(Worker worker) {
-		int size = threads.length;
-		if (numThreads + 1 > size) {
-			Worker[] newThreads = new Worker[2 * size];
-			System.arraycopy(threads, 0, newThreads, 0, size);
-			threads = newThreads;
-		}
-		threads[numThreads++] = worker;
-	}
-
-	private synchronized void decrementBusyThreads() {
-		//impossible to have less than zero busy threads
-		if (--busyThreads < 0) {
-			if (JobManager.DEBUG)
-				Assert.isTrue(false, Integer.toString(busyThreads));
-			busyThreads = 0;
-		}
-	}
-
-	/**
-	 * Signals the end of a job.  Note that this method can be called under
-	 * OutOfMemoryError conditions and thus must be paranoid about allocating objects.
-	 */
-	protected void endJob(InternalJob job, IStatus result) {
-		decrementBusyThreads();
-		//need to end rule in graph before ending job so that 2 threads
-		//do not become the owners of the same rule in the graph
-		if ((job.getRule() != null) && !(job instanceof ThreadJob)) {
-			//remove any locks this thread may be owning on that rule
-			manager.getLockManager().removeLockCompletely(Thread.currentThread(), job.getRule());
-		}
-		manager.endJob(job, result, true);
-		//ensure this thread no longer owns any scheduling rules
-		manager.implicitJobs.endJob(job);
-	}
-
-	/**
-	 * Signals the death of a worker thread.  Note that this method can be called under
-	 * OutOfMemoryError conditions and thus must be paranoid about allocating objects.
-	 */
-	protected synchronized void endWorker(Worker worker) {
-		if (remove(worker) && JobManager.DEBUG)
-			JobManager.debug("worker removed from pool: " + worker); //$NON-NLS-1$
-	}
-
-	private synchronized void incrementBusyThreads() {
-		//impossible to have more busy threads than there are threads
-		if (++busyThreads > numThreads) {
-			if (JobManager.DEBUG)
-				Assert.isTrue(false, Integer.toString(busyThreads) + ',' + numThreads);
-			busyThreads = numThreads;
-		}
-	}
-
-	/**
-	 * Notification that a job has been added to the queue. Wake a worker,
-	 * creating a new worker if necessary. The provided job may be null.
-	 */
-	protected synchronized void jobQueued(InternalJob job) {
-		//if there is a sleeping thread, wake it up
-		if (sleepingThreads > 0) {
-			notify();
-			return;
-		}
-		//create a thread if all threads are busy and we're under the max size
-		//if the job is high priority, we start a thread no matter what
-		if (busyThreads >= numThreads) {
-			Worker worker = new Worker(this);
-			add(worker);
-			if (JobManager.DEBUG)
-				JobManager.debug("worker added to pool: " + worker); //$NON-NLS-1$
-			worker.start();
-			return;
-		}
-	}
-
-	/**
-	 * Remove a worker thread from our list.
-	 * @return true if a worker was removed, and false otherwise.
-	 */
-	private synchronized boolean remove(Worker worker) {
-		for (int i = 0; i < threads.length; i++) {
-			if (threads[i] == worker) {
-				System.arraycopy(threads, i + 1, threads, i, numThreads - i - 1);
-				threads[--numThreads] = null;
-				return true;
-			}
-		}
-		return false;
-	}
-
-	protected synchronized void shutdown() {
-		notifyAll();
-	}
-
-	/**
-	 * Sleep for the given duration or until woken. 
-	 */
-	private synchronized void sleep(long duration) {
-		sleepingThreads++;
-		busyThreads--;
-		if (JobManager.DEBUG)
-			JobManager.debug("worker sleeping for: " + duration + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
-		try {
-			wait(duration);
-		} catch (InterruptedException e) {
-			if (JobManager.DEBUG)
-				JobManager.debug("worker interrupted while waiting... :-|"); //$NON-NLS-1$
-		} finally {
-			sleepingThreads--;
-			busyThreads++;
-		}
-	}
-
-	/**
-	 * Returns a new job to run. Returns null if the thread should die. 
-	 */
-	protected InternalJob startJob(Worker worker) {
-		//if we're above capacity, kill the thread
-		synchronized (this) {
-			if (!manager.isActive()) {
-				//must remove the worker immediately to prevent all threads from expiring
-				endWorker(worker);
-				return null;
-			}
-			//set the thread to be busy now in case of reentrant scheduling
-			incrementBusyThreads();
-		}
-		Job job = null;
-		try {
-			job = manager.startJob();
-			//spin until a job is found or until we have been idle for too long
-			long idleStart = System.currentTimeMillis();
-			while (manager.isActive() && job == null) {
-				long hint = manager.sleepHint();
-				if (hint > 0)
-					sleep(Math.min(hint, BEST_BEFORE));
-				job = manager.startJob();
-				//if we were already idle, and there are still no new jobs, then
-				// the thread can expire
-				synchronized (this) {
-					if (job == null && (System.currentTimeMillis() - idleStart > BEST_BEFORE) && (numThreads - busyThreads) > MIN_THREADS) {
-						//must remove the worker immediately to prevent all threads from expiring
-						endWorker(worker);
-						return null;
-					}
-				}
-			}
-			if (job != null) {
-				//if this job has a rule, then we are essentially acquiring a lock
-				if ((job.getRule() != null) && !(job instanceof ThreadJob)) {
-					//don't need to re-aquire locks because it was not recorded in the graph
-					//that this thread waited to get this rule
-					manager.getLockManager().addLockThread(Thread.currentThread(), job.getRule());
-				}
-				//see if we need to wake another worker
-				if (manager.sleepHint() <= 0)
-					jobQueued(null);
-			}
-		} finally {
-			//decrement busy thread count if we're not running a job
-			if (job == null)
-				decrementBusyThreads();
-		}
-		return job;
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/messages.properties b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/messages.properties
deleted file mode 100644
index 9bea82e..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/internal/jobs/messages.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
-###############################################################################
-### Runtime jobs plugin messages
-
-### Job Manager and Locks
-jobs_blocked0=The user operation is waiting for background work to complete.
-jobs_blocked1=The user operation is waiting for \"{0}\" to complete.
-jobs_internalError=An internal error occurred during: \"{0}\".
-jobs_waitFamSub={0} work item(s) left.
-
-### metadata
-meta_pluginProblems = Problems occurred when invoking code from plug-in: \"{0}\".
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobChangeEvent.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobChangeEvent.java
deleted file mode 100644
index e4bd4d0..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobChangeEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.jobs;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * An event describing a change to the state of a job.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @see IJobChangeListener
- * @since 3.0
- */
-public interface IJobChangeEvent {
-	/**
-	 * The amount of time in milliseconds to wait after scheduling the job before it 
-	 * should be run, or <code>-1</code> if not applicable for this type of event.  
-	 * This value is only applicable for the <code>scheduled</code> event.
-	 * 
-	 * @return the delay time for this event
-	 */
-	public long getDelay();
-
-	/**
-	 * The job on which this event occurred.
-	 * 
-	 * @return the job for this event
-	 */
-	public Job getJob();
-
-	/**
-	 * The result returned by the job's run method, or <code>null</code> if
-	 * not applicable.  This value is only applicable for the <code>done</code> event.
-	 * 
-	 * @return the status for this event
-	 */
-	public IStatus getResult();
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobChangeListener.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobChangeListener.java
deleted file mode 100644
index e642581..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobChangeListener.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.jobs;
-
-/**
- * Callback interface for clients interested in being notified when jobs change state.
- * <p>
- * A single job listener instance can be added either to the job manager, for notification
- * of all scheduled jobs, or to any set of individual jobs.  A single listener instance should
- * not be added to both the job manager, and to individual jobs (such a listener may
- * receive duplicate notifications).
- * </p><p>
- * Clients should not rely on the result of the <code>Job#getState()</code> 
- * method on jobs for which notification is occurring. Listeners are notified of 
- * all job state changes, but whether the state change occurs before, during, or 
- * after listeners are notified is unspecified.
- * </p><p>
- * Clients may implement this interface.
- * </p>
- * @see JobChangeAdapter
- * @see IJobManager#addJobChangeListener(IJobChangeListener)
- * @see IJobManager#removeJobChangeListener(IJobChangeListener)
- * @see Job#addJobChangeListener(IJobChangeListener)
- * @see Job#getState()
- * @see Job#removeJobChangeListener(IJobChangeListener)
- * @since 3.0
- */
-public interface IJobChangeListener {
-	/**
-	 * Notification that a job is about to be run. Listeners are allowed to sleep, cancel, 
-	 * or change the priority of the job before it is started (and as a result may prevent
-	 * the run from actually occurring).
-	 * 
-	 * @param event the event details
-	 */
-	public void aboutToRun(IJobChangeEvent event);
-
-	/**
-	 * Notification that a job was previously sleeping and has now been rescheduled
-	 * to run.
-	 * 
-	 * @param event the event details
-	 */
-	public void awake(IJobChangeEvent event);
-
-	/**
-	 * Notification that a job has completed execution, either due to cancelation, successful
-	 * completion, or failure.  The event status object indicates how the job finished,
-	 * and the reason for failure, if applicable.
-	 * 
-	 * @param event the event details
-	 */
-	public void done(IJobChangeEvent event);
-
-	/**
-	 * Notification that a job has started running.
-	 * 
-	 * @param event the event details
-	 */
-	public void running(IJobChangeEvent event);
-
-	/**
-	 * Notification that a job is being added to the queue of scheduled jobs.  
-	 * The event details includes the scheduling delay before the job should start 
-	 * running.
-	 * 
-	 * @param event the event details, including the job instance and the scheduling
-	 * delay
-	 */
-	public void scheduled(IJobChangeEvent event);
-
-	/**
-	 * Notification that a job was waiting to run and has now been put in the
-	 * sleeping state.
-	 * 
-	 * @param event the event details
-	 */
-	public void sleeping(IJobChangeEvent event);
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobManager.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobManager.java
deleted file mode 100644
index fcc35bb..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobManager.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.jobs;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-
-/**
- * The job manager provides facilities for scheduling, querying, and maintaining jobs
- * and locks.  In particular, the job manager provides the following services:
- * <ul>
- * <li>Maintains a queue of jobs that are waiting to be run.  Items can be added to
- * the queue using the <code>schedule</code> method.</li>
- * <li>Allows manipulation of groups of jobs called job families.  Job families can
- * be canceled, put to sleep, or woken up atomically.  There is also a mechanism
- * for querying the set of known jobs in a given family.</li>
- * <li>Allows listeners to find out about progress on running jobs, and to find out
- * when jobs have changed states.</li>
- * <li>Provides a factory for creating lock objects.  Lock objects are smart monitors
- * that have strategies for avoiding deadlock.</li>
- * <li>Provide feedback to a client that is waiting for a given job or family of jobs
- * to complete.</li>
- * </ul>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see Job
- * @see ILock
- * @since 3.0
- */
-public interface IJobManager {
-	/**
-	 * Registers a job listener with the job manager.  
-	 * Has no effect if an identical listener is already registered.
-	 * 
-	 * @param listener the listener to be added
-	 * @see #removeJobChangeListener(IJobChangeListener)
-	 * @see IJobChangeListener
-	 */
-	public void addJobChangeListener(IJobChangeListener listener);
-
-	/**
-	 * Begins applying this rule in the calling thread.  If the rule conflicts with another
-	 * rule currently running in another thread, this method blocks until there are
-	 * no conflicting rules.  Calls to <tt>beginRule</tt> must eventually be followed
-	 * by a matching call to <tt>endRule</tt> in the same thread and with the identical
-	 * rule instance. 
-	 * <p>
-	 * Rules can be nested only if the rule for the inner <tt>beginRule</tt>
-	 * is contained within the rule for the outer <tt>beginRule</tt>.  Rule containment
-	 * is tested with the API method <tt>ISchedulingRule.contains</tt>.  Also, begin/end
-	 * pairs must be strictly nested.  Only the rule that has most recently begun
-	 * can be ended at any given time.
-	 * <p>
-	 * A rule of <code>null</code> can be used, but will be ignored for scheduling 
-	 * purposes.  The outermost non-null rule in the thread will be used for scheduling. A
-	 * <code>null</code> rule that is begun must still be ended.
-	 * <p>
-	 * If this method is called from within a job that has a scheduling rule, the
-	 * given rule must also be contained within the rule for the running job.
-	 * <p>
-	 * Note that <tt>endRule</tt> must be called even if <tt>beginRule</tt> fails.
-	 * The recommended usage is:
-	 * <pre>
-	 * final ISchedulingRule rule = ...;
-	 * try {
-	 * 	manager.beginRule(rule, monitor);
-	 * } finally {
-	 * 	manager.endRule(rule);
-	 * }
-	 * </pre>
-	 * 
-	 * @param rule the rule to begin applying in this thread, or <code>null</code>
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 *    reporting and cancellation are not desired
-	 * @throws IllegalArgumentException if the rule is not strictly nested within
-	 * 	all other rules currently active for this thread
-	 * @throws OperationCanceledException if the supplied monitor reports cancelation
-	 * 	before the rule becomes available
-	 * @see ISchedulingRule#contains(ISchedulingRule)
-	 */
-	public void beginRule(ISchedulingRule rule, IProgressMonitor monitor);
-
-	/**
-	 * Cancels all jobs in the given job family.  Jobs in the family that are currently waiting
-	 * will be removed from the queue.  Sleeping jobs will be discarded without having 
-	 * a chance to wake up.  Currently executing jobs will be asked to cancel but there 
-	 * is no guarantee that they will do so.
-	 * 
-	 * @param family the job family to cancel, or <code>null</code> to cancel all jobs
-	 * @see Job#belongsTo(Object)
-	 */
-	public void cancel(Object family);
-
-	/**
-	 * Returns a progress monitor that can be used to provide
-	 * aggregated progress feedback on a set of running jobs. A user
-	 * interface will typically group all jobs in a progress group together,
-	 * providing progress feedback for individual jobs as well as aggregated
-	 * progress for the entire group.  Jobs in the group may be run sequentially,
-	 * in parallel, or some combination of the two.
-	 * <p>
-	 * Recommended usage (this snippet runs two jobs in sequence in a 
-	 * single progress group):
-	 * <pre>
-	 *    Job parseJob, compileJob;
-	 *    IProgressMonitor pm = Platform.getJobManager().createProgressGroup();
-	 *    try {
-	 *       pm.beginTask("Building", 10);
-	 *       parseJob.setProgressGroup(pm, 5);
-	 *       parseJob.schedule();
-	 *       compileJob.setProgressGroup(pm, 5);
-	 *       compileJob.schedule();
-	 *       parseJob.join();
-	 *       compileJob.join();
-	 *    } finally {
-	 *       pm.done();
-	 *    }
-	 * </pre>
-	 * 
-	 * @see Job#setProgressGroup(IProgressMonitor, int)
-	 * @see IProgressMonitor
-	 * @return a progress monitor
-	 */
-	public IProgressMonitor createProgressGroup();
-
-	/**
-	 * Returns the job that is currently running in this thread, or <code>null</code> if there
-	 * is no currently running job.
-	 * 
-	 * @return the job or <code>null</code>
-	 */
-	public Job currentJob();
-
-	/**
-	 * Ends the application of a rule to the calling thread.  Calls to <tt>endRule</tt> 
-	 * must be preceded by a matching call to <tt>beginRule</tt> in the same thread
-	 * with an identical rule instance.
-	 * <p>
-	 * Rules can be nested only if the rule for the inner <tt>beginRule</tt>
-	 * is contained within the rule for the outer <tt>beginRule</tt>.  Also, begin/end
-	 * pairs must be strictly nested.  Only the rule that has most recently begun
-	 * can be ended at any given time.
-	 * 
-	 * @param rule the rule to end applying in this thread
-	 * @throws IllegalArgumentException if this method is called on a rule for which
-	 * there is no matching begin, or that does not match the most recent begin.
-	 * @see ISchedulingRule#contains(ISchedulingRule)
-	 */
-	public void endRule(ISchedulingRule rule);
-
-	/**
-	 * Returns all waiting, executing and sleeping jobs belonging
-	 * to the given family. If no jobs are found, an empty array is returned.
-	 * 
-	 * @param family the job family to find, or <code>null</code> to find all jobs
-	 * @return the job array
-	 * @see Job#belongsTo(Object)
-	 */
-	public Job[] find(Object family);
-
-	/**
-	 * Returns whether the job manager is currently idle.  The job manager is
-	 * idle if no jobs are currently running or waiting to run.
-	 * 
-	 * @return <code>true</code> if the job manager is idle, and 
-	 * <code>false</code> otherwise
-	 * @since 3.1
-	 */
-	public boolean isIdle();
-
-	/**
-	 * Waits until all jobs of the given family are finished.  This method will block the 
-	 * calling thread until all such jobs have finished executing, or until this thread is
-	 * interrupted.   If there are no jobs in 
-	 * the family that are currently waiting, running, or sleeping, this method returns 
-	 * immediately.  Feedback on how the join is progressing is provided to a  progress 
-	 * monitor.
-	 * <p>
-	 * If this method is called while the job manager is suspended, only jobs
-	 * that are currently running will be joined; Once there are no jobs
-	 * in the family in the {@link Job#RUNNING} state, this method returns.
-	 * </p>
-	 * <p>
-	 * Note that there is a deadlock risk when using join.  If the calling thread owns
-	 * a lock or object monitor that the joined thread is waiting for, deadlock 
-	 * will occur. This method can also result in starvation of the current thread if
-	 * another thread continues to add jobs of the given family, or if a
-	 * job in the given family reschedules itself in an infinite loop.
-	 * </p>
-	 * 
-	 * @param family the job family to join, or <code>null</code> to join all jobs.
-	 * @param monitor Progress monitor for reporting progress on how the
-	 * wait is progressing, or <code>null</code> if no progress monitoring is required.
-	 * @exception InterruptedException if this thread is interrupted while waiting
-	 * @exception OperationCanceledException if the progress monitor is canceled while waiting
-	 * @see Job#belongsTo(Object)
-	 * @see #suspend()
-	 */
-	public void join(Object family, IProgressMonitor monitor) throws InterruptedException, OperationCanceledException;
-
-	/**
-	 * Creates a new lock object.  All lock objects supplied by the job manager
-	 * know about each other and will always avoid circular deadlock amongst
-	 * themselves.
-	 * 
-	 * @return the new lock object
-	 */
-	public ILock newLock();
-
-	/**
-	 * Removes a job listener from the job manager.  
-	 * Has no effect if an identical listener is not already registered.
-	 * 
-	 * @param listener the listener to be removed
-	 * @see #addJobChangeListener(IJobChangeListener)
-	 * @see IJobChangeListener
-	 */
-	public void removeJobChangeListener(IJobChangeListener listener);
-
-	/**
-	 * Resumes execution of jobs after a previous <code>suspend</code>.  All
-	 * jobs that were sleeping or waiting prior to the suspension, or that were
-	 * scheduled while the job manager was suspended, will now be eligible
-	 * for execution.
-	 * <p>
-	 * Calling this method on a rule that is not suspended  has no effect.  If another 
-	 * thread also owns the rule at the time this method is called, then the rule will 
-	 * not be resumed until all threads have released the rule.
-	 * 
-	 * @deprecated This method is not safe and should not be used.
-	 * Suspending a scheduling rule violates the thread safety
-	 * of clients that use scheduling rules as a mutual exclusion mechanism,
-	 * and can result in concurrency problems in all clients that use the suspended rule.
-	 * @see #suspend(ISchedulingRule, IProgressMonitor)
-	 */
-	public void resume(ISchedulingRule rule);
-
-	/**
-	 * Resumes execution of jobs after a previous <code>suspend</code>.  All
-	 * jobs that were sleeping or waiting prior to the suspension, or that were
-	 * scheduled while the job manager was suspended, will now be eligible
-	 * for execution.
-	 * <p>
-	 * Calling <code>resume</code> when the job manager is not suspended
-	 * has no effect.
-	 * 
-	 * @see #suspend()
-	 */
-	public void resume();
-
-	/**
-	 * Provides a hook that is notified whenever a thread is about to wait on a lock,
-	 * or when a thread is about to release a lock.  This hook must only be set once.
-	 * <p>
-	 * This method is for internal use by the platform-related plug-ins.  
-	 * Clients should not call this method.
-	 * </p>
-	 * @see LockListener
-	 */
-	public void setLockListener(LockListener listener);
-
-	/**
-	 * Registers a progress provider with the job manager.  If there was a
-	 * provider already registered, it is replaced.
-	 * <p>
-	 * This method is for internal use by the platform-related plug-ins.  
-	 * Clients should not call this method.
-	 * </p>
-	 * 
-	 * @param provider the new provider, or <code>null</code> if no progress
-	 * is needed
-	 */
-	public void setProgressProvider(ProgressProvider provider);
-
-	/**
-	 * Suspends execution of all jobs.  Jobs that are already running
-	 * when this method is invoked will complete as usual, but all sleeping and
-	 * waiting jobs will not be executed until the job manager is resumed.
-	 * <p>
-	 * The job manager will remain suspended until a subsequent call to
-	 * <code>resume</code>.  Further calls to <code>suspend</code>
-	 * when the job manager is already suspended are ignored.
-	 * <p>
-	 * All attempts to join sleeping and waiting jobs while the job manager is
-	 * suspended will return immediately.
-	 * <p>
-	 * Note that this very powerful function should be used with extreme caution.
-	 * Suspending the job manager will prevent all jobs in the system from executing,
-	 * which may have adverse affects on components that are relying on
-	 * execution of jobs. The job manager should never be suspended without intent
-	 * to resume execution soon afterwards.
-	 * 
-	 * @see #resume()
-	 * @see #join(Object, IProgressMonitor)
-	 */
-	public void suspend();
-
-	/**
-	 * Defers execution of all jobs with scheduling rules that conflict with the
-	 * given rule. The caller will be blocked until all currently executing jobs with
-	 * conflicting rules are completed.  Conflicting jobs that are sleeping or waiting at
-	 * the time this method is called will not be executed until the rule is resumed.
-	 * <p>
-	 * While a rule is suspended, all calls to <code>beginRule</code> and 
-	 * <code>endRule</code> on a suspended rule will not block the caller.
-	 * The rule remains suspended until a subsequent call to
-	 * <code>resume(ISchedulingRule)</code> with the identical rule instance.  
-	 * Further calls to <code>suspend</code> with an identical rule prior to calling
-	 * <code>resume</code> are ignored.
-	 * </p>
-	 * <p>
-	 * This method is long-running; progress and cancelation are provided by
-	 * the given progress monitor. In the case of cancelation, the rule will
-	 * not be suspended.
-	 * </p>
-	 * Note: this very powerful function should be used with extreme caution.
-	 * Suspending rules will prevent jobs in the system from executing, which may 
-	 * have adverse effects on components that are relying on execution of jobs. 
-	 * The job manager should never be suspended without intent to resume 
-	 * execution soon afterwards. Deadlock will result if the thread responsible
-	 * for resuming the rule attempts to join a suspended job.
-	 * 
-	 * @deprecated This method is not safe and should not be used.
-	 * Suspending a scheduling rule violates the thread safety
-	 * of clients that use scheduling rules as a mutual exclusion mechanism,
-	 * and can result in concurrency problems in all clients that use the suspended rule.
-	 * @param rule The scheduling rule to suspend. Must not be <code>null</code>.
-	 * @param monitor a progress monitor, or <code>null</code> if progress
-	 * reporting is not desired
-	 * @exception OperationCanceledException if the operation is canceled. 
-	 * Cancelation can occur even if no progress monitor is provided.
-	 * @see #resume(ISchedulingRule)
-	 */
-	public void suspend(ISchedulingRule rule, IProgressMonitor monitor);
-
-	/**
-	 * Requests that all jobs in the given job family be suspended.  Jobs currently 
-	 * waiting to be run will be removed from the queue and moved into the 
-	 * <code>SLEEPING</code> state.  Jobs that have been put to sleep
-	 * will remain in that state until either resumed or canceled.  This method has
-	 * no effect on jobs that are not currently waiting to be run.
-	 * <p>
-	 * Sleeping jobs can be resumed using <code>wakeUp</code>.
-	 * 
-	 * @param family the job family to sleep, or <code>null</code> to sleep all jobs.
-	 * @see Job#belongsTo(Object)
-	 */
-	public void sleep(Object family);
-
-	/**
-	 * Transfers ownership of a scheduling rule to another thread.  The identical
-	 * scheduling rule must currently be owned by the calling thread as a result of 
-	 * a previous call to <code>beginRule</code>.  The destination thread must
-	 * not already own a scheduling rule.
-	 * <p>
-	 * Calling this method is equivalent to atomically calling <code>endRule</code> 
-	 * in the calling thread followed by an immediate <code>beginRule</code> in 
-	 * the destination thread.  The destination thread is responsible for subsequently 
-	 * calling <code>endRule</code> when it is finished using the rule.
-	 * <p>
-	 * This method has no effect when the destination thread is the same as the
-	 * calling thread.
-	 * 
-	 * @param rule The scheduling rule to transfer
-	 * @param destinationThread The new owner for the transferred rule.
-	 * @since 3.1
-	 */
-	public void transferRule(ISchedulingRule rule, Thread destinationThread);
-
-	/**
-	 * Resumes scheduling of all sleeping jobs in the given family.  This method
-	 * has no effect on jobs in the family that are not currently sleeping.
-	 * 
-	 * @param family the job family to wake up, or <code>null</code> to wake up all jobs
-	 * @see Job#belongsTo(Object)
-	 */
-	public void wakeUp(Object family);
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobStatus.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobStatus.java
deleted file mode 100644
index cbcb855..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/IJobStatus.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the 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.runtime.jobs;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Represents status relating to the execution of jobs.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- *
- * @see org.eclipse.core.runtime.IStatus
- */
-public interface IJobStatus extends IStatus {
-	/**
-	 * Returns the job associated with this status.
-	 * 
-	 * @return the job associated with this status
-	 */
-	public Job getJob();
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ILock.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ILock.java
deleted file mode 100644
index 539e807..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ILock.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.jobs;
-
-/**
- * A lock is used to control access to an exclusive resource.
- * <p>
- * Locks are reentrant.  That is, they can be acquired multiple times by the same thread
- * without releasing.  Locks are only released when the number of successful acquires 
- * equals the number of successful releases.
- * </p><p>
- * Locks are capable of detecting and recovering from programming errors that cause
- * circular waiting deadlocks. When a deadlock between two or more <tt>ILock</tt> 
- * instances is detected, detailed debugging information is printed to the log file.  The 
- * locks will then automatically recover from the deadlock by employing a release 
- * and wait strategy. One thread will lose control of the locks it owns, thus breaking 
- * the deadlock and  allowing other threads to proceed.  Once that thread's locks are 
- * all available, it will be given exclusive access to all its locks and allowed to proceed.  
- * A thread can only lose locks while it is waiting on an <tt>acquire()</tt> call. 
- * 
- * </p><p>
- * Successive acquire attempts by different threads are queued and serviced on
- * a first come, first served basis.
- * </p><p>
- * It is very important that acquired locks eventually get released.  Calls to release
- * should be done in a finally block to ensure they execute.  For example:
- * <pre>
- * try {
- * 	lock.acquire();
- * 	// ... do work here ...
- * } finally {
- * 	lock.release();
- * }
- * </pre>
- * Note: although <tt>lock.acquire</tt> should never fail, it is good practice to place 
- * it inside the try block anyway.  Releasing without acquiring is far less catastrophic 
- * than acquiring without releasing.
- * </p><p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @see IJobManager#newLock()
- * @since 3.0
- */
-public interface ILock {
-	/**
-	 * Attempts to acquire this lock.  If the lock is in use and the specified delay is
-	 * greater than zero, the calling thread will block until one of the following happens:
-	 * <ul>
-	 * <li>This lock is available</li>
-	 * <li>The thread is interrupted</li>
-	 * <li>The specified delay has elapsed</li>
-	 * </ul>
-	 * <p>
-	 * While a thread is waiting,  locks it already owns may be granted to other threads 
-	 * if necessary to break a deadlock.  In this situation, the calling thread may be blocked
-	 * for longer than the specified delay.  On returning from this call, the calling thread 
-	 * will once again have exclusive access to any other locks it owned upon entering 
-	 * the acquire method.
-	 * 
-	 * @param delay the number of milliseconds to delay
-	 * @return <code>true</code> if the lock was successfully acquired, and 
-	 * <code>false</code> otherwise.
-	 * @exception InterruptedException if the thread was interrupted
-	 */
-	public boolean acquire(long delay) throws InterruptedException;
-
-	/**
-	 * Acquires this lock.  If the lock is in use, the calling thread will block until the lock 
-	 * becomes available.  If the calling thread owns several locks, it will be blocked
-	 * until all threads it requires become available, or until the thread is interrupted.
-	 * While a thread is waiting, its locks may be granted to other threads if necessary
-	 * to break a deadlock.  On returning from this call, the calling thread will 
-	 * have exclusive access to this lock, and any other locks it owned upon
-	 * entering the acquire method.
-	 * <p>
-	 * This implementation ignores attempts to interrupt the thread.  If response to
-	 * interruption is needed, use the method <code>acquire(long)</code>
-	 */
-	public void acquire();
-
-	/**
-	 * Returns the number of nested acquires on this lock that have not been released.
-	 * This is the number of times that release() must be called before the lock is
-	 * freed.
-	 * 
-	 * @return the number of nested acquires that have not been released
-	 */
-	public int getDepth();
-
-	/**
-	 * Releases this lock. Locks must only be released by the thread that currently
-	 * owns the lock.
-	 */
-	public void release();
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ISchedulingRule.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ISchedulingRule.java
deleted file mode 100644
index 3f08a7c..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ISchedulingRule.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.jobs;
-
-/**
- * Scheduling rules are used by jobs to indicate when they need exclusive access
- * to a resource.  Scheduling rules can also be applied synchronously to a thread
- * using <tt>IJobManager.beginRule(ISchedulingRule)</tt> and 
- * <tt>IJobManager.endRule(ISchedulingRule)</tt>.  The job manager guarantees that 
- * no two jobs with conflicting scheduling rules will run concurrently. 
- * Multiple rules can be applied to a given thread only if the outer rule explicitly 
- * allows the nesting as specified by the <code>contains</code> method.  
- * <p>
- * Clients may implement this interface.
- * 
- * @see Job#getRule()
- * @see Job#setRule(ISchedulingRule)
- * @see Job#schedule(long)
- * @see IJobManager#beginRule(ISchedulingRule, org.eclipse.core.runtime.IProgressMonitor)
- * @see IJobManager#endRule(ISchedulingRule)
- * @since 3.0
- */
-public interface ISchedulingRule {
-	/**
-	 * Returns whether this scheduling rule completely contains another scheduling
-	 * rule.  Rules can only be nested within a thread if the inner rule is completely 
-	 * contained within the outer rule.
-	 * <p>
-	 * Implementations of this method must obey the rules of a partial order relation
-	 * on the set of all scheduling rules.  In particular, implementations must be reflexive
-	 * (a.contains(a) is always true), antisymmetric (a.contains(b) and b.contains(a) iff a.equals(b), 
-	 * and transitive (if a.contains(b) and b.contains(c), then a.contains(c)).  Implementations
-	 * of this method must return <code>false</code> when compared to a rule they
-	 * know nothing about.
-	 * 
-	 * @param rule the rule to check for containment
-	 * @return <code>true</code> if this rule contains the given rule, and 
-	 * <code>false</code> otherwise.
-	 */
-	public boolean contains(ISchedulingRule rule);
-
-	/**
-	 * Returns whether this scheduling rule is compatible with another scheduling rule.
-	 * If <code>true</code> is returned, then no job with this rule will be run at the 
-	 * same time as a job with the conflicting rule.  If <code>false</code> is returned, 
-	 * then the job manager is free to run jobs with these rules at the same time.
-	 * <p>
-	 * Implementations of this method must be reflexive, symmetric, and consistent,
-	 * and must return <code>false</code> when compared  to a rule they know 
-	 * nothing about.
-	 *
-	 * @param rule the rule to check for conflicts
-	 * @return <code>true</code> if the rule is conflicting, and <code>false</code>
-	 * 	otherwise.
-	 */
-	public boolean isConflicting(ISchedulingRule rule);
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/Job.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/Job.java
deleted file mode 100644
index ebfa28c..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/Job.java
+++ /dev/null
@@ -1,653 +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.core.runtime.jobs;
-
-import org.eclipse.core.internal.jobs.InternalJob;
-import org.eclipse.core.internal.jobs.JobManager;
-import org.eclipse.core.runtime.*;
-
-/**
- * Jobs are units of runnable work that can be scheduled to be run with the job
- * manager.  Once a job has completed, it can be scheduled to run again (jobs are
- * reusable).
- * <p>
- * Jobs have a state that indicates what they are currently doing.  When constructed,
- * jobs start with a state value of <code>NONE</code>.  When a job is scheduled
- * to be run, it moves into the <code>WAITING</code> state.  When a job starts
- * running, it moves into the <code>RUNNING</code> state.  When execution finishes
- * (either normally or through cancelation), the state changes back to 
- * <code>NONE</code>.  
- * </p><p>
- * A job can also be in the <code>SLEEPING</code> state.  This happens if a user
- * calls Job.sleep() on a waiting job, or if a job is scheduled to run after a specified
- * delay.  Only jobs in the <code>WAITING</code> state can be put to sleep.  
- * Sleeping jobs can be woken at any time using Job.wakeUp(), which will put the
- * job back into the <code>WAITING</code> state.
- * </p><p>
- * Jobs can be assigned a priority that is used as a hint about how the job should
- * be scheduled.  There is no guarantee that jobs of one priority will be run before
- * all jobs of lower priority.  The javadoc for the various priority constants provide
- * more detail about what each priority means.  By default, jobs start in the 
- * <code>LONG</code> priority class.
- * 
- * @see IJobManager
- * @since 3.0
- */
-public abstract class Job extends InternalJob implements IAdaptable {
-
-	/**
-	 * Job status return value that is used to indicate asynchronous job completion.
-	 * @see Job#run(IProgressMonitor)
-	 * @see Job#done(IStatus)
-	 */
-	public static final IStatus ASYNC_FINISH = new Status(IStatus.OK, JobManager.PI_JOBS, 1, "", null);//$NON-NLS-1$
-
-	/* Job priorities */
-	/** 
-	 * Job priority constant (value 10) for interactive jobs.
-	 * Interactive jobs generally have priority over all other jobs.
-	 * Interactive jobs should be either fast running or very low on CPU
-	 * usage to avoid blocking other interactive jobs from running.
-	 * 
-	 * @see #getPriority()
-	 * @see #setPriority(int)
-	 * @see #run(IProgressMonitor)
-	 */
-	public static final int INTERACTIVE = 10;
-	/** 
-	 * Job priority constant (value 20) for short background jobs.
-	 * Short background jobs are jobs that typically complete within a second,
-	 * but may take longer in some cases.  Short jobs are given priority
-	 * over all other jobs except interactive jobs.
-	 * 
-	 * @see #getPriority()
-	 * @see #setPriority(int)
-	 * @see #run(IProgressMonitor)
-	 */
-	public static final int SHORT = 20;
-	/** 
-	 * Job priority constant (value 30) for long-running background jobs.
-	 * 
-	 * @see #getPriority()
-	 * @see #setPriority(int)
-	 * @see #run(IProgressMonitor)
-	 */
-	public static final int LONG = 30;
-	/** 
-	 * Job priority constant (value 40) for build jobs.  Build jobs are
-	 * generally run after all other background jobs complete.
-	 * 
-	 * @see #getPriority()
-	 * @see #setPriority(int)
-	 * @see #run(IProgressMonitor)
-	 */
-	public static final int BUILD = 40;
-
-	/** 
-	 * Job priority constant (value 50) for decoration jobs.
-	 * Decoration jobs have lowest priority.  Decoration jobs generally
-	 * compute extra information that the user may be interested in seeing
-	 * but is generally not waiting for.
-	 * 
-	 * @see #getPriority()
-	 * @see #setPriority(int)
-	 * @see #run(IProgressMonitor)
-	 */
-	public static final int DECORATE = 50;
-	/** 
-	 * Job state code (value 0) indicating that a job is not 
-	 * currently sleeping, waiting, or running (i.e., the job manager doesn't know 
-	 * anything about the job). 
-	 * 
-	 * @see #getState()
-	 */
-	public static final int NONE = 0;
-	/** 
-	 * Job state code (value 1) indicating that a job is sleeping.
-	 * 
-	 * @see #run(IProgressMonitor)
-	 * @see #getState()
-	 */
-	public static final int SLEEPING = 0x01;
-	/** 
-	 * Job state code (value 2) indicating that a job is waiting to be run.
-	 * 
-	 * @see #getState()
-	 */
-	public static final int WAITING = 0x02;
-	/** 
-	 * Job state code (value 4) indicating that a job is currently running
-	 * 
-	 * @see #getState()
-	 */
-	public static final int RUNNING = 0x04;
-
-	/**
-	 * Returns the job manager.
-	 * 
-	 * @return the job manager
-	 * @since org.eclipse.core.jobs 3.2
-	 */
-	public static final IJobManager getJobManager() {
-		return manager;
-	}
-
-	/**
-	 * Creates a new job with the specified name.  The job name is a human-readable
-	 * value that is displayed to users.  The name does not need to be unique, but it
-	 * must not be <code>null</code>.
-	 * 
-	 * @param name the name of the job.
-	 */
-	public Job(String name) {
-		super(name);
-	}
-
-	/**
-	 * Registers a job listener with this job
-	 * Has no effect if an identical listener is already registered.
-	 * 
-	 * @param listener the listener to be added.
-	 */
-	public final void addJobChangeListener(IJobChangeListener listener) {
-		super.addJobChangeListener(listener);
-	}
-
-	/**
-	 * Returns whether this job belongs to the given family.  Job families are
-	 * represented as objects that are not interpreted or specified in any way
-	 * by the job manager.  Thus, a job can choose to belong to any number of
-	 * families.
-	 * <p>
-	 * Clients may override this method.  This default implementation always returns
-	 * <code>false</code>.  Overriding implementations must return <code>false</code>
-	 * for families they do not recognize.
-	 * </p>
-	 * 
-	 * @param family the job family identifier
-	 * @return <code>true</code> if this job belongs to the given family, and 
-	 * <code>false</code> otherwise.
-	 */
-	public boolean belongsTo(Object family) {
-		return false;
-	}
-
-	/**
-	 * Stops the job.  If the job is currently waiting,
-	 * it will be removed from the queue.  If the job is sleeping,
-	 * it will be discarded without having a chance to resume and its sleeping state
-	 * will be cleared.  If the job is currently executing, it will be asked to
-	 * stop but there is no guarantee that it will do so.
-	 * 
-	 * @return <code>false</code> if the job is currently running (and thus may not
-	 * respond to cancelation), and <code>true</code> in all other cases.
-	 */
-	public final boolean cancel() {
-		return super.cancel();
-	}
-
-	/**
-	 * Jobs that complete their execution asynchronously must indicate when they
-	 * are finished by calling this method.  This method must not be called by
-	 * a job that has not indicated that it is executing asynchronously.
-	 * <p>
-	 * This method must not be called from within the scope of a job's <code>run</code>
-	 * method.  Jobs should normally indicate completion by returning an appropriate
-	 * status from the <code>run</code> method.  Jobs that return a status of
-	 * <code>ASYNC_FINISH</code> from their run method must later call 
-	 * <code>done</code> to indicate completion.
-	 * 
-	 * @param result a status object indicating the result of the job's execution.
-	 * @see #ASYNC_FINISH
-	 * @see #run(IProgressMonitor)
-	 */
-	public final void done(IStatus result) {
-		super.done(result);
-	}
-
-	/**
-	 * Returns the human readable name of this job.  The name is never 
-	 * <code>null</code>.
-	 * 
-	 * @return the name of this job
-	 */
-	public final String getName() {
-		return super.getName();
-	}
-
-	/**
-	 * Returns the priority of this job.  The priority is used as a hint when the job
-	 * is scheduled to be run.
-	 * 
-	 * @return the priority of the job.  One of INTERACTIVE, SHORT, LONG, BUILD, 
-	 * 	or DECORATE.
-	 */
-	public final int getPriority() {
-		return super.getPriority();
-	}
-
-	/**
-	 * Returns the value of the property of this job identified by the given key, 
-	 * or <code>null</code> if this job has no such property.
-	 *
-	 * @param key the name of the property
-	 * @return the value of the property, 
-	 *     or <code>null</code> if this job has no such property
-	 * @see #setProperty(QualifiedName, Object)
-	 */
-	public final Object getProperty(QualifiedName key) {
-		return super.getProperty(key);
-	}
-
-	/**
-	 * Returns the result of this job's last run.
-	 * 
-	 * @return the result of this job's last run, or <code>null</code> if this
-	 * job has never finished running.
-	 */
-	public final IStatus getResult() {
-		return super.getResult();
-	}
-
-	/**
-	 * Returns the scheduling rule for this job.  Returns <code>null</code> if this job has no
-	 * scheduling rule.
-	 * 
-	 * @return the scheduling rule for this job, or <code>null</code>.
-	 * @see ISchedulingRule
-	 * @see #setRule(ISchedulingRule)
-	 */
-	public final ISchedulingRule getRule() {
-		return super.getRule();
-	}
-
-	/**
-	 * Returns the state of the job. Result will be one of:
-	 * <ul>
-	 * <li><code>Job.RUNNING</code> - if the job is currently running.</li>
-	 * <li><code>Job.WAITING</code> - if the job is waiting to be run.</li>
-	 * <li><code>Job.SLEEPING</code> - if the job is sleeping.</li>
-	 * <li><code>Job.NONE</code> - in all other cases.</li>
-	 * </ul>
-	 * <p>
-	 * Note that job state is inherently volatile, and in most cases clients 
-	 * cannot rely on the result of this method being valid by the time the 
-	 * result is obtained.  For example, if <tt>getState</tt> returns 
-	 * <tt>RUNNING</tt>,  the job may have actually completed by the 
-	 * time the <tt>getState</tt> method returns.  All clients can infer from 
-	 * invoking this method is that  the job was recently in the returned state.
-	 * 
-	 * @return the job state
-	 */
-	public final int getState() {
-		return super.getState();
-	}
-
-	/**
-	 * Returns the thread that this job is currently running in.
-	 * 
-	 * @return the thread this job is running in, or <code>null</code>
-	 * if this job is not running or the thread is unknown.
-	 */
-	public final Thread getThread() {
-		return super.getThread();
-	}
-
-	/**
-	 * Returns whether this job is blocking another non-system job from 
-	 * starting due to a conflicting scheduling rule.  Returns <code>false</code> 
-	 * if this job is not running, or is not blocking any other job.
-	 * 
-	 * @return <code>true</code> if this job is blocking a waiting non-system
-	 * job, and <code>false</code> otherwise.
-	 * @see #getRule()
-	 * @see #isSystem()
-	 */
-	public final boolean isBlocking() {
-		return super.isBlocking();
-	}
-
-	/**
-	 * Returns whether this job is a system job.  System jobs are typically not 
-	 * revealed to users in any UI presentation of jobs.  Other than their UI presentation,
-	 * system jobs act exactly like other jobs.  If this value is not explicitly set, jobs
-	 * are treated as non-system jobs.  The default value is <code>false</code>.
-	 * 
-	 * @return <code>true</code> if this job is a system job, and
-	 * <code>false</code> otherwise.
-	 * @see #setSystem(boolean)
-	 */
-	public final boolean isSystem() {
-		return super.isSystem();
-	}
-
-	/**
-	 * Returns whether this job has been directly initiated by a UI end user. 
-	 * These jobs may be presented differently in the UI.  The default value
-	 * is <code>false</code>.
-	 * 
-	 * @return <code>true</code> if this job is a user-initiated job, and
-	 * <code>false</code> otherwise.
-	 * @see #setUser(boolean)
-	 */
-	public final boolean isUser() {
-		return super.isUser();
-	}
-
-	/**
-	 * Waits until this job is finished.  This method will block the calling thread until the 
-	 * job has finished executing, or until this thread has been interrupted.  If the job 
-	 * has not been scheduled, this method returns immediately.
-	 * <p>
-	 * If this method is called on a job that reschedules itself from within the 
-	 * <tt>run</tt> method, the join will return at the end of the first execution.
-	 * In other words, join will return the first time this job exits the
-	 * <tt>RUNNING</tt> state, or as soon as this job enters the <tt>NONE</tt> state.
-	 * </p>
-	 * <p>
-	 * If this method is called while the job manager is suspended, this job
-	 * will only be joined if it is already running; if this job is waiting or sleeping,
-	 * this method returns immediately.
-	 * </p>
-	 * <p>
-	 * Note that there is a deadlock risk when using join.  If the calling thread owns
-	 * a lock or object monitor that the joined thread is waiting for, deadlock 
-	 * will occur.
-	 * </p>
-	 * 
-	 * @exception InterruptedException if this thread is interrupted while waiting
-	 * @see ILock
-	 * @see IJobManager#suspend()
-	 */
-	public final void join() throws InterruptedException {
-		super.join();
-	}
-
-	/**
-	 * Removes a job listener from this job.
-	 * Has no effect if an identical listener is not already registered.
-	 * 
-	 * @param listener the listener to be removed
-	 */
-	public final void removeJobChangeListener(IJobChangeListener listener) {
-		super.removeJobChangeListener(listener);
-	}
-
-	/**
-	 * Executes this job.  Returns the result of the execution.
-	 * <p>
-	 * The provided monitor can be used to report progress and respond to 
-	 * cancellation.  If the progress monitor has been canceled, the job
-	 * should finish its execution at the earliest convenience and return a result
-	 * status of severity <code>IStatus.CANCEL</code>.  The singleton
-	 * cancel status <code>Status.CANCEL_STATUS</code> can be used for
-	 * this purpose.
-	 * <p>
-	 * This method must not be called directly by clients.  Clients should call
-	 * <code>schedule</code>, which will in turn cause this method to be called.
-	 * <p>
-	 * Jobs can optionally finish their execution asynchronously (in another thread) by 
-	 * returning a result status of <code>Job.ASYNC_FINISH</code>.  Jobs that finish
-	 * asynchronously <b>must</b> specify the execution thread by calling
-	 * <code>setThread</code>, and must indicate when they are finished by calling
-	 * the method <code>done</code>.
-	 * 
-	 * @param monitor the monitor to be used for reporting progress and
-	 * responding to cancelation. The monitor is never <code>null</code>
-	 * @return resulting status of the run. The result must not be <code>null</code>
-	 * @see #ASYNC_FINISH
-	 * @see #done(IStatus)
-	 */
-	protected abstract IStatus run(IProgressMonitor monitor);
-
-	/**
-	 * Schedules this job to be run.  The job is added to a queue of waiting
-	 * jobs, and will be run when it arrives at the beginning of the queue.
-	 * <p>
-	 * This is a convenience method, fully equivalent to 
-	 * <code>schedule(0L)</code>.
-	 * </p>
-	 * @see #schedule(long)
-	 */
-	public final void schedule() {
-		super.schedule(0L);
-	}
-
-	/**
-	 * Schedules this job to be run after a specified delay.  After the specified delay,
-	 * the job is added to a queue of waiting jobs, and will be run when it arrives 
-	 * at the beginning of the queue.	Jobs of equal priority and <code>delay</code> with 
-	 * conflicting scheduling rules are guaranteed to run in the order they are 
-	 * scheduled. No guarantees are made about the relative execution order of jobs 
-	 * with unrelated or <code>null</code> scheduling rules, or different priorities.
-	 * <p>
-	 * If this job is currently running, it will be rescheduled with the specified
-	 * delay as soon as it finishes.  If this method is called multiple times
-	 * while the job is running, the job will still only be rescheduled once,
-	 * with the most recent delay value that was provided.
-	 * </p><p>
-	 * Scheduling a job that is waiting or sleeping has no effect.
-	 * </p>
-	 * 
-	 * @param delay a time delay in milliseconds before the job should run
-	 * @see ISchedulingRule
-	 */
-	public final void schedule(long delay) {
-		super.schedule(delay);
-	}
-
-	/**
-	 * Changes the name of this job.  The job name is a human-readable
-	 * value that is displayed to users.  The name does not need to be unique, but it
-	 * must not be <code>null</code>.
-	 * 
-	 * @param name the name of the job.
-	 */
-	public final void setName(String name) {
-		super.setName(name);
-	}
-
-	/**
-	 * Sets the priority of the job.  This will not affect the execution of
-	 * a running job, but it will affect how the job is scheduled while
-	 * it is waiting to be run.
-	 * 
-	 * @param priority the new job priority.  One of
-	 * INTERACTIVE, SHORT, LONG, BUILD, or DECORATE.
-	 */
-	public final void setPriority(int priority) {
-		super.setPriority(priority);
-	}
-
-	/**
-	 * Associates this job with a progress group.  Progress feedback 
-	 * on this job's next execution will be displayed together with other
-	 * jobs in that group. The provided monitor must be a monitor 
-	 * created by the method <tt>IJobManager.createProgressGroup</tt>
-	 * and must have at least <code>ticks</code> units of available work.
-	 * <p>
-	 * The progress group must be set before the job is scheduled.
-	 * The group will be used only for a single invocation of the job's 
-	 * <tt>run</tt> method, after which any association of this job to the 
-	 * group will be lost.
-	 * 
-	 * @see IJobManager#createProgressGroup()
-	 * @param group The progress group to use for this job
-	 * @param ticks the number of work ticks allocated from the
-	 *    parent monitor, or IProgressMonitor.UNKNOWN
-	 */
-	public final void setProgressGroup(IProgressMonitor group, int ticks) {
-		super.setProgressGroup(group, ticks);
-	}
-
-	/**
-	 * Sets the value of the property of this job identified
-	 * by the given key. If the supplied value is <code>null</code>,
-	 * the property is removed from this resource. 
-	 * <p>
-	 * Properties are intended to be used as a caching mechanism
-	 * by ISV plug-ins. They allow key-object associations to be stored with
-	 * a job instance.  These key-value associations are maintained in 
-	 * memory (at all times), and the information is never discarded automatically.
-	 * </p><p>
-	 * The qualifier part of the property name must be the unique identifier
-	 * of the declaring plug-in (e.g. <code>"com.example.plugin"</code>).
-	 * </p>
-	 *
-	 * @param key the qualified name of the property
-	 * @param value the value of the property, 
-	 *     or <code>null</code> if the property is to be removed
-	 * @see #getProperty(QualifiedName)
-	 */
-	public void setProperty(QualifiedName key, Object value) {
-		super.setProperty(key, value);
-	}
-
-	/**
-	 * Sets the scheduling rule to be used when scheduling this job.  This method
-	 * must be called before the job is scheduled.
-	 * 
-	 * @param rule the new scheduling rule, or <code>null</code> if the job
-	 * should have no scheduling rule
-	 * @see #getRule()
-	 */
-	public final void setRule(ISchedulingRule rule) {
-		super.setRule(rule);
-	}
-
-	/**
-	 * Sets whether or not this job is a system job.  System jobs are typically not 
-	 * revealed to users in any UI presentation of jobs.  Other than their UI presentation,
-	 * system jobs act exactly like other jobs.  If this value is not explicitly set, jobs
-	 * are treated as non-system jobs. This method must be called before the job 
-	 * is scheduled.
-	 * 
-	 * @param value <code>true</code> if this job should be a system job, and
-	 * <code>false</code> otherwise.
-	 * @see #isSystem()
-	 */
-	public final void setSystem(boolean value) {
-		super.setSystem(value);
-	}
-
-	/**
-	 * Sets whether or not this job has been directly initiated by a UI end user. 
-	 * These jobs may be presented differently in the UI. This method must be 
-	 * called before the job is scheduled.
-	 * 
-	 * @param value <code>true</code> if this job is a user-initiated job, and
-	 * <code>false</code> otherwise.
-	 * @see #isUser()
-	 */
-	public final void setUser(boolean value) {
-		super.setUser(value);
-	}
-
-	/**
-	 * Sets the thread that this job is currently running in, or <code>null</code>
-	 * if this job is not running or the thread is unknown.
-	 * <p>
-	 * Jobs that use the <code>Job.ASYNC_FINISH</code> return code should tell 
-	 * the job what thread it is running in.  This is used to prevent deadlocks.
-	 * 
-	 * @param thread the thread that this job is running in.
-	 * 
-	 * @see #ASYNC_FINISH
-	 * @see #run(IProgressMonitor)
-	 */
-	public final void setThread(Thread thread) {
-		super.setThread(thread);
-	}
-
-	/**
-	 * Returns whether this job should be run.
-	 * If <code>false</code> is returned, this job will be discarded by the job manager
-	 * without running.
-	 * <p>
-	 * This method is called immediately prior to calling the job's
-	 * run method, so it can be used for last minute pre-condition checking before
-	 * a job is run. This method must not attempt to schedule or change the
-	 * state of any other job.
-	 * </p><p>
-	 * Clients may override this method.  This default implementation always returns
-	 * <code>true</code>.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if this job should be run 
-	 *   and <code>false</code> otherwise
-	 */
-	public boolean shouldRun() {
-		return true;
-	}
-
-	/**
-	 * Returns whether this job should be scheduled.
-	 * If <code>false</code> is returned, this job will be discarded by the job manager
-	 * without being added to the queue.
-	 * <p>
-	 * This method is called immediately prior to adding the job to the waiting job
-	 * queue.,so it can be used for last minute pre-condition checking before
-	 * a job is scheduled.
-	 * </p><p>
-	 * Clients may override this method.  This default implementation always returns
-	 * <code>true</code>.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if the job manager should schedule this job
-	 *   and <code>false</code> otherwise
-	 */
-	public boolean shouldSchedule() {
-		return true;
-	}
-
-	/**
-	 * Requests that this job be suspended.  If the job is currently waiting to be run, it 
-	 * will be removed from the queue move into the <code>SLEEPING</code> state.
-	 * The job will remain asleep until either resumed or canceled.  If this job is not
-	 * currently waiting to be run, this method has no effect.
-	 * <p>
-	 * Sleeping jobs can be resumed using <code>wakeUp</code>.
-	 * 
-	 * @return <code>false</code> if the job is currently running (and thus cannot
-	 * be put to sleep), and <code>true</code> in all other cases
-	 * @see #wakeUp()
-	 */
-	public final boolean sleep() {
-		return super.sleep();
-	}
-
-	/**
-	 * Puts this job immediately into the <code>WAITING</code> state so that it is 
-	 * eligible for immediate execution. If this job is not currently sleeping, 
-	 * the request is ignored.
-	 * <p>
-	 * This is a convenience method, fully equivalent to 
-	 * <code>wakeUp(0L)</code>.
-	 * </p>
-	 * @see #sleep()
-	 */
-	public final void wakeUp() {
-		super.wakeUp(0L);
-	}
-
-	/**
-	 * Puts this job back into the <code>WAITING</code> state after
-	 * the specified delay. This is equivalent to canceling the sleeping job and
-	 * rescheduling with the given delay.  If this job is not currently sleeping, 
-	 * the request  is ignored.
-	 * 
-	 * @param delay the number of milliseconds to delay
-	 * @see #sleep()
-	 */
-	public final void wakeUp(long delay) {
-		super.wakeUp(delay);
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/JobChangeAdapter.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/JobChangeAdapter.java
deleted file mode 100644
index 55fbdda..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/JobChangeAdapter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.jobs;
-
-/**
- * This adapter class provides default implementations for the
- * methods described by the <code>IJobChangeListener</code> interface.
- * <p>
- * Classes that wish to listen to the progress of scheduled jobs can
- * extend this class and override only the methods which they are
- * interested in.
- * </p>
- *
- * @see IJobChangeListener
- * @since 3.0
- */
-public class JobChangeAdapter implements IJobChangeListener {
-	/* (non-Javadoc)
-	 * @see IJobChangeListener#aboutToRun(IJobChangeEvent)
-	 * This default implementation does nothing
-	 */
-	public void aboutToRun(IJobChangeEvent event) {
-		// do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobChangeListener#awake(IJobChangeEvent)
-	 * This default implementation does nothing
-	 */
-	public void awake(IJobChangeEvent event) {
-		// do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobChangeListener#done(IJobChangeEvent)
-	 * This default implementation does nothing
-	 */
-	public void done(IJobChangeEvent event) {
-		// do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobChangeListener#running(IJobChangeEvent)
-	 * This default implementation does nothing
-	 */
-	public void running(IJobChangeEvent event) {
-		// do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobChangeListener#scheduled(IJobChangeEvent)
-	 * This default implementation does nothing
-	 */
-	public void scheduled(IJobChangeEvent event) {
-		// do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see IJobChangeListener#sleeping(IJobChangeEvent)
-	 * This default implementation does nothing
-	 */
-	public void sleeping(IJobChangeEvent event) {
-		// do nothing
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/LockListener.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/LockListener.java
deleted file mode 100644
index e25e3b0..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/LockListener.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the 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.runtime.jobs;
-
-import org.eclipse.core.internal.jobs.JobManager;
-import org.eclipse.core.internal.jobs.LockManager;
-
-/**
- * A lock listener is notified whenever a thread is about to wait
- * on a lock, and when a thread is about to release a lock.
- * <p>
- * This class is for internal use by the platform-related plug-ins.
- * Clients outside of the base platform should not reference or subclass this class.
- * </p>
- * 
- * @see IJobManager#setLockListener(LockListener)
- * @since 3.0
- */
-public class LockListener {
-	private final LockManager manager = JobManager.getInstance().getLockManager();
-
-	/**
-	 * Notification that a thread is about to block on an attempt to acquire a lock.
-	 * Returns whether the thread should be granted immediate access to the lock.
-	 * <p>
-	 * This default implementation always returns <code>false</code>. 
-	 * Subclasses may override.
-	 * 
-	 * @param lockOwner the thread that currently owns the lock this thread is
-	 * waiting for, or <code>null</code> if unknown.
-	 * @return <code>true</code> if the thread should be granted immediate access, 
-	 * and <code>false</code> if it should wait for the lock to be available
-	 */
-	public boolean aboutToWait(Thread lockOwner) {
-		return false;
-	}
-
-	/**
-	 * Notification that a thread is about to release a lock.
-	 * <p>
-	 * This default implementation does nothing. Subclasses may override.
-	 */
-	public void aboutToRelease() {
-		//do nothing
-	}
-
-	/**
-	 * Returns whether this thread currently owns any locks
-	 * @return <code>true</code> if this thread owns any locks, and 
-	 * <code>false</code> otherwise.
-	 */
-	protected final boolean isLockOwnerThread() {
-		return manager.isLockOwner();
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/MultiRule.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/MultiRule.java
deleted file mode 100644
index 0693a04..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/MultiRule.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.jobs;
-
-import java.util.ArrayList;
-
-/**
- * A MultiRule is a compound scheduling rule that represents a fixed group of child 
- * scheduling rules.  A MultiRule conflicts with another rule if any of its children conflict 
- * with that rule.  More formally, a compound rule represents a logical intersection 
- * of its child rules with respect to the <code>isConflicting</code> equivalence 
- * relation.
- * <p>
- * A MultiRule will never contain other MultiRules as children.  If a MultiRule is provided
- * as a child, its children will be added instead.
- * </p>
- * <p>
- * This class is not intended to be subclassed by clients.
- * </p>
- * @since 3.0
- */
-public class MultiRule implements ISchedulingRule {
-	private ISchedulingRule[] rules;
-
-	/**
-	 * Returns a scheduling rule that encompasses all provided rules.  The resulting
-	 * rule may or may not be an instance of <code>MultiRule</code>.  If all
-	 * provided rules are <code>null</code> then the result will be
-	 * <code>null</code>.
-	 * 
-	 * @param ruleArray An array of scheduling rules, some of which may be <code>null</code>
-	 * @return a combined scheduling rule, or <code>null</code>
-	 * @since 3.1
-	 */
-	public static ISchedulingRule combine(ISchedulingRule[] ruleArray) {
-		ISchedulingRule result = null;
-		for (int i = 0; i < ruleArray.length; i++) {
-			if (ruleArray[i] == null)
-				continue;
-			if (result == null) {
-				result = ruleArray[i];
-				continue;
-			}
-			result = combine(result, ruleArray[i]);
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a scheduling rule that encompasses both provided rules.  The resulting
-	 * rule may or may not be an instance of <code>MultiRule</code>.  If both
-	 * provided rules are <code>null</code> then the result will be
-	 * <code>null</code>.
-	 * 
-	 * @param rule1 a scheduling rule, or <code>null</code>
-	 * @param rule2 another scheduling rule, or <code>null</code>
-	 * @return a combined scheduling rule, or <code>null</code>
-	 */
-	public static ISchedulingRule combine(ISchedulingRule rule1, ISchedulingRule rule2) {
-		if (rule1 == rule2)
-			return rule1;
-		if (rule1 == null)
-			return rule2;
-		if (rule2 == null)
-			return rule1;
-		if (rule1.contains(rule2))
-			return rule1;
-		if (rule2.contains(rule1))
-			return rule2;
-		MultiRule result = new MultiRule();
-		result.rules = new ISchedulingRule[] {rule1, rule2};
-		//make sure we don't end up with nested multi-rules
-		if (rule1 instanceof MultiRule || rule2 instanceof MultiRule)
-			result.rules = flatten(result.rules);
-		return result;
-	}
-
-	/*
-	 * Collapses an array of rules that may contain MultiRules into an
-	 * array in which no rules are MultiRules.
-	 */
-	private static ISchedulingRule[] flatten(ISchedulingRule[] nestedRules) {
-		ArrayList myRules = new ArrayList(nestedRules.length);
-		for (int i = 0; i < nestedRules.length; i++) {
-			if (nestedRules[i] instanceof MultiRule) {
-				ISchedulingRule[] children = ((MultiRule) nestedRules[i]).getChildren();
-				for (int j = 0; j < children.length; j++)
-					myRules.add(children[j]);
-			} else {
-				myRules.add(nestedRules[i]);
-			}
-		}
-		return (ISchedulingRule[]) myRules.toArray(new ISchedulingRule[myRules.size()]);
-	}
-
-	/**
-	 * Creates a new scheduling rule that composes a set of nested rules.
-	 * 
-	 * @param nestedRules the nested rules for this compound rule.
-	 */
-	public MultiRule(ISchedulingRule[] nestedRules) {
-		this.rules = flatten(nestedRules);
-	}
-
-	/**
-	 * Creates a new scheduling rule with no nested rules. For
-	 * internal use only.
-	 */
-	private MultiRule() {
-		//to be invoked only by factory methods
-	}
-
-	/**
-	 * Returns the child rules within this rule.
-	 * @return the child rules
-	 */
-	public ISchedulingRule[] getChildren() {
-		return (ISchedulingRule[]) rules.clone();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean contains(ISchedulingRule rule) {
-		if (this == rule)
-			return true;
-		if (rule instanceof MultiRule) {
-			ISchedulingRule[] otherRules = ((MultiRule) rule).getChildren();
-			//for each child of the target, there must be some child in this rule that contains it.
-			for (int other = 0; other < otherRules.length; other++) {
-				boolean found = false;
-				for (int mine = 0; !found && mine < rules.length; mine++)
-					found = rules[mine].contains(otherRules[other]);
-				if (!found)
-					return false;
-			}
-			return true;
-		}
-		for (int i = 0; i < rules.length; i++)
-			if (rules[i].contains(rule))
-				return true;
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean isConflicting(ISchedulingRule rule) {
-		if (this == rule)
-			return true;
-		if (rule instanceof MultiRule) {
-			ISchedulingRule[] otherRules = ((MultiRule) rule).getChildren();
-			for (int j = 0; j < otherRules.length; j++)
-				for (int i = 0; i < rules.length; i++)
-					if (rules[i].isConflicting(otherRules[j]))
-						return true;
-		} else {
-			for (int i = 0; i < rules.length; i++)
-				if (rules[i].isConflicting(rule))
-					return true;
-		}
-		return false;
-	}
-
-	/*
-	 * For debugging purposes only.
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("MultiRule["); //$NON-NLS-1$
-		int last = rules.length - 1;
-		for (int i = 0; i < rules.length; i++) {
-			buffer.append(rules[i]);
-			if (i != last)
-				buffer.append(',');
-		}
-		buffer.append(']');
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ProgressProvider.java b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ProgressProvider.java
deleted file mode 100644
index 719954c..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/ProgressProvider.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.jobs;
-
-import org.eclipse.core.runtime.*;
-
-/**
- * The progress provider supplies the job manager with progress monitors for
- * running jobs.  There can only be one progress provider at any given time.
- * <p>
- * This class is for internal use by the platform-related plug-ins.
- * Clients outside of the base platform should not reference or subclass this class.
- * </p>
- * 
- * @see IJobManager#setProgressProvider(ProgressProvider)
- * @since 3.0
- */
-public abstract class ProgressProvider {
-	/**
-	 * Provides a new progress monitor instance to be used by the given job.
-	 * This method is called prior to running any job that does not belong to a
-	 * progress group. The returned monitor will be supplied to the job's
-	 * <code>run</code> method.
-	 * 
-	 * @see #createProgressGroup()
-	 * @see Job#setProgressGroup(IProgressMonitor, int)
-	 * @param job the job to create a progress monitor for
-	 * @return a progress monitor, or <code>null</code> if no progress monitoring 
-	 * is needed.
-	 */
-	public abstract IProgressMonitor createMonitor(Job job);
-
-	/**
-	 * Returns a progress monitor that can be used to provide
-	 * aggregated progress feedback on a set of running jobs.
-	 * This method implements <code>IJobManager.createProgressGroup</code>,
-	 * and must obey all rules specified in that contract.
-	 * <p>
-	 * This default implementation returns a new
-	 * <code>NullProgressMonitor</code>  Subclasses may override.
-	 * 
-	 * @see IJobManager#createProgressGroup()
-	 * @return a progress monitor
-	 */
-	public IProgressMonitor createProgressGroup() {
-		return new NullProgressMonitor();
-	}
-
-	/**
-	 * Returns a progress monitor that can be used by a running job
-	 * to report progress in the context of a progress group. This method
-	 * implements <code>Job.setProgressGroup</code>.  One of the
-	 * two <code>createMonitor</code> methods will be invoked
-	 * prior to each execution of a job, depending on whether a progress
-	 * group was specified for the job.
-	 * <p>
-	 * The provided monitor must be a monitor returned by the method
-	 * <code>createProgressGroup</code>.  This method is responsible
-	 * for asserting this and throwing an appropriate runtime exception
-	 * if an invalid monitor is provided.
-	 * <p>
-	 * This default implementation returns a new
-	 * <code>SubProgressMonitor</code>.  Subclasses may override.
-	 * 
-	 * @see IJobManager#createProgressGroup()
-	 * @see Job#setProgressGroup(IProgressMonitor, int)
-	 * @param job the job to create a progress monitor for
-	 * @param group the progress monitor group that this job belongs to
-	 * @param ticks the number of ticks of work for the progress monitor
-	 * @return a progress monitor, or <code>null</code> if no progress monitoring 
-	 * is needed.
-	 */
-	public IProgressMonitor createMonitor(Job job, IProgressMonitor group, int ticks) {
-		return new SubProgressMonitor(group, ticks);
-	}
-
-	/**
-	 * Returns a progress monitor to use when none has been provided
-	 * by the client running the job.  
-	 * <p>
-	 * This default implementation returns a new
-	 * <code>NullProgressMonitor</code>  Subclasses may override.
-	 * 
-	 * @return a progress monitor
-	 */
-	public IProgressMonitor getDefaultMonitor() {
-		return new NullProgressMonitor();
-	}
-}
diff --git a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/package.html b/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/package.html
deleted file mode 100644
index 1e6256b..0000000
--- a/bundles/org.eclipse.core.jobs/src/org/eclipse/core/runtime/jobs/package.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides core support for scheduling and interacting with background activity.
-<h2>
-Package Specification</h2>
-<p>
-This package specifies API for scheduling background tasks, or jobs.  Jobs can be
-scheduled for immediate execution, or for execution after a specified delay.  Once
-scheduled, jobs can be queried, canceled, or suspended.  Rules can be attached to
-jobs to indicate when they can run, and whether they can run simultaneously with other
-jobs.  This package also includes a generic locking facility that includes support for 
-detecting and responding to deadlock.
-<p>
-@since 3.0
-<p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/.classpath b/bundles/org.eclipse.core.runtime.compatibility.registry/.classpath
deleted file mode 100644
index a29e908..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="lib" path="classes"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/.cvsignore b/bundles/org.eclipse.core.runtime.compatibility.registry/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/.project b/bundles/org.eclipse.core.runtime.compatibility.registry/.project
deleted file mode 100644
index 525a642..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.runtime.compatibility.registry</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/.settings/org.eclipse.ltk.core.refactoring.prefs b/bundles/org.eclipse.core.runtime.compatibility.registry/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 56411a5..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Wed Feb 01 16:10:57 EST 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.runtime.compatibility.registry/META-INF/MANIFEST.MF
deleted file mode 100644
index 3ebe097..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %fragmentName
-Bundle-SymbolicName: org.eclipse.core.runtime.compatibility.registry
-Bundle-Version: 3.2.0.qualifier
-Bundle-Vendor: %providerName
-Fragment-Host: org.eclipse.equinox.registry
-Bundle-Localization: fragment
-Eclipse-PatchFragment: true
-Bundle-ClassPath: runtime_registry_compatibility.jar
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/about.html b/bundles/org.eclipse.core.runtime.compatibility.registry/about.html
deleted file mode 100644
index 0d66d40..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/about.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<p>February 6, 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" target="_blank">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<small>Java and all Java-based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries.</small>
-
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/build.properties b/bundles/org.eclipse.core.runtime.compatibility.registry/build.properties
deleted file mode 100644
index 2569e36..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.runtime_registry_compatibility.jar = src/,\
-                                            classes/
-output.runtime_registry_compatibility.jar = bin/
-bin.includes = META-INF/,\
-               runtime_registry_compatibility.jar,\
-               about.html,\
-               fragment.properties
-extra.runtime_registry_compatibility.jar = classes/
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/classes/org/eclipse/core/runtime/IPluginDescriptor.class b/bundles/org.eclipse.core.runtime.compatibility.registry/classes/org/eclipse/core/runtime/IPluginDescriptor.class
deleted file mode 100644
index 817a1b8..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/classes/org/eclipse/core/runtime/IPluginDescriptor.class
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/fragment.properties b/bundles/org.eclipse.core.runtime.compatibility.registry/fragment.properties
deleted file mode 100644
index e60dbf5..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/fragment.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-providerName=Eclipse.org
-fragmentName=Eclipse Registry Compatibility Fragment
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/BundleHelper.java b/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/BundleHelper.java
deleted file mode 100644
index 9519509..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/BundleHelper.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.registry;
-
-import org.eclipse.core.internal.registry.osgi.Activator;
-import org.osgi.framework.Bundle;
-import org.osgi.service.packageadmin.PackageAdmin;
-import org.osgi.util.tracker.ServiceTracker;
-
-public class BundleHelper {
-
-	private ServiceTracker bundleTracker = null;
-
-	private static final BundleHelper singleton = new BundleHelper();
-
-	public static BundleHelper getDefault() {
-		return singleton;
-	}
-
-	/**
-	 * Private constructor to block instance creation.
-	 */
-	private BundleHelper() {
-		super();
-	}
-
-	private PackageAdmin getPackageAdmin() {
-		if (bundleTracker == null) {
-			bundleTracker = new ServiceTracker(Activator.getContext(), PackageAdmin.class.getName(), null);
-			bundleTracker.open();
-		}
-		return (PackageAdmin) bundleTracker.getService();
-	}
-
-	public Bundle getBundle(String symbolicName) {
-		PackageAdmin packageAdmin = getPackageAdmin();
-		if (packageAdmin == null)
-			return null;
-		Bundle[] bundles = packageAdmin.getBundles(symbolicName, null);
-		if (bundles == null)
-			return null;
-		//Return the first bundle that is not installed or uninstalled
-		for (int i = 0; i < bundles.length; i++) {
-			if ((bundles[i].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) {
-				return bundles[i];
-			}
-		}
-		return null;
-	}
-
-	public Bundle[] getHosts(Bundle bundle) {
-		PackageAdmin packageAdmin = getPackageAdmin();
-		if (packageAdmin == null)
-			return null;
-		return packageAdmin.getHosts(bundle);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/ExtensionHandle.java b/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/ExtensionHandle.java
deleted file mode 100644
index 2e3421f..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/ExtensionHandle.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.registry;
-
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.osgi.framework.Bundle;
-
-/**
- * This class contains only compatibility-specific code.
- * 
- * @deprecated marked as deprecated to supress warnings
- */
-public class ExtensionHandle extends BaseExtensionHandle {
-
-	static final ExtensionHandle[] EMPTY_ARRAY = new ExtensionHandle[0];
-
-	public ExtensionHandle(IObjectManager objectManager, int id) {
-		super(objectManager, id);
-	}
-
-	public IPluginDescriptor getDeclaringPluginDescriptor() throws InvalidRegistryObjectException {
-		String namespace = getContributor().getName();
-		IPluginDescriptor result = RegistryCompatibilityHelper.getPluginDescriptor(namespace);
-		if (result == null) {
-			Bundle underlyingBundle = BundleHelper.getDefault().getBundle(namespace);
-			if (underlyingBundle != null) {
-				Bundle[] hosts = BundleHelper.getDefault().getHosts(underlyingBundle);
-				if (hosts != null)
-					result = RegistryCompatibilityHelper.getPluginDescriptor(hosts[0].getSymbolicName());
-			}
-		}
-
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/ExtensionPointHandle.java b/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/ExtensionPointHandle.java
deleted file mode 100644
index 2487cd2..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/ExtensionPointHandle.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.core.internal.registry;
-
-import org.eclipse.core.runtime.IPluginDescriptor;
-
-/**
- * This class contains only compatibility-specific code.
- * 
- * @deprecated marked as deprecated to supress warnings
- */
-public class ExtensionPointHandle extends BaseExtensionPointHandle {
-
-	static final ExtensionPointHandle[] EMPTY_ARRAY = new ExtensionPointHandle[0];
-
-	public ExtensionPointHandle(IObjectManager objectManager, int id) {
-		super(objectManager, id);
-	}
-
-	public IPluginDescriptor getDeclaringPluginDescriptor() {
-		return RegistryCompatibilityHelper.getPluginDescriptor(getContributor().getName());
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/RegistryCompatibilityHelper.java b/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/RegistryCompatibilityHelper.java
deleted file mode 100644
index 4659556..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/internal/registry/RegistryCompatibilityHelper.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.registry;
-
-import java.lang.reflect.Method;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.osgi.framework.Bundle;
-
-/**
- * This class isolates calls to the backward compatibility layer.
- * It uses reflection so it can be loaded with success even in the absence of
- * the compatibility plugin.
- * 
- * @deprecated Marked as deprecated to suppress deprecation warnings.
- */
-public class RegistryCompatibilityHelper {
-	public static final String PI_RUNTIME_COMPATIBILITY = "org.eclipse.core.runtime.compatibility"; //$NON-NLS-1$
-	private static Bundle compatibility = null;
-
-	public synchronized static Bundle initializeCompatibility() {
-		// if compatibility is stale (has been uninstalled or unresolved) 
-		// then we try to get a new resolved compatibility bundle
-		if (compatibility == null || (compatibility.getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED | Bundle.STOPPING)) != 0) {
-			compatibility = BundleHelper.getDefault().getBundle(PI_RUNTIME_COMPATIBILITY);
-		}
-		return compatibility;
-	}
-
-	public synchronized static IPluginDescriptor getPluginDescriptor(String pluginId) {
-		//Here we use reflection so the runtime code can run without the compatibility
-		initializeCompatibility();
-		if (compatibility == null)
-			throw new IllegalStateException();
-
-		Class oldInternalPlatform = null;
-		try {
-			oldInternalPlatform = compatibility.loadClass("org.eclipse.core.internal.plugins.InternalPlatform"); //$NON-NLS-1$
-			Method getPluginDescriptor = oldInternalPlatform.getMethod("getPluginDescriptor", new Class[] {String.class}); //$NON-NLS-1$
-			return (IPluginDescriptor) getPluginDescriptor.invoke(oldInternalPlatform, new Object[] {pluginId});
-		} catch (Exception e) {
-			//Ignore the exceptions, return null			
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/runtime/IExtension.java b/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/runtime/IExtension.java
deleted file mode 100644
index 4f66c75..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/runtime/IExtension.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-/**
- * An extension declared in a plug-in.
- * All information is obtained from the declaring plug-in's 
- * manifest (<code>plugin.xml</code>) file.
- * <p>
- * These registry objects are intended for relatively short-term use. Clients that 
- * deal with these objects must be aware that they may become invalid if the 
- * declaring plug-in is updated or uninstalled. If this happens, all methods except
- * {@link #isValid()} will throw {@link InvalidRegistryObjectException}.
- * For extension objects, the most common case is code in a plug-in dealing
- * with extensions contributed to one of the extension points it declares.
- * Code in a plug-in that has declared that it is not dynamic aware (or not
- * declared anything) can safely ignore this issue, since the registry
- * would not be modified while it is active. However, code in a plug-in that
- * declares that it is dynamic aware must be careful when accessing the extension
- * objects because they become invalid if the contributing plug-in is removed.
- * Similarly, tools that analyze or display the extension registry are vulnerable.
- * Client code can pre-test for invalid objects by calling {@link #isValid()},
- * which never throws this exception. However, pre-tests are usually not sufficient
- * because of the possibility of the extension object becoming invalid as a
- * result of a concurrent activity. At-risk clients must treat 
- * <code>InvalidRegistryObjectException</code> as if it were a checked exception.
- * Also, such clients should probably register a listener with the extension registry
- * so that they receive notification of any changes to the registry.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- */
-public interface IExtension {
-	/**
-	 * Returns all configuration elements declared by this extension.
-	 * These elements are a direct reflection of the configuration 
-	 * markup supplied in the manifest (<code>plugin.xml</code>)
-	 * file for the plug-in that declares this extension.
-	 * Returns an empty array if this extension does not declare any
-	 * configuration elements.
-	 *
-	 * @return the configuration elements declared by this extension
-	 * @throws InvalidRegistryObjectException if this extension is no longer valid
-	 */
-	public IConfigurationElement[] getConfigurationElements() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the namespace for this extension. This value can be used
-	 * in various global facilities to discover this extension's provider.
-	 * 
-	 * @return the namespace for this extension
-	 * @throws InvalidRegistryObjectException if this extension is no longer valid
-	 * @see IExtensionRegistry
-	 * @since 3.0
-	 * 
-	 * @deprecated As namespace is no longer restricted to the contributor name, 
-	 * use {@link #getNamespaceIdentifier()} to obtain namespace name or {@link #getContributor()}
-	 * to get the name of the contributor of this registry element  
-	 */
-	public String getNamespace() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the namespace name for this extension.
-	 * @return the namespace name for this extension
-	 * @throws InvalidRegistryObjectException if this extension is no longer valid
-	 * @since org.eclipse.equinox.registry 3.2	 
-	 */
-	public String getNamespaceIdentifier() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the contributor of the extension.
-	 * @return the contributor for this extension
-	 * @throws InvalidRegistryObjectException if this extension is no longer valid
-	 * @since org.eclipse.equinox.registry 3.2	 
-	 */
-	public IContributor getContributor() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the unique identifier of the extension point
-	 * to which this extension should be contributed.
-	 *
-	 * @return the unique identifier of the relevant extension point
-	 * @throws InvalidRegistryObjectException if this extension is no longer valid
-	 */
-	public String getExtensionPointUniqueIdentifier() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns a displayable label for this extension.
-	 * Returns the empty string if no label for this extension
-	 * is specified in the plug-in manifest file.
-	 * <p> Note that any translation specified in the plug-in manifest
-	 * file is automatically applied.
-	 * <p>
-	 *
-	 * @return a displayable string label for this extension,
-	 *    possibly the empty string
-	 * @throws InvalidRegistryObjectException if this extension is no longer valid
-	 */
-	public String getLabel() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the simple identifier of this extension, or <code>null</code>
-	 * if this extension does not have an identifier.
-	 * This identifier is specified in the plug-in manifest (<code>plugin.xml</code>) 
-	 * file as a non-empty string containing no period characters 
-	 * (<code>'.'</code>) and must be unique within the defining plug-in.
-	 *
-	 * @return the simple identifier of the extension (e.g. <code>"main"</code>)
-	 *  or <code>null</code>
-	 * @throws InvalidRegistryObjectException if this extension is no longer valid
-	 */
-	public String getSimpleIdentifier() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the unique identifier of this extension, or <code>null</code>
-	 * if this extension does not have an identifier.
-	 * If available, this identifier is unique within the plug-in registry, and
-	 * is composed of the namespace where this extension 
-	 * was declared and this extension's simple identifier.
-	 *
-	 * @return the unique identifier of the extension
-	 *    (e.g. <code>"com.example.acme.main"</code>), or <code>null</code>
-	 * @throws InvalidRegistryObjectException if this extension is no longer valid
-	 */
-	public String getUniqueIdentifier() throws InvalidRegistryObjectException;
-
-	/* (non-javadoc) 
-	 * @see Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object o);
-
-	/**
-	 * Returns whether this extension object is valid.
-	 * 
-	 * @return <code>true</code> if the object is valid, and <code>false</code>
-	 * if it is no longer valid
-	 * @since 3.1
-	 */
-	public boolean isValid();
-
-	/**
-	 * Returns the descriptor of the plug-in that declares this extension.
-	 * 
-	 * @return the plug-in that declares this extension
-	 * @throws InvalidRegistryObjectException if this extension is no longer valid
-	 * @deprecated IPluginDescriptor is not part of the new runtime and its function
-	 * has been split over several parts of the new runtime.  This method
-	 * is not available (returns <tt>null</tt>) if the compatibility layer is not installed.  Use getNamespace()
-	 * to get the symbolic id of the declaring plugin.  See {@link IPluginDescriptor} to see how to 
-	 * update your use-cases.
-	 */
-	public IPluginDescriptor getDeclaringPluginDescriptor() throws InvalidRegistryObjectException;
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/runtime/IExtensionPoint.java b/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/runtime/IExtensionPoint.java
deleted file mode 100644
index e773ec0..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility.registry/src/org/eclipse/core/runtime/IExtensionPoint.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-/**
- * An extension point declared in a plug-in.
- * Except for the list of extensions plugged in to it, the information 
- * available for an extension point is obtained from the declaring plug-in's 
- * manifest (<code>plugin.xml</code>) file.
- * <p>
- * These registry objects are intended for relatively short-term use. Clients that 
- * deal with these objects must be aware that they may become invalid if the 
- * declaring plug-in is updated or uninstalled. If this happens, all methods except
- * {@link #isValid()} will throw {@link InvalidRegistryObjectException}.
- * For extension point objects, the most common case is code in a plug-in dealing
- * with one of the extension points it declares. These extension point objects are
- * guaranteed to be valid while the plug-in is active. Code in a plug-in that has
- * declared that it is not dynamic aware (or not declared anything) can also safely
- * ignore this issue, since the registry would not be modified while it is
- * active. However, code in a plug-in that declares that it is dynamic aware
- * must be careful if it access the extension point object of a different plug-in,
- * because it's at risk if that other plug-in is removed. Similarly,
- * tools that analyze or display the extension registry are vulnerable.
- * Client code can pre-test for invalid objects by calling {@link #isValid()},
- * which never throws this exception. However, pre-tests are usually not sufficient
- * because of the possibility of the extension point object becoming invalid as a
- * result of a concurrent activity. At-risk clients must treat 
- * <code>InvalidRegistryObjectException</code> as if it were a checked exception.
- * Also, such clients should probably register a listener with the extension registry
- * so that they receive notification of any changes to the registry.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- */
-public interface IExtensionPoint {
-	/**
-	 * Returns all configuration elements from all extensions configured
-	 * into this extension point. Returns an empty array if this extension 
-	 * point has no extensions configured, or none of the extensions 
-	 * contain configuration elements.
-	 *
-	 * @return the configuration elements for all extension configured 
-	 *   into this extension point
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 */
-	public IConfigurationElement[] getConfigurationElements() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the namespace for this extension point. This value can be used
-	 * in various global facilities to discover this extension point's provider.
-	 * 
-	 * @return the namespace for this extension point
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 * @see IExtensionRegistry
-	 * @since 3.0
-	 * 
-	 * @deprecated As namespace is no longer restricted to the contributor name, 
-	 * use {@link #getNamespaceIdentifier()} to obtain namespace name or {@link #getContributor()}
-	 * to get the name of the contributor of this registry element  
-	 */
-	public String getNamespace() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the namespace name for this extension point.
-	 * @return the namespace name for this extension point
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 * @since org.eclipse.equinox.registry 3.2	 
-	 */
-	public String getNamespaceIdentifier() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the contributor of the extension point.
-	 * @return the contributor for this extension point
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 * @since org.eclipse.equinox.registry 3.2	 
-	 */
-	public IContributor getContributor() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the extension with the given unique identifier configured into
-	 * this extension point, or <code>null</code> if there is no such extension.
-	 * Since an extension might not have an identifier, some extensions
-	 * can only be found via the <code>getExtensions</code> method.
-	 *
-	 * @param extensionId the unique identifier of an extension 
-	 *		(e.g. <code>"com.example.acme.main"</code>).
-	 * @return an extension, or <code>null</code>
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 */
-	public IExtension getExtension(String extensionId) throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns all extensions configured into this extension point.
-	 * Returns an empty array if this extension point has no extensions.
-	 *
-	 * @return the extensions configured into this extension point
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 */
-	public IExtension[] getExtensions() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns a displayable label for this extension point.
-	 * Returns the empty string if no label for this extension point
-	 * is specified in the plug-in manifest file.
-	 * <p> Note that any translation specified in the plug-in manifest
-	 * file is automatically applied.
-	 * </p>
-	 *
-	 * @return a displayable string label for this extension point,
-	 *    possibly the empty string
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 */
-	public String getLabel() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns reference to the extension point schema. The schema 
-	 * reference is returned as a URL path relative to the plug-in 
-	 * installation URL. 
-	 * Returns the empty string if no schema for this extension point
-	 * is specified in the plug-in manifest file.
-	 *
-	 * @return a relative URL path, or an empty string
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 */
-	public String getSchemaReference() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the simple identifier of this extension point.
-	 * This identifier is a non-empty string containing no
-	 * period characters (<code>'.'</code>) and is guaranteed
-	 * to be unique within the defining plug-in.
-	 *
-	 * @return the simple identifier of the extension point (e.g. <code>"builders"</code>)
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 */
-	public String getSimpleIdentifier() throws InvalidRegistryObjectException;
-
-	/**
-	 * Returns the unique identifier of this extension point.
-	 * This identifier is unique within the plug-in registry, and
-	 * is composed of the namespace for this extension point 
-	 * and this extension point's simple identifier.
-	 * 
-	 *
-	 * @return the unique identifier of the extension point
-	 *    (e.g. <code>"org.eclipse.core.resources.builders"</code>)
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 */
-	public String getUniqueIdentifier() throws InvalidRegistryObjectException;
-
-	/* (non-javadoc) 
-	 * @see Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object o);
-
-	/**
-	 * Returns whether this extension point object is valid.
-	 * 
-	 * @return <code>true</code> if the object is valid, and <code>false</code>
-	 * if it is no longer valid
-	 * @since 3.1
-	 */
-	public boolean isValid();
-
-	/** 
-	 * Returns the descriptor of the plug-in that declares this extension point.
-	 *
-	 * @return the plug-in that declares this extension point
-	 * @throws InvalidRegistryObjectException if this extension point is no longer valid
-	 * @deprecated IPluginDescriptor is not part of the new runtime and its function
-	 * has been split over several parts of the new runtime.  This method
-	 * is not available (returns null) if the compatibility layer is not installed.  Use getNamespace()
-	 * to get the symbolic id of the declaring plugin.  See {@link IPluginDescriptor} to see how to 
-	 * update your use-cases.
-	 */
-	public IPluginDescriptor getDeclaringPluginDescriptor() throws InvalidRegistryObjectException;
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/.classpath b/bundles/org.eclipse.core.runtime.compatibility/.classpath
deleted file mode 100644
index d943280..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src-boot"/>
-	<classpathentry kind="src" path="src-runtime"/>
-	<classpathentry kind="src" path="src-model"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.runtime.compatibility/.cvsignore b/bundles/org.eclipse.core.runtime.compatibility/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.core.runtime.compatibility/.project b/bundles/org.eclipse.core.runtime.compatibility/.project
deleted file mode 100644
index da2c9ec..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.runtime.compatibility</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.osgi</project>
-		<project>org.eclipse.osgi.services</project>
-		<project>org.eclipse.osgi.util</project>
-		<project>org.eclipse.update.configurator</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.runtime.compatibility/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.core.runtime.compatibility/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 88ba90c..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue May 25 14:58:59 EDT 2004
-encoding/<project>=ISO-8859-1
-eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.core.runtime.compatibility/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.core.runtime.compatibility/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index e1295a2..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Fri May 20 10:27:39 EDT 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=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=1000
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-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=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=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=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=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.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.core.runtime.compatibility/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.core.runtime.compatibility/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 4028afc..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jan 06 16:48:21 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="New classes and interfaces" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2006 IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n *******************************************************************************/\r\n${package_declaration}\r\n\r\n/**\r\n * \r\n */\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block&\#13;\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.core.runtime.compatibility/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.runtime.compatibility/META-INF/MANIFEST.MF
deleted file mode 100644
index 9af8257..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-Version: 3.1.0.qualifier
-Bundle-SymbolicName: org.eclipse.core.runtime.compatibility; singleton:=true
-Bundle-Vendor: %providerName
-Bundle-Activator: org.eclipse.core.internal.plugins.CompatibilityActivator
-Bundle-Localization: plugin
-Export-Package: org.eclipse.core.boot,
- org.eclipse.core.internal.boot;x-internal:=true,
- org.eclipse.core.internal.compatibility;x-internal:=true,
- org.eclipse.core.internal.model;x-internal:=true,
- org.eclipse.core.internal.plugins;x-internal:=true,
- org.eclipse.core.runtime.model
-Require-Bundle: 
- org.eclipse.core.runtime; visibility:=reexport,
- org.eclipse.update.configurator; visibility:=reexport
-Eclipse-AutoStart: true
diff --git a/bundles/org.eclipse.core.runtime.compatibility/about.html b/bundles/org.eclipse.core.runtime.compatibility/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.runtime.compatibility/build.properties b/bundles/org.eclipse.core.runtime.compatibility/build.properties
deleted file mode 100644
index ccca7de..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .,\
-	META-INF/,\
-	plugin.properties,\
-	about.html
-source.. = src-runtime/, src-boot/, src-model/
-src.includes=about.html
-extra.compatibility.jar = ../org.eclipse.update.configurator/configurator.jar
-extra.prerequisites = org.eclipse.update.configurator
diff --git a/bundles/org.eclipse.core.runtime.compatibility/plugin.properties b/bundles/org.eclipse.core.runtime.compatibility/plugin.properties
deleted file mode 100644
index 47e481b..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.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 Runtime Plug-in Compatibility
-providerName = Eclipse.org
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/boot/BootLoader.java b/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/boot/BootLoader.java
deleted file mode 100644
index 74eb8f4..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/boot/BootLoader.java
+++ /dev/null
@@ -1,651 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.boot;
-
-import java.io.IOException;
-import java.net.URL;
-import org.eclipse.core.internal.boot.PlatformConfiguration;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.update.configurator.IPlatformConfiguration;
-import org.eclipse.update.configurator.IPlatformConfigurationFactory;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Special boot loader class for the Eclipse Platform. This class cannot
- * be instantiated; all functionality is provided by static methods.
- * <p>
- * The Eclipse Platform makes heavy use of Java class loaders for
- * loading plug-ins. Even the Platform Core Runtime itself, including
- * the <code>Platform</code> class, needs to be loaded by a special 
- * class loader. The upshot is that a client program (such as a Java main
- * program, a servlet) cannot directly reference even the 
- * <code>Platform</code> class. Instead, a client must use this
- * loader class for initializing the platform, invoking functionality
- * defined in plug-ins, and shutting down the platform when done.
- * </p>
- * 
- * @see Platform
- * @deprecated 
- * In Eclipse 3.0 the runtime has been refactored such that the <code>BootLoader</code>
- * class is no longer relevant.  Most of the function found on <code>BootLoader</code> is
- * however still supported and has been relocated described in the method comments.
- * <p>
- * This interface must only be used by plug-ins 
- * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
- * </p>
- */
-public final class BootLoader {
-
-	/**
-	 * Controls the debug of platform configuration.
-	 */
-	public static boolean CONFIGURATION_DEBUG = false;
-
-	/**
-	 * The unique identifier constant (value "<code>org.eclipse.core.boot</code>")
-	 * of the Core Boot (pseudo-) plug-in.
-	 */
-	public static final String PI_BOOT = "org.eclipse.core.boot"; //$NON-NLS-1$
-
-	/**
-	 * Constant string (value "win32") indicating the platform is running on a
-	 * Window 32-bit operating system (e.g., Windows 98, NT, 2000).
-	 * @deprecated Replaced by {@link Platform#OS_WIN32}.
-	 */
-	public static final String OS_WIN32 = "win32";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "linux") indicating the platform is running on a
-	 * Linux-based operating system.
-	 * @deprecated Replaced by {@link Platform#OS_LINUX}.
-	 */
-	public static final String OS_LINUX = "linux";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "aix") indicating the platform is running on an
-	 * AIX-based operating system.
-	 * @deprecated Replaced by {@link Platform#OS_AIX}.
-	 */
-	public static final String OS_AIX = "aix";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "solaris") indicating the platform is running on a
-	 * Solaris-based operating system.
-	 * @deprecated Replaced by {@link Platform#OS_SOLARIS}.
-	 */
-	public static final String OS_SOLARIS = "solaris";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "hpux") indicating the platform is running on an
-	 * HP/UX-based operating system.
-	 * @deprecated Replaced by {@link Platform#OS_HPUX}.
-	 */
-	public static final String OS_HPUX = "hpux";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "qnx") indicating the platform is running on a
-	 * QNX-based operating system.
-	 * @deprecated Replaced by {@link Platform#OS_QNX}.
-	 */
-	public static final String OS_QNX = "qnx";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "macosx") indicating the platform is running on a
-	 * Mac OS X operating system.
-	 * @since 2.0
-	 * @deprecated Replaced by {@link Platform#OS_MACOSX}.
-	 */
-	public static final String OS_MACOSX = "macosx";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "unknown") indicating the platform is running on a
-	 * machine running an unknown operating system.
-	 * @deprecated Replaced by {@link Platform#OS_UNKNOWN}.
-	 */
-	public static final String OS_UNKNOWN = "unknown";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "x86") indicating the platform is running on an
-	 * x86-based architecture.
-	 * @deprecated Replaced by {@link Platform#ARCH_X86}.
-	 */
-	public static final String ARCH_X86 = "x86";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "PA_RISC") indicating the platform is running on an
-	 * PA_RISC-based architecture.
-	 * @deprecated Replaced by {@link Platform#ARCH_PA_RISC}.
-	 */
-	public static final String ARCH_PA_RISC = "PA_RISC";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "ppc") indicating the platform is running on an
-	 * PowerPC-based architecture.
-	 * @since 2.0
-	 * @deprecated Replaced by {@link Platform#ARCH_PPC}.
-	 */
-	public static final String ARCH_PPC = "ppc";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "sparc") indicating the platform is running on an
-	 * Sparc-based architecture.
-	 * @since 2.0
-	 * @deprecated Replaced by {@link Platform#ARCH_SPARC}.
-	 */
-	public static final String ARCH_SPARC = "sparc";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "win32") indicating the platform is running on a
-	 * machine using the Windows windowing system.
-	 * @deprecated Replaced by {@link Platform#WS_WIN32}.
-	 */
-	public static final String WS_WIN32 = "win32";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "motif") indicating the platform is running on a
-	 * machine using the Motif windowing system.
-	 * @deprecated Replaced by {@link Platform#WS_MOTIF}.
-	 */
-	public static final String WS_MOTIF = "motif";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "gtk") indicating the platform is running on a
-	 * machine using the GTK windowing system.
-	 * @deprecated Replaced by {@link Platform#WS_GTK}.
-	 */
-	public static final String WS_GTK = "gtk";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "photon") indicating the platform is running on a
-	 * machine using the Photon windowing system.
-	 * @deprecated Replaced by {@link Platform#WS_PHOTON}.
-	 */
-	public static final String WS_PHOTON = "photon";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "carbon") indicating the platform is running on a
-	 * machine using the Carbon windowing system (Mac OS X).
-	 * @since 2.0
-	 * @deprecated Replaced by {@link Platform#WS_CARBON}.
-	 */
-	public static final String WS_CARBON = "carbon";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "unknown") indicating the platform is running on a
-	 * machine running an unknown windowing system.
-	 * @deprecated Replaced by {@link Platform#WS_UNKNOWN}.
-	 */
-	public static final String WS_UNKNOWN = "unknown";//$NON-NLS-1$
-
-	/**
-	 * Private constructor to block instance creation.
-	 */
-	private BootLoader() {
-		// not allowed
-	}
-
-	/**
-	 * Returns the command line args provided to the platform when it was first run.
-	 * Note that individual platform runnables may be provided with different arguments
-	 * if they are being run individually rather than with <code>Platform.run()</code>.
-	 * 
-	 * @return the command line used to start the platform
-	 * @deprecated Replaced by {@link Platform#getCommandLineArgs()}.
-	 */
-	public static String[] getCommandLineArgs() {
-		return InternalPlatform.getDefault().getApplicationArgs();
-	}
-
-	/**
-	 * Returns the current platform configuration.
-	 * 
-	 * @return platform configuration used in current instance of platform
-	 * @since 2.0
-	 * @deprecated This functionality has moved to the Eclipse Update manager plug-in.
-	 */
-	public static org.eclipse.core.boot.IPlatformConfiguration getCurrentPlatformConfiguration() {
-		BundleContext context = InternalPlatform.getDefault().getBundleContext();
-		// acquire factory service first
-		ServiceReference configFactorySR = context.getServiceReference(IPlatformConfigurationFactory.class.getName());
-		if (configFactorySR == null)
-			throw new IllegalStateException();
-		IPlatformConfigurationFactory configFactory = (IPlatformConfigurationFactory) context.getService(configFactorySR);
-		if (configFactory == null)
-			throw new IllegalStateException();
-		// get the configuration using the factory
-		IPlatformConfiguration currentConfig = configFactory.getCurrentPlatformConfiguration();
-		context.ungetService(configFactorySR);
-		return new PlatformConfiguration(currentConfig);
-	}
-
-	/**
-	 * Returns URL at which the Platform runtime executables and libraries are installed.
-	 * The returned value is distinct from the location of any given platform's data.
-	 *
-	 * @return the URL indicating where the platform runtime is installed.
-	 * @deprecated Use <code>Platform.getInstallLocation().getURL()</code>
-	 */
-	public static URL getInstallURL() {
-		return InternalPlatform.getDefault().getInstallURL();
-	}
-
-	/**
-	 * Returns the string name of the current locale for use in finding files
-	 * whose path starts with <code>$nl$</code>.
-	 *
-	 * @return the string name of the current locale
-	 * @deprecated Replaced by {@link Platform#getNL()}.
-	 */
-	public static String getNL() {
-		return InternalPlatform.getDefault().getNL();
-	}
-
-	/**
-	 * Returns the string name of the current operating system for use in finding
-	 * files whose path starts with <code>$os$</code>.  <code>OS_UNKNOWN</code> is
-	 * returned if the operating system cannot be determined.  
-	 * The value may indicate one of the operating systems known to the platform
-	 * (as specified in <code>knownOSValues</code>) or a user-defined string if
-	 * the operating system name is specified on the command line.
-	 *
-	 * @return the string name of the current operating system
-	 * @see #knownOSValues
-	 * @deprecated Replaced by {@link Platform#getOS()}.
-	 */
-	public static String getOS() {
-		return InternalPlatform.getDefault().getOS();
-	}
-
-	/**
-	 * Returns the string name of the current system architecture.  
-	 * The value is a user-defined string if the architecture is 
-	 * specified on the command line, otherwise it is the value 
-	 * returned by <code>java.lang.System.getProperty("os.arch")</code>.
-	 * 
-	 * @return the string name of the current system architecture
-	 * @since 2.0
-	 * @deprecated Replaced by {@link Platform#getOSArch()}.
-	 */
-	public static String getOSArch() {
-		return InternalPlatform.getDefault().getOSArch();
-	}
-
-	/**
-	 * Returns a platform configuration object, optionally initialized with previously saved
-	 * configuration information.
-	 * 
-	 * @param url location of previously save configuration information. If <code>null</code>
-	 * is specified, an empty configuration object is returned
-	 * @return platform configuration used in current instance of platform
-	 * @exception IOException if the configuration cannot be read
-	 * @since 2.0
-	 * @deprecated This functionality has moved to the Eclipse Update manager plug-in.
-	 */
-	public static org.eclipse.core.boot.IPlatformConfiguration getPlatformConfiguration(URL url) throws IOException {
-		BundleContext context = InternalPlatform.getDefault().getBundleContext();
-		// acquire factory service first
-		ServiceReference configFactorySR = context.getServiceReference(IPlatformConfigurationFactory.class.getName());
-		if (configFactorySR == null)
-			throw new IllegalStateException();
-		IPlatformConfigurationFactory configFactory = (IPlatformConfigurationFactory) context.getService(configFactorySR);
-		if (configFactory == null)
-			throw new IllegalStateException();
-		// get the configuration using the factory
-		IPlatformConfiguration config = configFactory.getPlatformConfiguration(url);
-		context.ungetService(configFactorySR);
-		return new PlatformConfiguration(config);
-	}
-
-	/**
-	 * Returns the string name of the current window system for use in finding files
-	 * whose path starts with <code>$ws$</code>.  <code>null</code> is returned
-	 * if the window system cannot be determined.
-	 *
-	 * @return the string name of the current window system or <code>null</code>
-	 * @deprecated Replaced by {@link Platform#getWS()}.
-	 */
-	public static String getWS() {
-		return InternalPlatform.getDefault().getWS();
-	}
-
-	/**
-	 * Returns a list of known system architectures.
-	 * <p>
-	 * Note that this list is not authoritative; there may be legal values
-	 * not included in this list. Indeed, the value returned by 
-	 * <code>getOSArch</code> may not be in this list. Also, this list may 
-	 * change over time as Eclipse comes to run on more operating environments.
-	 * </p>
-	 * 
-	 * @return the list of system architectures known to the system
-	 * @see #getOSArch()
-	 * @since 2.0
-	 * @deprecated Replaced by {@link Platform#knownOSArchValues()}.
-	 */
-	public static String[] knownOSArchValues() {
-		return Platform.knownOSArchValues();
-	}
-
-	/**
-	 * Returns a list of known operating system names.
-	 * <p>
-	 * Note that this list is not authoritative; there may be legal values
-	 * not included in this list. Indeed, the value returned by 
-	 * <code>getOS</code> may not be in this list. Also, this list may 
-	 * change over time as Eclipse comes to run on more operating environments.
-	 * </p>
-	 * 
-	 * @return the list of operating systems known to the system
-	 * @see #getOS()
-	 * @since 2.0
-	 * @deprecated Replaced by {@link Platform#knownOSValues()}.
-	 */
-	public static String[] knownOSValues() {
-		return Platform.knownOSValues();
-	}
-
-	/**
-	 * Returns a list of known windowing system names.
-	 * <p>
-	 * Note that this list is not authoritative; there may be legal values
-	 * not included in this list. Indeed, the value returned by 
-	 * <code>getWS</code> may not be in this list. Also, this list may 
-	 * change over time as Eclipse comes to run on more operating environments.
-	 * </p>
-	 * 
-	 * @return the list of window systems known to the system
-	 * @see #getWS()
-	 * @since 2.0
-	 * @deprecated Replaced by {@link Platform#knownWSValues()}.
-	 */
-	public static String[] knownWSValues() {
-		return Platform.knownWSValues();
-	}
-
-	/**
-	 * Returns <code>true</code> if the platform is currently running in 
-	 * debug mode.  The platform is run
-	 * in debug mode using the "-debug" command line argument.
-	 *
-	 * @return whether or not the platform is running in debug mode
-	 * @deprecated Replaced by {@link Platform#inDebugMode()}.
-	 */
-	public static boolean inDebugMode() {
-		return Platform.inDebugMode();
-	}
-
-	/**
-	 * Returns <code>true</code> if the platform is currently running in 
-	 * development mode.  That is, if special procedures are to be 
-	 * taken when defining plug-in class paths.  The platform is run
-	 * in development mode using the "-dev" command line argument.
-	 *
-	 * @return whether or not the platform is running in development mode
-	 * @deprecated Replaced by {@link Platform#inDevelopmentMode()}.
-	 */
-	public static boolean inDevelopmentMode() {
-		return Platform.inDevelopmentMode();
-	}
-
-	/**
-	 * Returns whether the platform is running.
-	 *
-	 * @return <code>true</code> if the platform is running, 
-	 *		and <code>false</code> otherwise
-	 * @deprecated Replaced by {@link Platform#isRunning()}.
-	 */
-	public static boolean isRunning() {
-		return InternalPlatform.getDefault().isRunning();
-	}
-
-	/**
-	 * Returns the complete plugin path defined by the file at the given location.
-	 * If the given location is <code>null</code> or does not indicate a valid 
-	 * plug-in path definition file, <code>null</code> is returned.
-	 *
-	 * @param pluginPathLocation the location of the plug-in path to load
-	 * @return the complete set of URLs which locate plug-ins
-	 * @deprecated This functionality has moved to the Eclipse Update manager plug-in.
-	 */
-	public static URL[] getPluginPath(URL pluginPathLocation) {
-		return InternalPlatform.getDefault().getPluginPath(pluginPathLocation);
-	}
-
-	/**
-	 * Returns whether the given location (typically a directory in the
-	 * local file system) contains the saved data for a platform. The
-	 * saved data for the platform is recognizable by the presence of
-	 * a special platform metadata subdirectory; however, this metadata
-	 * directory is not usually created unless there is some reason to do so
-	 * (for example, so that an active plug-in can save its state).
-	 *
-	 * @return <code>true</code> if the location contains the 
-	 *		saved data for a platform, and <code>false</code> otherwise
-	 * @deprecated In Eclipse 3.0 this method is no longer supported.
-	 * The implementation always returns <code>true</code>.
-	 */
-	public static boolean containsSavedPlatform(String location) {
-		return true;
-	}
-
-	/**
-	 * Instantiates and returns an instance of the named application's 
-	 * runnable entry point.
-	 * <code>null</code> is returned if the runnable cannot be found.
-	 *
-	 * @param applicationName the fully qualified name of an 
-	 * 		extension installed in the platform's <code>applications</code> 
-	 *		extension point (i.e., <code>org.eclipse.core.applications</code>).
-	 * @return a platform runnable
-	 * @exception Exception if there is a problem instantiating the specified runnable
-	 * @deprecated In Eclipse 3.0 this method is no longer supported.
-	 * The implementation always returns <code>null</code>.  See the related but 
-	 * non-API methods on <code>org.eclipse.core.runtime.adaptor.EclipseStarter</code>
-	 * in the org.eclipse.osgi plug-in.
-	 */
-	public static IPlatformRunnable getRunnable(String applicationName) throws Exception {
-		return null;
-	}
-	/**
-	 * Instantiates and returns an instance of the named class.  The class
-	 * must implement <code>IPlatformRunnable</code>.
-	 * If the class implements <code>IExecutableExtension</code>, the created
-	 * instance is initialized with the given arguments.
-	 * <code>null</code> is returned if the runnable cannot be found.
-	 *
-	 * @param pluginId the unique identifier of the plug-in containing the given class
-	 * @param className the fully qualified name of the class to instantiate
-	 * @param args the initialization arguments passed to the new instance
-	 * @return a platform runnable, or <code>null</code> if the runnable cannot
-	 *    be found
-	 * @exception Exception if there is a problem instantiating the specified runnable
-	 * @deprecated In Eclipse 3.0 this method is no longer supported.
-	 * The implementation always returns <code>null</code>.  See the related but 
-	 * non-API methods on <code>org.eclipse.core.runtime.adaptor.EclipseStarter</code>
-	 * in the org.eclipse.osgi plug-in.
-	 */
-	public static IPlatformRunnable getRunnable(String pluginId, String className, Object args) throws Exception {
-		return null;
-	}
-
-	/**
-	 * Launches the Platform to run a single application. 
-	 * This convenince method starts up the Platform,
-	 * runs the indicated application, and then shuts down
-	 * the Platform. The Platform must not be running already.
-	 *
-	 * @param applicationName The fully qualified name of an 
-	 * 		extension installed in the Platform plug-in's <code>applications</code> 
-	 *		extension-point (i.e., <code>org.eclipse.core.runtime.applications</code>).
-	 * @param pluginPathLocation the URL of the plug-in path; this is where
-	 *		the Platform is to find the code for plug-ins
-	 * @param location the location (usually a string path in the local file
-	 *		file system) for the saved platform state
-	 * @param args the array of command-line style argments which are passed
-	 *		to the Platform on initialization.  The arguments which are consumed by the
-	 * 		Platform's initialization are removed from the arg list.  This modified arg list is
-	 *		the return value of this method.  
-	 *@return the list of <code>args</code> which were supplied but not consumed
-	 *		by this method.  
-	 * @return the result, or <code>null</code> if none
-	 * @exception Exception if anything goes wrong
-	 * @see #startup
-	 * @deprecated In Eclipse 3.0 this method is no longer supported.
-	 * The implementation always returns <code>null</code>.  See the related but 
-	 * non-API methods on <code>org.eclipse.core.runtime.adaptor.EclipseStarter</code>
-	 * in the org.eclipse.osgi plug-in.
-	 */
-	public static Object run(String applicationName, URL pluginPathLocation, String location, String[] args) throws Exception {
-		return null;
-	}
-	/**
-	 * Launches the Platform to run a single application. 
-	 * This convenince method starts up the Platform,
-	 * runs the indicated application, and then shuts down
-	 * the Platform. The Platform must not be running already.
-	 *
-	 * @param applicationName The fully qualified name of an 
-	 * 		extension installed in the Platform plug-in's <code>applications</code> 
-	 *		extension-point (i.e., <code>org.eclipse.core.runtime.applications</code>).
-	 * @param pluginPathLocation the URL of the plug-in path; this is where
-	 *		the Platform is to find the code for plug-ins
-	 * @param location the location (usually a string path in the local file
-	 *		file system) for the saved platform state
-	 * @param args the array of command-line style argments which are passed
-	 *		to the Platform on initialization.  The arguments which are consumed by the
-	 * 		Platform's initialization are removed from the arg list.  This modified arg list is
-	 *		the return value of this method.
-	 * @param handler an optional handler invoked by the launched application
-	 *      at the point the application considers itself initialized. A typical
-	 *      use for the handler would be to take down any splash screen
-	 *      that was displayed by the caller of this method.
-	 *@return the list of <code>args</code> which were supplied but not consumed
-	 *		by this method.  
-	 * @return the result, or <code>null</code> if none
-	 * @exception Exception if anything goes wrong
-	 * @see #startup
-	 * @deprecated In Eclipse 3.0 this method is no longer supported.
-	 * The implementation always returns <code>null</code>.  See the related but 
-	 * non-API methods on <code>org.eclipse.core.runtime.adaptor.EclipseStarter</code>
-	 * in the org.eclipse.osgi plug-in.
-	 */
-	public static Object run(String applicationName, URL pluginPathLocation, String location, String[] args, Runnable handler) throws Exception {
-		return null;
-	}
-	/**
-	 * Shuts down the Platform. The Platform must be running. In the process,
-	 * each active plug-in is told to shutdown via <code>Plugin.shutdown</code>.
-	 * <p>
-	 * Note that the state of the Platform is not automatically saved
-	 * before shutting down.
-	 * </p>
-	 * <p>
-	 * On return, the Platform will no longer be running (but could
-	 * be re-launched with another call to <code>startup</code>). 
-	 * Any objects handed out by running Platform, including
-	 * Platform runnables obtained via <code>getRunnable</code>,
-	 * will be permanently invalid. The effects of attempting to invoke
-	 * methods on invalid objects is undefined.
-	 * </p>
-	 * @exception Exception if there were problems shutting down
-	 * @deprecated In Eclipse 3.0 this method is no longer supported.
-	 * The implementation does nothing.  See the related but 
-	 * non-API methods on <code>org.eclipse.core.runtime.adaptor.EclipseStarter</code>
-	 * in the org.eclipse.osgi plug-in.
-	 */
-	public static void shutdown() throws Exception {
-	}
-	/**
-	 * Launches the Eclipse Platform. The Platform must not be running.
-	 * <p>
-	 * The location of the started Platform is defined as follows:
-	 * <ul>
-	 * <li>If the <code>location</code> argument is specified, that value is used.  
-	 * <li>If <code>location</code> is <code>null</code> but <code>args</code> 
-	 *		contains a <code>-data&ltlocation&gt</code> pair, then the given value is used.  
-	 * <li> If neither is specified, <code>System.getProperty("user.dir")</code> is used.
-	 * </ul>
-	 * The plug-in path of the started Platform is defined as follows:
-	 * <ul>
-	 * <li>If the <code>pluginPathLocation</code> argument is specified, that value is tried.
-	 * <li>If <code>pluginPathLocation</code> is <code>null</code> but <code>args</code> 
-	 *		contains a <code>-plugins &ltlocation&gt</code> pair, then the given value is tried.  
-	 * <li>If neither value is specified or a given location does not exist, 
-	 * 		the Platform's location is searched.  
-	 * <li>Finally, the default plug-in path is used.  This value identifies the plug-ins in the 
-	 *		Platform's install location.
-	 * </ul>
-	 * @param pluginPathLocation the URL of the plug-in path; this is where
-	 *		the Platform is to find the code for plug-ins
-	 * @param location the location (usually a string path in the local file
-	 *		file system) for the saved Platform state
-	 * @param args the array of command-line style argments which are passed
-	 *		to the platform on initialization.  The arguments which are consumed by the
-	 * 		Platform's initialization are removed from the arg list.  This modified arg list is
-	 *		the return value of this method.  
-	 *	@return the list of <code>args</code> which were supplied but not consumed
-	 *		by this method.  
-	 * @exception Exception if there are problems starting the platform
-	 * @deprecated In Eclipse 3.0 this method is no longer supported.
-	 * The implementation always returns <code>null</code>.  See the related but 
-	 * non-API methods on <code>org.eclipse.core.runtime.adaptor.EclipseStarter</code>
-	 * in the org.eclipse.osgi plug-in.
-	 */
-	public static String[] startup(URL pluginPathLocation, String location, String[] args) throws Exception {
-		return null;
-	}
-	/**
-	 * Launches the Eclipse Platform. The Platform must not be running.
-	 * <p>
-	 * The location of the started Platform is defined as follows:
-	 * <ul>
-	 * <li>If the <code>location</code> argument is specified, that value is used.  
-	 * <li>If <code>location</code> is <code>null</code> but <code>args</code> 
-	 *		contains a <code>-data &ltlocation&gt</code> pair, then the given value is used.  
-	 * <li> If neither is specified, <code>System.getProperty("user.dir")</code> is used.
-	 * </ul>
-	 * The plug-in path of the started Platform is defined as follows:
-	 * <ul>
-	 * <li>If the <code>pluginPathLocation</code> argument is specified, that value is tried.
-	 * <li>If <code>pluginPathLocation</code> is <code>null</code> but <code>args</code> 
-	 *		contains a <code>-plugins &ltlocation&gt</code> pair, then the given value is tried.  
-	 * <li>If neither value is specified or a given location does not exist, 
-	 * 		the Platform's location is searched.  
-	 * <li>Finally, the default plug-in path is used.  This value identifies the plug-ins in the 
-	 *		Platform's install location.
-	 * </ul>
-	 * @param pluginPathLocation the URL of the plug-in path; this is where
-	 *		the Platform is to find the code for plug-ins
-	 * @param location the location (usually a string path in the local file
-	 *		file system) for the saved Platform state
-	 * @param args the array of command-line style argments which are passed
-	 *		to the platform on initialization.  The arguments which are consumed by the
-	 * 		Platform's initialization are removed from the arg list.  This modified arg list is
-	 *		the return value of this method. 
-	 * @param handler an optional handler invoked by the launched application
-	 *      at the point the application considers itself initialized. A typical
-	 *      use for the handler would be to take down any splash screen
-	 *      that was displayed by the caller of this method. 
-	 *	@return the list of <code>args</code> which were supplied but not consumed
-	 *		by this method.  
-	 * @exception Exception if there are problems starting the platform
-	 * @deprecated In Eclipse 3.0 this method is no longer supported.
-	 * The implementation always returns <code>null</code>.  See the related but 
-	 * non-API methods on <code>org.eclipse.core.runtime.adaptor.EclipseStarter</code>
-	 * in the org.eclipse.osgi plug-in.
-	 */
-	public static String[] startup(URL pluginPathLocation, String location, String[] args, Runnable handler) throws Exception {
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/boot/IPlatformConfiguration.java b/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/boot/IPlatformConfiguration.java
deleted file mode 100644
index c85359e..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/boot/IPlatformConfiguration.java
+++ /dev/null
@@ -1,575 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.boot;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * Platform configuration interface. Represents the runtime
- * configuration used by the Eclipse platform. Any configuration
- * changes do not take effect until next startup of the Eclipse
- * platform
- * 
- * @since 2.0
- * @deprecated 
- * In Eclipse 3.0 the Update mechanism was cleanly separated from the runtime.
- * <code>IPlatformConfiguration</code> is part of the Update story and as such has
- * been moved to {@link org.eclipse.update.configurator.IPlatformConfiguration} in the 
- * <code>org.eclipse.update.configurator</code> plug-in.
- * <p>
- * This interface must only be used by plug-ins 
- * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
- * </p>
- */
-public interface IPlatformConfiguration {
-
-	/**
-	 * Configuration entry representing an install site.
-	 * 
-	 * @since 2.0 
-	 */
-	public interface ISiteEntry {
-
-		/**
-		 * Returns the URL for this site
-		 * 
-		 * @return site url
-		 * @since 2.0
-		 */
-		public URL getURL();
-
-		/**
-		 * Returns the policy for this site
-		 * 
-		 * @return site policy
-		 * @since 2.0
-		 */
-		public ISitePolicy getSitePolicy();
-
-		/**
-		 * Sets the site policy
-		 * 
-		 * @param policy site policy
-		 * @since 2.0
-		 */
-		public void setSitePolicy(ISitePolicy policy);
-
-		/**
-		 * Returns a list of features visible on the site. Note, that this is simply a 
-		 * reflection of the site content. The features may or may not be actually configured.
-		 * 
-		 * @return an array of feature entries, or an empty array if no features are found.
-		 * A feature entry is returned as a path relative to the site URL
-		 * @since 2.0
-		 */
-		public String[] getFeatures();
-
-		/**
-		 * Returns a list of plug-ins visible on the site. Note, that this is simply a 
-		 * reflection of the site content and the current policy for the site. The plug-ins
-		 * may or may not end up being used by Eclipse (depends on which plug-in are 
-		 * actually bound by the platform).
-		 * 
-		 * @return an array of plug-in entries, or an empty array if no plug-ins are found.
-		 * A plug-in entry is returned as a path relative to the site URL		 * 
-		 * @since 2.0
-		 */
-		public String[] getPlugins();
-
-		/**
-		 * Returns a stamp reflecting the current state of the site. If called repeatedly,
-		 * returns the same value as long as no changes were made to the site (changes to
-		 * features or plugins).
-		 * 
-		 * @return site change stamp
-		 * @since 2.0
-		 */
-		public long getChangeStamp();
-
-		/**
-		 * Returns a stamp reflecting the current state of the features on the site. 
-		 * If called repeatedly, returns the same value as long as no changes were made to
-		 * features on the site.
-		 * 
-		 * @return site features change stamp 
-		 * @since 2.0
-		 */
-		public long getFeaturesChangeStamp();
-
-		/**
-		 * Returns a stamp reflecting the current state of the plug-ins on the site. 
-		 * If called repeatedly, returns the same value as long as no changes were made to
-		 * plug-ins on the site.
-		 * 
-		 * @return site plug-ins change stamp 
-		 * @since 2.0
-		 */
-		public long getPluginsChangeStamp();
-
-		/**
-		 * Returns an indication whether the site can be updated.
-		 * 
-		 * @return <code>true</code> if site can be updated, <code>false</code> otherwise
-		 * @since 2.0
-		 */
-		public boolean isUpdateable();
-
-		/**
-		 * Returns an indication whether the site represents an install site
-		 * that has been linked via a native installer (using the links/<linkfile>
-		 * mechanism)
-		 * 
-		 * @return <code>true</code> if the site is linked, <code>false</code> otherwise
-		 * @since 2.0
-		 */
-		public boolean isNativelyLinked();
-	}
-
-	/**
-	 * Site policy. The site policy object determines how plug-ins
-	 * contained on the site are processed during startup. In general,
-	 * there are 3 ways of configuring a site policy
-	 * <ul>
-	 * <li>explicitly specify which plug-ins are to be included at
-	 * startup (type==USER_INCLUDE). Any other plug-ins located
-	 * at the site are ignored at startup. This is typically the best
-	 * policy when using remote sites where the user wishes
-	 * to retain explicit control over the plug-ins that are included
-	 * from such site.
-	 * <li>explicitly specify which plug-ins are to be excluded at
-	 * startup (type==USER-EXCLUDE). All other plug-ins located
-	 * at the site are used at startup. This policy requires that
-	 * the site support an access "protocol" that allows plug-in
-	 * discovery. In general, these are sites defined using the "file"
-	 * URL protocol. This is typically the best policy for local
-	 * install sites (on the user system).
-	 * </ul>
-	 * 
-	 * @since 2.0
-	 */
-	public interface ISitePolicy extends org.eclipse.update.configurator.IPlatformConfiguration.ISitePolicy {
-
-		/**
-		 * Policy type constants.
-		 */
-
-		/** 
-		 * User-defined inclusion list. The list associated with this
-		 * policy type is interpreted as path entries to included plugin.xml
-		 * or fragment.xml <b>relative</b> to the site URL
-		 */
-		public static final int USER_INCLUDE = 0;
-
-		/**
-		 * User-defined exclusion list. The list associated with this
-		 * policy type is interpreted as path entries to excluded plugin.xml
-		 * or fragment.xml <b>relative</b> to the site URL
-		 */
-		public static final int USER_EXCLUDE = 1;
-
-		/**
-		 * Return policy type
-		 * 
-		 * @return policy type
-		 * @since 2.0
-		 */
-		public int getType();
-
-		/**
-		 * Return policy inclusion/ exclusion list
-		 * 
-		 * @return the list as an array
-		 * @since 2.0
-		 */
-		public String[] getList();
-
-		/**
-		 * Set new policy list. The list entries are interpreted based on the policy
-		 * type. See description of the policy type constants for details.
-		 * 
-		 * @param list policy inclusion/ exclusion list as an array.
-		 * Returns an empty array if there are no entries.
-		 * @see #USER_INCLUDE
-		 * @see #USER_EXCLUDE
-		 * @since 2.0
-		 */
-		public void setList(String[] list);
-	}
-
-	/**
-	 * Feature entry.
-	 * Represents runtime "hints" about configured features.
-	 * The information is used during execution to locate the
-	 * correct attribution information for a feature. Note,
-	 * that a typical configuration can declare multiple feature
-	 * entries. At execution time, only one can be selected as
-	 * the active primary feature. This is determined based on 
-	 * specified command line arguments or computed defaults.
-	 * 
-	 * @since 2.0
-	 */
-	public interface IFeatureEntry {
-
-		/**
-		 * Returns feature identifier.
-		 * @return feature identifier
-		 * @since 2.0
-		 */
-		public String getFeatureIdentifier();
-
-		/**
-		 * Returns the currently configured version for the feature.
-		 * @return feature version (as string), or <code>null</code>
-		 * @since 2.0
-		 */
-		public String getFeatureVersion();
-
-		/**
-		 * Returns the identifier of the feature plug-in for this feature entry.
-		 *  Note,      that there is no guarantee that a feature in fact
-		 * supplies a corresponding feature plugin, so the result can be
-		 * <code>null</code>. Also, if supplied, there is no guarantee that the
-		 * plugin will in fact be loaded into the plug-in registry at runtime
-		 * (due to rules and constraint checking performed by the registry
-		 * loading support). Consequently code making use of this method must
-		 * handle these conditions.
-		 * @return feature identifier (as string), or <code>null</code>
-		 * @since 2.1
-		 */
-		public String getFeaturePluginIdentifier();
-
-		/**
-		 * Returns the version of the feature plug-in for this feature
-		 * entry. Note, that there is no guarantee that a feature in fact
-		 * supplies a corresponding feature plugin, so the result can be
-		 * <code>null</code>. Also, if supplied, there is no guarantee that the
-		 * plugin will in fact be loaded into the plug-in registry at runtime
-		 * (due to rules and constraint checking performed by the registry
-		 * loading support). Consequently code making use of this method must
-		 * handle these conditions.
-		 * @return feature version (as string), or <code>null</code>
-		 * @since 2.0
-		 */
-		public String getFeaturePluginVersion();
-
-		/**
-		 * Returns the application to run when this feature is the
-		 * primary feature.
-		 * @return application identifier, or <code>null</code> 
-		 * @since 2.0
-		 */
-		public String getFeatureApplication();
-
-		/**
-		 * Returns URLs to the feature "root" locations. The root
-		 * URLs are install locations of the feature plugin and its
-		 * fragments.
-		 *
-		 * @return array of URLs, or an empty array
-		 * @since 2.0
-		 */
-		public URL[] getFeatureRootURLs();
-
-		/**
-		 * Returns an indication whether this feature has been defined
-		 * to act as a primary feature.
-		 * @return <code>true</code> if the feature can be primary,
-		 * <code>false</code> otherwise.
-		 * @since 2.0
-		 */
-		public boolean canBePrimary();
-	}
-
-	/**
-	 * Create a site entry
-	 *
-	 * @param url site URL
-	 * @param policy site policy
-	 * @return created site entry
-	 * @since 2.0
-	 */
-	public ISiteEntry createSiteEntry(URL url, ISitePolicy policy);
-
-	/**
-	 * Create a site policy. The policy determines the way the site
-	 * plug-in are processed at startpu
-	 *
-	 * @param type policy type
-	 * @param list an array of site-relative paths representing the
-	 * inclusion/ exclusion list
-	 * @return created site policy entry
-	 * @since 2.0
-	 */
-	public ISitePolicy createSitePolicy(int type, String[] list);
-
-	/**
-	 * Create a feature entry
-	 * @param id feature identifier. Must not be <code>null</code>.
-	 * @param version feature version (as String). Can be <code>null</code>.
-	 * @param pluginVersion version of the feature plugin (as String). Can be
-	 * <code>null</code>.
-	 * @param primary <code>true</code> if the feature is defined as a primary
-	 * feature, otherwise <code>false</code>.
-	 * @param application identifier of the application to run when 
-	 * this feature is the primary feature. Can be <code>null</code>.
-	 * If specified, the identifier must represent a valid extension 
-	 * registered in the <code>org.eclipse.core.runtime.applications</code>
-	 * extension point.
-	 * @param an array of URLs to feature root directories.
-	 * These are URLs to install locations for the feature plugin
-	 * and its fragments. Can be <code>null</code>.
-	 * @return create feature entry
-	 * @since 2.0
-	 */
-	public IFeatureEntry createFeatureEntry(String id, String version, String pluginVersion, boolean primary, String application, URL[] root);
-
-	/**
-	 * Create a feature entry
-	 * @param id feature identifier. Must not be <code>null</code>.
-	 * @param version feature version (as String). Can be <code>null</code>.
-	 * @param pluginIdentifier identifier of the feature plugin (as String). Can
-	 * be <code>null</code>.
-	 * @param  pluginVersion  version of the feature plugin (as String). Can be
-	 * <code>null</code>.
-	 * @param primary <code>true</code> if the feature is defined as a primary
-	 * feature, otherwise <code>false</code>.
-	 * @param application identifier of the application to run when
-	 * this feature is the primary feature. Can be <code>null</code>.
-	 * If specified, the identifier must represent a valid extension
-	 * registered in the <code>org.eclipse.core.runtime.applications</code>
-	 * extension point.
-	 * @param an array of URLs to feature root directories.
-	 * These are URLs to install locations for the feature plugin
-	 * and its fragments. Can be <code>null</code>.
-	 * @return create feature entry
-	 * @since 2.1
-	 */
-	public IFeatureEntry createFeatureEntry(String id, String version, String pluginIdentifier, String pluginVersion, boolean primary, String application, URL[] root);
-
-	/**
-	 * Configures the specified site entry. If a site entry with the
-	 * same site URL is already configured, the entry is <b>not</b> replaced.
-	 * 
-	 * @param entry site entry 
-	 * @since 2.0
-	 */
-	public void configureSite(ISiteEntry entry);
-
-	/**
-	 * Configures the specified site entry. If a site entry with the
-	 * same site URL is already configured, the replacement behavior for
-	 * the entry can be specified.
-	 * 
-	 * @param entry site entry 
-	 * @param  flag indicating whether an existing configured entry with
-	 * the same URL should be replaced (<code>true</code>) or not (<code>false</code>).
-	 * @since 2.0
-	 */
-	public void configureSite(ISiteEntry entry, boolean replace);
-
-	/**
-	 * Unconfigures the specified entry. Does not do anything if the entry
-	 * is not configured.
-	 * 
-	 * @param entry site entry
-	 * @since 2.0
-	 */
-	public void unconfigureSite(ISiteEntry entry);
-
-	/**
-	 * Returns configured site entries
-	 * 
-	 * @return array of site entries. Returns an empty array if no sites are
-	 * configured
-	 * @since 2.0
-	 */
-	public ISiteEntry[] getConfiguredSites();
-
-	/**
-	 * Returns a site entry matching the specified URL
-	 * 
-	 * @param url site url
-	 * @return matching site entry, or <code>null</code> if no match found
-	 * @since 2.0
-	 */
-	public ISiteEntry findConfiguredSite(URL url);
-
-	/**
-	 * Configures the feature entry.
-	 * If another feature entry with the same feature identifier 
-	 * already exists, it is replaced.
-	 * @param entry feature entry
-	 * @since 2.0
-	 */
-	public void configureFeatureEntry(IFeatureEntry entry);
-
-	/**
-	 * Unconfigures the specified feature entry if it exists.
-	 * @param entry feature entry
-	 * @since 2.0
-	 */
-	public void unconfigureFeatureEntry(IFeatureEntry entry);
-
-	/**
-	 * Returns a list of configured feature entries.
-	 * @return array or entries, or an empty array if no entries
-	 * are configured
-	 * @since 2.0
-	 */
-	public IFeatureEntry[] getConfiguredFeatureEntries();
-
-	/**
-	 * Locates the specified feature entry.
-	 * @param id feature identifier
-	 * @return ferature entry, or <code>null</code>.
-	 * @since 2.0
-	 */
-	public IFeatureEntry findConfiguredFeatureEntry(String id);
-
-	/**
-	 * Returns the URL location of the configuration information
-	 * 
-	 * @return configuration location URL, or <code>null</code> if the
-	 * configuration location could not be determined.
-	 * @since 2.0
-	 */
-	public URL getConfigurationLocation();
-
-	/**
-	 * Returns a stamp reflecting the current state of the configuration. If called repeatedly,
-	 * returns the same value as long as no changes were made to the configuration (changes to
-	 * sites, features or plugins).
-	 * 
-	 * @return configuration change stamp
-	 * @since 2.0
-	 */
-	public long getChangeStamp();
-
-	/**
-	 * Returns a stamp reflecting the current state of the features in the configuration. 
-	 * If called repeatedly, returns the same value as long as no changes were made to
-	 * features in the configuration.
-	 * 
-	 * @return configuration features change stamp 
-	 * @since 2.0
-	 */
-	public long getFeaturesChangeStamp();
-
-	/**
-	 * Returns a stamp reflecting the current state of the plug-ins in the configuration. 
-	 * If called repeatedly, returns the same value as long as no changes were made to
-	 * plug-ins in the configuration.
-	 * 
-	 * @return configuration plug-ins change stamp 
-	 * @since 2.0
-	 */
-	public long getPluginsChangeStamp();
-
-	/**
-	 * Returns the identifier of the configured primary feature. A primary feature
-	 * is used to specify product customization information for a running instance
-	 * of Eclipse. 
-	 * 
-	 * @return primary feature identifier, or <code>null</code> if none configured
-	 * @since 2.0
-	 */
-	public String getPrimaryFeatureIdentifier();
-
-	/**
-	 * Computes the plug-in path for this configuration. The result includes all plug-ins
-	 * visible on each of the configured sites based on each site policy.
-	 * 
-	 * @return an array of plug-in path elements (full URL entries), or an empty array.
-	 * @since 2.0
-	 */
-	public URL[] getPluginPath();
-
-	/**
-	 * Returns an array of bootstrap plugin identifiers whose
-	 * location needs to be explicitly identified in the configuration.
-	 * 
-	 * @return an array of identifiers, or empty array
-	 * otherwise
-	 * @since 2.0
-	 */
-	public String[] getBootstrapPluginIdentifiers();
-
-	/**
-	 * Sets the location of a bootstrap plugin.
-	 * 
-	 * @see IPlatformConfiguration#getBootstrapPluginIdentifiers()
-	 * @param id plugin identifier. Must match one of the entries returned
-	 * by getBootstrapPluginIdentifiers()
-	 * @param location
-	 * @since 2.0
-	 */
-	public void setBootstrapPluginLocation(String id, URL location);
-
-	/**
-	 * Returns an indication whether the configuration can be updated.
-	 * 
-	 * @return <code>true</code> if configuration can be updated, <code>false</code> 
-	 * otherwise
-	 * @since 2.0
-	 */
-	public boolean isUpdateable();
-
-	/**
-	 * Returns an indication whether the configuration is transient. A transient
-	 * configuration typically represents a scenario where the configuration
-	 * was computed for a single instantiation of the platform and is not
-	 * guaranteed to be valid on subsequent instantiations.
-	 * 
-	 * @return <code>true</code> if configuration is transient, <code>false</code> 
-	 * otherwise
-	 * @since 2.0
-	 */
-	public boolean isTransient();
-
-	/**
-	 * Indicates whether the configuration is transient or not. A transient
-	 * configuration typically represents a scenario where the configuration
-	 * was computed for a single instantiation of the platform and is not
-	 * guaranteed to be valid on subsequent instantiations. This method has
-	 * no effect if called on the current platform configuration.
-	 * 
-	 * @see BootLoader#getCurrentPlatformConfiguration()
-	 * @param value <code>true</code> if configuration is transient, <code>false</code> 
-	 * otherwise
-	 * @since 2.0
-	 */
-	public void isTransient(boolean value);
-
-	/**
-	 * Called to refresh the configuration information. In particular,
-	 * causes change stamps to be recomputed based on the current
-	 * configuration state, and updates the lists of available plug-ins.
-	 * @since 2.0
-	 */
-	public void refresh();
-
-	/**
-	 * Called to save the configuration information
-	 * @since 2.0
-	 */
-	public void save() throws IOException;
-
-	/**
-	 * Called to save the configuration information in the
-	 * specified location
-	 * 
-	 * @param url save location.
-	 * @since 2.0
-	 */
-	public void save(URL url) throws IOException;
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/boot/IPlatformRunnable.java b/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/boot/IPlatformRunnable.java
deleted file mode 100644
index 85a5e9b..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/boot/IPlatformRunnable.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.boot;
-
-/**
- * Bootstrap type for the platform. Platform runnables represent executable 
- * entry points into plug-ins.  Runnables can be configured into the Platform's
- * <code>org.eclipse.core.runtime.applications</code> extension-point 
- * or be made available through code or extensions on other plug-in's extension-points.
- * <p>
- * Clients may implement this interface.
- * </p>
- * @deprecated In Eclipse 3.0 the boot plug-in and packages were deprecated.
- * This class has been replaced by an equivalent class in the org.eclipse.core.runtime package.
- * 
- * @see org.eclipse.core.runtime.IPlatformRunnable
- */
-
-public interface IPlatformRunnable extends org.eclipse.core.runtime.IPlatformRunnable {
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/FeatureEntry.java b/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/FeatureEntry.java
deleted file mode 100644
index dabedc2..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/FeatureEntry.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.boot;
-
-import java.net.URL;
-import org.eclipse.core.boot.IPlatformConfiguration.IFeatureEntry;
-import org.eclipse.update.configurator.IPlatformConfiguration;
-
-public class FeatureEntry implements IFeatureEntry {
-	private IPlatformConfiguration.IFeatureEntry newFeatureEntry;
-
-	public FeatureEntry(IPlatformConfiguration.IFeatureEntry fe) {
-		newFeatureEntry = fe;
-	}
-
-	public String getFeatureIdentifier() {
-		return newFeatureEntry.getFeatureIdentifier();
-	}
-
-	public String getFeatureVersion() {
-		return newFeatureEntry.getFeatureVersion();
-	}
-
-	public String getFeaturePluginIdentifier() {
-		return newFeatureEntry.getFeaturePluginIdentifier();
-	}
-
-	public String getFeaturePluginVersion() {
-		return newFeatureEntry.getFeaturePluginVersion();
-	}
-
-	public String getFeatureApplication() {
-		return newFeatureEntry.getFeatureApplication();
-	}
-
-	public URL[] getFeatureRootURLs() {
-		return newFeatureEntry.getFeatureRootURLs();
-	}
-
-	public boolean canBePrimary() {
-		return newFeatureEntry.canBePrimary();
-	}
-
-	public IPlatformConfiguration.IFeatureEntry getNewFeatureEntry() {
-		return newFeatureEntry;
-	}
-
-	public boolean equals(Object o) {
-		if (o instanceof FeatureEntry) {
-			return newFeatureEntry.equals(((FeatureEntry) o).newFeatureEntry);
-		}
-		return false;
-	}
-
-	public int hashCode() {
-		return newFeatureEntry.hashCode();
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/PlatformConfiguration.java b/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/PlatformConfiguration.java
deleted file mode 100644
index a2a3f9a..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/PlatformConfiguration.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.boot;
-
-import java.io.IOException;
-import java.net.URL;
-import org.eclipse.core.boot.IPlatformConfiguration;
-
-public class PlatformConfiguration implements IPlatformConfiguration {
-	private org.eclipse.update.configurator.IPlatformConfiguration newConfig;
-
-	public PlatformConfiguration(org.eclipse.update.configurator.IPlatformConfiguration config) {
-		newConfig = config;
-	}
-
-	public ISiteEntry createSiteEntry(URL url, ISitePolicy policy) {
-		return new SiteEntry(newConfig.createSiteEntry(url, ((SitePolicy) policy).getNewPolicy()));
-	}
-
-	public ISitePolicy createSitePolicy(int type, String[] list) {
-		return new SitePolicy(newConfig.createSitePolicy(type, list));
-	}
-
-	public IFeatureEntry createFeatureEntry(String id, String version, String pluginVersion, boolean primary, String application, URL[] root) {
-		return new FeatureEntry(newConfig.createFeatureEntry(id, version, pluginVersion, primary, application, root));
-	}
-
-	public IFeatureEntry createFeatureEntry(String id, String version, String pluginIdentifier, String pluginVersion, boolean primary, String application, URL[] root) {
-		return new FeatureEntry(newConfig.createFeatureEntry(id, version, pluginIdentifier, pluginVersion, primary, application, root));
-	}
-
-	public void configureSite(ISiteEntry entry) {
-		newConfig.configureSite(((SiteEntry) entry).getNewSiteEntry());
-	}
-
-	public void configureSite(ISiteEntry entry, boolean replace) {
-		newConfig.configureSite(((SiteEntry) entry).getNewSiteEntry(), replace);
-	}
-
-	public void unconfigureSite(ISiteEntry entry) {
-		newConfig.unconfigureSite(((SiteEntry) entry).getNewSiteEntry());
-	}
-
-	public ISiteEntry[] getConfiguredSites() {
-		org.eclipse.update.configurator.IPlatformConfiguration.ISiteEntry[] sites = newConfig.getConfiguredSites();
-		SiteEntry[] oldSites = new SiteEntry[sites.length];
-		for (int i = 0; i < sites.length; i++)
-			oldSites[i] = new SiteEntry(sites[i]);
-		return oldSites;
-	}
-
-	public ISiteEntry findConfiguredSite(URL url) {
-		org.eclipse.update.configurator.IPlatformConfiguration.ISiteEntry siteEntry = newConfig.findConfiguredSite(url);
-		if (siteEntry == null)
-			return null;
-		return new SiteEntry(siteEntry);
-	}
-
-	public void configureFeatureEntry(IFeatureEntry entry) {
-		newConfig.configureFeatureEntry(((FeatureEntry) entry).getNewFeatureEntry());
-	}
-
-	public void unconfigureFeatureEntry(IFeatureEntry entry) {
-		newConfig.unconfigureFeatureEntry(((FeatureEntry) entry).getNewFeatureEntry());
-	}
-
-	public IFeatureEntry[] getConfiguredFeatureEntries() {
-		org.eclipse.update.configurator.IPlatformConfiguration.IFeatureEntry[] entries = newConfig.getConfiguredFeatureEntries();
-		FeatureEntry[] oldEntries = new FeatureEntry[entries.length];
-		for (int i = 0; i < entries.length; i++)
-			oldEntries[i] = new FeatureEntry(entries[i]);
-		return oldEntries;
-	}
-
-	public IFeatureEntry findConfiguredFeatureEntry(String id) {
-		return new FeatureEntry(newConfig.findConfiguredFeatureEntry(id));
-	}
-
-	public URL getConfigurationLocation() {
-		return newConfig.getConfigurationLocation();
-	}
-
-	public long getChangeStamp() {
-		return newConfig.getChangeStamp();
-	}
-
-	public long getFeaturesChangeStamp() {
-		return newConfig.getFeaturesChangeStamp();
-	}
-
-	public long getPluginsChangeStamp() {
-		return newConfig.getPluginsChangeStamp();
-	}
-
-	public String getPrimaryFeatureIdentifier() {
-		return newConfig.getPrimaryFeatureIdentifier();
-	}
-
-	public URL[] getPluginPath() {
-		return newConfig.getPluginPath();
-	}
-
-	public String[] getBootstrapPluginIdentifiers() {
-		return newConfig.getBootstrapPluginIdentifiers();
-	}
-
-	public void setBootstrapPluginLocation(String id, URL location) {
-		newConfig.setBootstrapPluginLocation(id, location);
-	}
-
-	public boolean isUpdateable() {
-		return newConfig.isUpdateable();
-	}
-
-	public boolean isTransient() {
-		return newConfig.isTransient();
-	}
-
-	public void isTransient(boolean value) {
-		newConfig.isTransient(value);
-	}
-
-	public void refresh() {
-		newConfig.refresh();
-	}
-
-	public void save() throws IOException {
-		newConfig.save();
-	}
-
-	public void save(URL url) throws IOException {
-		newConfig.save(url);
-	}
-
-	public boolean equals(Object o) {
-		if (o instanceof PlatformConfiguration)
-			return newConfig.equals(((PlatformConfiguration) o).newConfig);
-		return false;
-	}
-
-	public int hashCode() {
-		return newConfig.hashCode();
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/SiteEntry.java b/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/SiteEntry.java
deleted file mode 100644
index ea61feb..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/SiteEntry.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.boot;
-
-import java.net.URL;
-import org.eclipse.core.boot.IPlatformConfiguration.ISiteEntry;
-import org.eclipse.core.boot.IPlatformConfiguration.ISitePolicy;
-import org.eclipse.update.configurator.IPlatformConfiguration;
-
-public class SiteEntry implements ISiteEntry {
-	private org.eclipse.update.configurator.IPlatformConfiguration.ISiteEntry newSiteEntry;
-
-	public SiteEntry(IPlatformConfiguration.ISiteEntry entry) {
-		newSiteEntry = entry;
-	}
-
-	public URL getURL() {
-		return newSiteEntry.getURL();
-	}
-
-	public ISitePolicy getSitePolicy() {
-		return new SitePolicy(newSiteEntry.getSitePolicy());
-	}
-
-	public void setSitePolicy(ISitePolicy policy) {
-		newSiteEntry.setSitePolicy(((SitePolicy) policy).getNewPolicy());
-	}
-
-	public String[] getFeatures() {
-		return newSiteEntry.getFeatures();
-	}
-
-	public String[] getPlugins() {
-		return newSiteEntry.getPlugins();
-	}
-
-	public long getChangeStamp() {
-		return newSiteEntry.getChangeStamp();
-	}
-
-	public long getFeaturesChangeStamp() {
-		return newSiteEntry.getFeaturesChangeStamp();
-	}
-
-	public long getPluginsChangeStamp() {
-		return newSiteEntry.getPluginsChangeStamp();
-	}
-
-	public boolean isUpdateable() {
-		return newSiteEntry.isUpdateable();
-	}
-
-	public boolean isNativelyLinked() {
-		return newSiteEntry.isNativelyLinked();
-	}
-
-	public org.eclipse.update.configurator.IPlatformConfiguration.ISiteEntry getNewSiteEntry() {
-		return newSiteEntry;
-	}
-
-	public boolean equals(Object o) {
-		if (o instanceof SiteEntry)
-			return newSiteEntry.equals(((SiteEntry) o).newSiteEntry);
-		return false;
-	}
-
-	public int hashCode() {
-		return newSiteEntry.hashCode();
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/SitePolicy.java b/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/SitePolicy.java
deleted file mode 100644
index a73e86a..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-boot/org/eclipse/core/internal/boot/SitePolicy.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.boot;
-
-import org.eclipse.core.boot.IPlatformConfiguration.ISitePolicy;
-import org.eclipse.update.configurator.IPlatformConfiguration;
-
-public class SitePolicy implements ISitePolicy {
-	private IPlatformConfiguration.ISitePolicy newPolicy;
-
-	public SitePolicy(IPlatformConfiguration.ISitePolicy policy) {
-		newPolicy = policy;
-	}
-
-	public int getType() {
-		return newPolicy.getType();
-	}
-
-	public String[] getList() {
-		return newPolicy.getList();
-	}
-
-	public void setList(String[] list) {
-		newPolicy.setList(list);
-	}
-
-	public IPlatformConfiguration.ISitePolicy getNewPolicy() {
-		return newPolicy;
-	}
-
-	public boolean equals(Object o) {
-		if (o instanceof SitePolicy)
-			return newPolicy.equals(((SitePolicy) o).newPolicy);
-		return false;
-	}
-
-	public int hashCode() {
-		return newPolicy.hashCode();
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/IModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/IModel.java
deleted file mode 100644
index 8f406c1..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/IModel.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.model;
-
-public interface IModel {
-
-	public static final int INDENT = 2;
-	public static final int RADIX = 36;
-
-	public static final String TRUE = "true"; //$NON-NLS-1$
-	public static final String FALSE = "false"; //$NON-NLS-1$
-
-	public static final String REGISTRY = "plugin-registry"; //$NON-NLS-1$
-	public static final String REGISTRY_PATH = "path"; //$NON-NLS-1$
-
-	public static final String FRAGMENT = "fragment"; //$NON-NLS-1$
-	public static final String FRAGMENT_ID = "id"; //$NON-NLS-1$
-	public static final String FRAGMENT_NAME = "name"; //$NON-NLS-1$
-	public static final String FRAGMENT_PROVIDER = "provider-name"; //$NON-NLS-1$
-	public static final String FRAGMENT_VERSION = "version"; //$NON-NLS-1$
-	public static final String FRAGMENT_PLUGIN_ID = "plugin-id"; //$NON-NLS-1$
-	public static final String FRAGMENT_PLUGIN_VERSION = "plugin-version"; //$NON-NLS-1$
-	public static final String FRAGMENT_PLUGIN_MATCH = "match"; //$NON-NLS-1$
-	public static final String FRAGMENT_PLUGIN_MATCH_PERFECT = "perfect"; //$NON-NLS-1$
-	public static final String FRAGMENT_PLUGIN_MATCH_EQUIVALENT = "equivalent"; //$NON-NLS-1$
-	public static final String FRAGMENT_PLUGIN_MATCH_COMPATIBLE = "compatible"; //$NON-NLS-1$
-	public static final String FRAGMENT_PLUGIN_MATCH_GREATER_OR_EQUAL = "greaterOrEqual"; //$NON-NLS-1$
-
-	public static final String PLUGIN = "plugin"; //$NON-NLS-1$
-	public static final String PLUGIN_ID = "id"; //$NON-NLS-1$
-	public static final String PLUGIN_NAME = "name"; //$NON-NLS-1$
-	public static final String PLUGIN_VENDOR = "vendor-name"; //$NON-NLS-1$
-	public static final String PLUGIN_PROVIDER = "provider-name"; //$NON-NLS-1$
-	public static final String PLUGIN_VERSION = "version"; //$NON-NLS-1$
-	public static final String PLUGIN_CLASS = "class"; //$NON-NLS-1$
-
-	public static final String PLUGIN_REQUIRES = "requires"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_PLATFORM = "platform-version"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_PLUGIN = "plugin"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_PLUGIN_VERSION = "version"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_OPTIONAL = "optional"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_IMPORT = "import"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_EXPORT = "export"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_MATCH = "match"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_MATCH_EXACT = "exact"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_MATCH_PERFECT = "perfect"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_MATCH_EQUIVALENT = "equivalent"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_MATCH_COMPATIBLE = "compatible"; //$NON-NLS-1$
-	public static final String PLUGIN_REQUIRES_MATCH_GREATER_OR_EQUAL = "greaterOrEqual"; //$NON-NLS-1$
-
-	public static final String PLUGIN_KEY_VERSION_SEPARATOR = "_"; //$NON-NLS-1$
-
-	public static final String RUNTIME = "runtime"; //$NON-NLS-1$
-
-	public static final String LIBRARY = "library"; //$NON-NLS-1$
-	public static final String LIBRARY_NAME = "name"; //$NON-NLS-1$
-	public static final String LIBRARY_SOURCE = "source"; //$NON-NLS-1$
-	public static final String LIBRARY_TYPE = "type"; //$NON-NLS-1$
-	public static final String LIBRARY_EXPORT = "export"; //$NON-NLS-1$
-	public static final String LIBRARY_EXPORT_MASK = "name"; //$NON-NLS-1$
-	public static final String LIBRARY_PACKAGES = "packages"; //$NON-NLS-1$
-	public static final String LIBRARY_PACKAGES_PREFIXES = "prefixes"; //$NON-NLS-1$
-
-	public static final String EXTENSION_POINT = "extension-point"; //$NON-NLS-1$
-	public static final String EXTENSION_POINT_NAME = "name"; //$NON-NLS-1$
-	public static final String EXTENSION_POINT_ID = "id"; //$NON-NLS-1$
-	public static final String EXTENSION_POINT_SCHEMA = "schema"; //$NON-NLS-1$
-
-	public static final String EXTENSION = "extension"; //$NON-NLS-1$
-	public static final String EXTENSION_NAME = "name"; //$NON-NLS-1$
-	public static final String EXTENSION_ID = "id"; //$NON-NLS-1$
-	public static final String EXTENSION_TARGET = "point"; //$NON-NLS-1$
-
-	public static final String ELEMENT = "element"; //$NON-NLS-1$
-	public static final String ELEMENT_NAME = "name"; //$NON-NLS-1$
-	public static final String ELEMENT_VALUE = "value"; //$NON-NLS-1$
-
-	public static final String PROPERTY = "property"; //$NON-NLS-1$
-	public static final String PROPERTY_NAME = "name"; //$NON-NLS-1$
-	public static final String PROPERTY_VALUE = "value"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/PluginMap.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/PluginMap.java
deleted file mode 100644
index 7e3918a..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/PluginMap.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.model;
-
-import java.util.*;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.PluginVersionIdentifier;
-import org.eclipse.core.runtime.model.PluginModel;
-
-/**
- * A map specialized to manage plugin models (either for plugins or fragments).
- */
-public class PluginMap {
-	private Map map;
-	private boolean preserveOrder;
-	private int size;
-	private boolean replaceDuplicates;
-
-	public PluginMap(Map pluginModels) {
-		this(pluginModels, true, false);
-	}
-
-	public PluginMap(Map pluginModels, boolean preserveOrder, boolean replaceDuplicates) {
-		this.map = pluginModels;
-		this.preserveOrder = preserveOrder;
-		this.replaceDuplicates = replaceDuplicates;
-	}
-
-	public void add(PluginModel pluginModel) {
-
-		String key = pluginModel.getId();
-		List verList = (List) map.get(key);
-
-		// create new index entry if one does not exist for plugin
-		if (verList == null) {
-			verList = new LinkedList();
-			map.put(key, verList);
-		}
-
-		int i = 0;
-		// insert plugin into list maintaining version order
-		if (preserveOrder)
-			for (; i < verList.size(); i++) {
-				PluginModel element = (PluginModel) verList.get(i);
-				if (getVersionIdentifier(pluginModel).equals(getVersionIdentifier(element))) {
-					if (replaceDuplicates)
-						verList.set(i, pluginModel);
-					return; // ignore duplicates
-				}
-				if (getVersionIdentifier(pluginModel).isGreaterThan(getVersionIdentifier(element)))
-					break;
-			}
-		verList.add(i, pluginModel);
-		size++;
-	}
-
-	public PluginModel get(String id, String version) {
-		List versions = (List) map.get(id);
-		if (versions == null || versions.isEmpty())
-			return null;
-		if (version == null)
-			// Just return the first one in the list (random)			
-			return (PluginModel) versions.get(0);
-		int versionCount = versions.size();
-		for (int i = 0; i < versionCount; i++) {
-			PluginModel pluginModel = (PluginModel) versions.get(i);
-			if (pluginModel.getVersion().equals(version))
-				return pluginModel;
-		}
-		return null;
-	}
-
-	public List getVersions(String id) {
-		return (List) map.get(id);
-	}
-
-	public PluginModel getAny(String id) {
-		List versions = (List) map.get(id);
-		if (versions == null || versions.isEmpty())
-			return null;
-		return (PluginModel) versions.get(0);
-	}
-
-	private PluginVersionIdentifier getVersionIdentifier(PluginModel model) {
-		if (PluginVersionIdentifier.validateVersion(model.getVersion()).getSeverity() != IStatus.OK)
-			return new PluginVersionIdentifier("0.0.0"); //$NON-NLS-1$
-		return new PluginVersionIdentifier(model.getVersion());
-	}
-
-	public int size() {
-		return size;
-	}
-
-	public void markReadOnly() {
-		for (Iterator it = map.values().iterator(); it.hasNext();) {
-			List list = (List) it.next();
-			int count = list.size();
-			for (int i = 0; i < count; i++)
-				((PluginModel) list.get(i)).markReadOnly();
-		}
-	}
-
-	public PluginModel remove(String pluginId, String version) {
-		List versions = (List) map.get(pluginId);
-		if (versions == null)
-			return null;
-		for (Iterator iter = versions.iterator(); iter.hasNext();) {
-			PluginModel pluginModel = (PluginModel) iter.next();
-			if (pluginModel.getId().equals(pluginId) && pluginModel.getVersion().equals(version)) {
-				if (versions.size() == 1)
-					map.remove(pluginId);
-				else
-					iter.remove();
-				size--;
-				return pluginModel;
-			}
-		}
-		return null;
-	}
-
-	public void removeVersions(String pluginId) {
-		List versions = (List) map.remove(pluginId);
-		if (versions != null)
-			size -= versions.size();
-	}
-
-	public void copyToArray(Object[] array) {
-		int index = 0;
-		for (Iterator mapIter = map.values().iterator(); mapIter.hasNext();) {
-			List versions = (List) mapIter.next();
-			for (Iterator listIiter = versions.iterator(); listIiter.hasNext();)
-				array[index++] = listIiter.next();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/PluginParser.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/PluginParser.java
deleted file mode 100644
index 1aed94c..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/PluginParser.java
+++ /dev/null
@@ -1,795 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.model;
-
-import java.util.*;
-import javax.xml.parsers.SAXParserFactory;
-import org.eclipse.core.internal.runtime.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.model.*;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.ServiceReference;
-import org.xml.sax.*;
-import org.xml.sax.helpers.DefaultHandler;
-
-public class PluginParser extends DefaultHandler implements IModel {
-
-	// concrete object factory
-	Factory factory;
-
-	// File name for this plugin or fragment
-	// This to help with error reporting
-	String locationName = null;
-
-	// Current State Information
-	Stack stateStack = new Stack();
-
-	// Current object stack (used to hold the current object we are
-	// populating in this plugin descriptor
-	Stack objectStack = new Stack();
-
-	Locator locator = null;
-
-	// Valid States
-	private static final int IGNORED_ELEMENT_STATE = 0;
-	private static final int INITIAL_STATE = 1;
-	private static final int PLUGIN_STATE = 2;
-	private static final int PLUGIN_RUNTIME_STATE = 3;
-	private static final int PLUGIN_REQUIRES_STATE = 4;
-	private static final int PLUGIN_EXTENSION_POINT_STATE = 5;
-	private static final int PLUGIN_EXTENSION_STATE = 6;
-	private static final int RUNTIME_LIBRARY_STATE = 7;
-	private static final int LIBRARY_EXPORT_STATE = 8;
-//	private static final int LIBRARY_PACKAGES_STATE = 12;
-	private static final int PLUGIN_REQUIRES_IMPORT_STATE = 9;
-	private static final int CONFIGURATION_ELEMENT_STATE = 10;
-	private static final int FRAGMENT_STATE = 11;
-
-	// Keep a group of vectors as a temporary scratch space.  These
-	// vectors will be used to populate arrays in the plugin descriptor
-	// once processing of the XML file is complete.
-	private static final int EXTENSION_POINT_INDEX = 0;
-	private static final int EXTENSION_INDEX = 1;
-	private static final int LAST_INDEX = 1;
-	private Vector scratchVectors[] = new Vector[LAST_INDEX + 1];
-
-	private ServiceReference parserReference;
-
-	public PluginParser(Factory factory) {
-		super();
-		this.factory = factory;
-	}
-
-	/**
-	 * Receive a Locator object for document events.
-	 *
-	 * <p>By default, do nothing.  Application writers may override this
-	 * method in a subclass if they wish to store the locator for use
-	 * with other document events.</p>
-	 *
-	 * @param locator A locator for all SAX document events.
-	 * @see org.xml.sax.ContentHandler#setDocumentLocator
-	 * @see org.xml.sax.Locator
-	 */
-	public void setDocumentLocator(Locator locator) {
-		this.locator = locator;
-	}
-
-	public void characters(char[] ch, int start, int length) {
-		int state = ((Integer) stateStack.peek()).intValue();
-		if (state != CONFIGURATION_ELEMENT_STATE)
-			return;
-		if (state == CONFIGURATION_ELEMENT_STATE) {
-			// Accept character data within an element, is when it is
-			// part of a configuration element (i.e. an element within an EXTENSION element
-			ConfigurationElementModel currentConfigElement = (ConfigurationElementModel) objectStack.peek();
-			String value = new String(ch, start, length);
-			String oldValue = currentConfigElement.getValueAsIs();
-			if (oldValue == null) {
-				if (value.trim().length() != 0)
-					currentConfigElement.setValue(value);
-			} else {
-				currentConfigElement.setValue(oldValue + value);
-			}
-		}
-	}
-
-	public void endDocument() {
-	}
-
-	public void endElement(String uri, String elementName, String qName) {
-		switch (((Integer) stateStack.peek()).intValue()) {
-			case IGNORED_ELEMENT_STATE :
-				stateStack.pop();
-				break;
-			case INITIAL_STATE :
-				// shouldn't get here
-				internalError(NLS.bind(Messages.parse_internalStack, elementName));
-				break;
-			case PLUGIN_STATE :
-			case FRAGMENT_STATE :
-				if (elementName.equals(PLUGIN) || elementName.equals(FRAGMENT)) {
-					stateStack.pop();
-					PluginModel root = (PluginModel) objectStack.peek();
-
-					// Put the extension points into this plugin
-					Vector extPointVector = scratchVectors[EXTENSION_POINT_INDEX];
-					if (extPointVector.size() > 0) {
-						root.setDeclaredExtensionPoints((ExtensionPointModel[]) extPointVector.toArray(new ExtensionPointModel[extPointVector.size()]));
-						scratchVectors[EXTENSION_POINT_INDEX].removeAllElements();
-					}
-
-					// Put the extensions into this plugin too
-					Vector extVector = scratchVectors[EXTENSION_INDEX];
-					if (extVector.size() > 0) {
-						root.setDeclaredExtensions((ExtensionModel[]) extVector.toArray(new ExtensionModel[extVector.size()]));
-						scratchVectors[EXTENSION_INDEX].removeAllElements();
-					}
-				}
-				break;
-			case PLUGIN_RUNTIME_STATE :
-				if (elementName.equals(RUNTIME)) {
-					stateStack.pop();
-					// take the vector of library entries and put them into the plugin
-					// descriptor
-					Vector libVector = (Vector) objectStack.pop();
-					if (libVector.size() > 0) {
-						PluginModel model = (PluginModel) objectStack.peek();
-						model.setRuntime((LibraryModel[]) libVector.toArray(new LibraryModel[libVector.size()]));
-					}
-				}
-				break;
-			case PLUGIN_REQUIRES_STATE :
-				if (elementName.equals(PLUGIN_REQUIRES)) {
-					stateStack.pop();
-					// take the vector of prerequisites and put them into the plugin
-					// descriptor
-					Vector importVector = (Vector) objectStack.pop();
-					if (importVector.size() > 0) {
-						PluginModel parentDescriptor = (PluginModel) objectStack.peek();
-						parentDescriptor.setRequires((PluginPrerequisiteModel[]) importVector.toArray(new PluginPrerequisiteModel[importVector.size()]));
-					}
-				}
-				break;
-			case PLUGIN_EXTENSION_POINT_STATE :
-				if (elementName.equals(EXTENSION_POINT)) {
-					stateStack.pop();
-				}
-				break;
-			case PLUGIN_EXTENSION_STATE :
-				if (elementName.equals(EXTENSION)) {
-					stateStack.pop();
-					// Finish up extension object
-					ExtensionModel currentExtension = (ExtensionModel) objectStack.pop();
-					PluginModel parent = (PluginModel) objectStack.peek();
-					currentExtension.setParent(parent);
-					scratchVectors[EXTENSION_INDEX].addElement(currentExtension);
-				}
-				break;
-			case RUNTIME_LIBRARY_STATE :
-				if (elementName.equals(LIBRARY)) {
-					LibraryModel curLibrary = (LibraryModel) objectStack.pop();
-					// Clean up the exports for this library entry
-					Vector exportsVector = (Vector) objectStack.pop();
-					if (exportsVector.size() > 0) {
-						curLibrary.setExports((String[]) exportsVector.toArray(new String[exportsVector.size()]));
-					}
-
-					// Add this library element to the vector "runtime" on the stack
-					Vector libraryVector = (Vector) objectStack.peek();
-					libraryVector.addElement(curLibrary);
-					stateStack.pop();
-				}
-				break;
-			case LIBRARY_EXPORT_STATE :
-				if (elementName.equals(LIBRARY_EXPORT)) {
-					stateStack.pop();
-				}
-				break;
-			case PLUGIN_REQUIRES_IMPORT_STATE :
-				if (elementName.equals(PLUGIN_REQUIRES_IMPORT)) {
-					stateStack.pop();
-				}
-				break;
-			case CONFIGURATION_ELEMENT_STATE :
-				// We don't care what the element name was
-				stateStack.pop();
-				// Now finish up the configuration element object
-				ConfigurationElementModel currentConfigElement = (ConfigurationElementModel) objectStack.pop();
-
-				String value = currentConfigElement.getValueAsIs();
-				if (value != null) {
-					currentConfigElement.setValue(value.trim());
-				}
-
-				Object parent = objectStack.peek();
-				currentConfigElement.setParent(parent);
-				if (((Integer) stateStack.peek()).intValue() == PLUGIN_EXTENSION_STATE) {
-					// Want to add this configuration element to the subelements of an extension
-					ConfigurationElementModel[] oldValues = (ConfigurationElementModel[]) ((ExtensionModel) parent).getSubElements();
-					int size = (oldValues == null) ? 0 : oldValues.length;
-					ConfigurationElementModel[] newValues = new ConfigurationElementModel[size + 1];
-					for (int i = 0; i < size; i++) {
-						newValues[i] = oldValues[i];
-					}
-					newValues[size] = currentConfigElement;
-					((ExtensionModel) parent).setSubElements(newValues);
-				} else {
-					ConfigurationElementModel[] oldValues = (ConfigurationElementModel[]) ((ConfigurationElementModel) parent).getSubElements();
-					int size = (oldValues == null) ? 0 : oldValues.length;
-					ConfigurationElementModel[] newValues = new ConfigurationElementModel[size + 1];
-					for (int i = 0; i < size; i++) {
-						newValues[i] = oldValues[i];
-					}
-					newValues[size] = currentConfigElement;
-					((ConfigurationElementModel) parent).setSubElements(newValues);
-				}
-				break;
-		}
-	}
-
-	public void error(SAXParseException ex) {
-		logStatus(ex);
-	}
-
-	public void fatalError(SAXParseException ex) throws SAXException {
-		logStatus(ex);
-		throw ex;
-	}
-
-	public void handleExtensionPointState(String elementName, Attributes attributes) {
-
-		// We ignore all elements under extension points (if there are any)
-		stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-		internalError(NLS.bind(Messages.parse_unknownElement, EXTENSION_POINT, elementName));
-	}
-
-	public void handleExtensionState(String elementName, Attributes attributes) {
-
-		// You need to change the state here even though we will be executing the same
-		// code for ExtensionState and ConfigurationElementState.  We ignore the name
-		// of the element for ConfigurationElements.  When we are wrapping up, we will
-		// want to add each configuration element object to the subElements vector of
-		// its parent configuration element object.  However, the first configuration
-		// element object we created (the last one we pop off the stack) will need to
-		// be added to a vector in the extension object called _configuration.
-		stateStack.push(new Integer(CONFIGURATION_ELEMENT_STATE));
-
-		// create a new Configuration Element and push it onto the object stack
-		ConfigurationElementModel currentConfigurationElement = factory.createConfigurationElement();
-		objectStack.push(currentConfigurationElement);
-		currentConfigurationElement.setName(elementName);
-
-		// Processing the attributes of a configuration element involves creating
-		// a new configuration property for each attribute and populating the configuration
-		// property with the name/value pair of the attribute.  Note there will be one
-		// configuration property for each attribute
-		parseConfigurationElementAttributes(attributes);
-	}
-
-	public void handleInitialState(String elementName, Attributes attributes) {
-		if (elementName.equals(PLUGIN)) {
-			stateStack.push(new Integer(PLUGIN_STATE));
-			parsePluginAttributes(attributes);
-		} else if (elementName.equals(FRAGMENT)) {
-			stateStack.push(new Integer(FRAGMENT_STATE));
-			parseFragmentAttributes(attributes);
-		} else {
-			stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-			internalError(NLS.bind(Messages.parse_unknownTopElement, elementName));
-		}
-	}
-
-	public void handleLibraryExportState(String elementName, Attributes attributes) {
-
-		// All elements ignored.
-		stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-		internalError(NLS.bind(Messages.parse_unknownElement, LIBRARY_EXPORT, elementName));
-	}
-
-	public void handleLibraryState(String elementName, Attributes attributes) {
-		if (elementName.equals(LIBRARY_EXPORT)) {
-			// Change State
-			stateStack.push(new Integer(LIBRARY_EXPORT_STATE));
-			// The top element on the stack much be a library element
-			LibraryModel currentLib = (LibraryModel) objectStack.peek();
-
-			if (attributes == null)
-				return;
-
-			String maskValue = null;
-
-			// Process Attributes
-			int len = attributes.getLength();
-			for (int i = 0; i < len; i++) {
-				String attrName = attributes.getLocalName(i);
-				String attrValue = attributes.getValue(i).trim();
-
-				if (attrName.equals(LIBRARY_EXPORT_MASK))
-					maskValue = attrValue;
-				else
-					internalError(NLS.bind(Messages.parse_unknownAttribute, LIBRARY, attrName));
-			}
-
-			// set up mask tables
-			// pop off the library - already in currentLib
-			objectStack.pop();
-			Vector exportMask = (Vector) objectStack.peek();
-			// push library back on
-			objectStack.push(currentLib);
-			if ((maskValue != null) && (!exportMask.contains(maskValue)))
-				exportMask.addElement(maskValue);
-			return;
-		}
-
-		if (elementName.equals(LIBRARY_PACKAGES)) {
-			LibraryModel currentLib = (LibraryModel) objectStack.peek();
-			if (attributes == null)
-				return;
-			for (int i = 0; i < attributes.getLength(); i++) {
-				if (LIBRARY_PACKAGES_PREFIXES.equals(attributes.getLocalName(i))) {
-					String line = attributes.getValue(i);
-					String[] prefixes = getArrayFromList(line);
-					currentLib.setPackagePrefixes(prefixes);
-				}
-			}
-			return;
-		}
-
-		// Any other element is invalid
-		stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-		internalError(NLS.bind(Messages.parse_unknownElement, LIBRARY, elementName));
-		return;
-	}
-
-	/**
-	 * convert a list of comma-separated tokens into an array
-	 */
-	protected static String[] getArrayFromList(String line) {
-		if (line == null || line.trim().length() == 0)
-			return null;
-		Vector list = new Vector();
-		StringTokenizer tokens = new StringTokenizer(line, ","); //$NON-NLS-1$
-		while (tokens.hasMoreTokens()) {
-			String token = tokens.nextToken().trim();
-			if (token.length() != 0)
-				list.addElement(token);
-		}
-		return list.isEmpty() ? null : (String[]) list.toArray(new String[0]);
-	}
-
-	public void handlePluginState(String elementName, Attributes attributes) {
-
-		if (elementName.equals(RUNTIME)) {
-			// We should only have one Runtime element in a plugin or fragment
-			Object whatIsIt = objectStack.peek();
-			if (((whatIsIt instanceof PluginDescriptorModel) && (((PluginDescriptorModel) objectStack.peek()).getRuntime() != null)) || ((whatIsIt instanceof PluginFragmentModel) && (((PluginFragmentModel) objectStack.peek()).getRuntime() != null))) {
-				// This is at least the 2nd Runtime element we have
-				// hit.  Ignore it and give an error.
-				stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-				return;
-			}
-			stateStack.push(new Integer(PLUGIN_RUNTIME_STATE));
-			// Push a new vector to hold all the library entries
-			objectStack.push(new Vector());
-			return;
-		}
-		if (elementName.equals(PLUGIN_REQUIRES)) {
-			stateStack.push(new Integer(PLUGIN_REQUIRES_STATE));
-			// Push a new vector to hold all the prerequisites
-			objectStack.push(new Vector());
-			parseRequiresAttributes(attributes);
-			return;
-		}
-		if (elementName.equals(EXTENSION_POINT)) {
-			stateStack.push(new Integer(PLUGIN_EXTENSION_POINT_STATE));
-			parseExtensionPointAttributes(attributes);
-			return;
-		}
-		if (elementName.equals(EXTENSION)) {
-			stateStack.push(new Integer(PLUGIN_EXTENSION_STATE));
-			parseExtensionAttributes(attributes);
-			return;
-		}
-
-		// If we get to this point, the element name is one we don't currently accept.
-		// Set the state to indicate that this element will be ignored
-		stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-		internalError(NLS.bind(Messages.parse_unknownElement, PLUGIN + " / " + FRAGMENT, elementName)); //$NON-NLS-1$ 
-	}
-
-	public void handleRequiresImportState(String elementName, Attributes attributes) {
-
-		// All elements ignored.
-		stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-		internalError(NLS.bind(Messages.parse_unknownElement, PLUGIN_REQUIRES_IMPORT, elementName));
-	}
-
-	public void handleRequiresState(String elementName, Attributes attributes) {
-
-		if (elementName.equals(PLUGIN_REQUIRES_IMPORT)) {
-			parsePluginRequiresImport(attributes);
-			return;
-		}
-		// If we get to this point, the element name is one we don't currently accept.
-		// Set the state to indicate that this element will be ignored
-		stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-		internalError(NLS.bind(Messages.parse_unknownElement, PLUGIN_REQUIRES, elementName));
-	}
-
-	public void handleRuntimeState(String elementName, Attributes attributes) {
-
-		if (elementName.equals(LIBRARY)) {
-			// Change State
-			stateStack.push(new Integer(RUNTIME_LIBRARY_STATE));
-			// Process library attributes
-			parseLibraryAttributes(attributes);
-			return;
-		}
-		// If we get to this point, the element name is one we don't currently accept.
-		// Set the state to indicate that this element will be ignored
-		stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-		internalError(NLS.bind(Messages.parse_unknownElement, RUNTIME, elementName));
-	}
-
-	public void ignoreableWhitespace(char[] ch, int start, int length) {
-	}
-
-	private void logStatus(SAXParseException ex) {
-		String name = ex.getSystemId();
-		if (name == null)
-			name = locationName;
-		if (name == null)
-			name = ""; //$NON-NLS-1$
-		else
-			name = name.substring(1 + name.lastIndexOf("/")); //$NON-NLS-1$
-
-		String msg;
-		if (name.equals("")) //$NON-NLS-1$
-			msg = NLS.bind(Messages.parse_error, ex.getMessage());
-		else
-			msg = NLS.bind(Messages.parse_errorNameLineColumn, (new String[] {name, Integer.toString(ex.getLineNumber()), Integer.toString(ex.getColumnNumber()), ex.getMessage()}));
-		factory.error(new Status(IStatus.WARNING, Platform.PI_RUNTIME, Platform.PARSE_PROBLEM, msg, ex));
-	}
-
-	synchronized public PluginModel parsePlugin(InputSource in) throws Exception {
-		SAXParserFactory factory = acquireXMLParsing();
-		if (factory == null)
-			return null; // TODO we log an error
-
-		try {
-			locationName = in.getSystemId();
-			factory.setNamespaceAware(true);
-			factory.setNamespaceAware(true);
-			try {
-				factory.setFeature("http://xml.org/sax/features/string-interning", true); //$NON-NLS-1$
-			} catch (SAXException se) {
-				// ignore; we can still operate without string-interning
-			}
-			factory.setValidating(false);
-			factory.newSAXParser().parse(in, this);
-			return (PluginModel) objectStack.pop();
-		} finally {
-			releaseXMLParsing();
-		}
-	}
-
-	private SAXParserFactory acquireXMLParsing() {
-		parserReference = InternalPlatform.getDefault().getBundleContext().getServiceReference("javax.xml.parsers.SAXParserFactory"); //$NON-NLS-1$
-		if (parserReference == null)
-			return null;
-		return (SAXParserFactory) InternalPlatform.getDefault().getBundleContext().getService(parserReference);
-	}
-
-	private void releaseXMLParsing() {
-		if (parserReference != null)
-			InternalPlatform.getDefault().getBundleContext().ungetService(parserReference);
-	}
-
-	public void parseConfigurationElementAttributes(Attributes attributes) {
-
-		ConfigurationElementModel parentConfigurationElement = (ConfigurationElementModel) objectStack.peek();
-		parentConfigurationElement.setStartLine(locator.getLineNumber());
-
-		Vector propVector = null;
-
-		// process attributes
-		int len = (attributes != null) ? attributes.getLength() : 0;
-		if (len == 0)
-			return;
-		propVector = new Vector();
-
-		for (int i = 0; i < len; i++) {
-			String attrName = attributes.getLocalName(i);
-			String attrValue = attributes.getValue(i);
-
-			ConfigurationPropertyModel currentConfigurationProperty = factory.createConfigurationProperty();
-			currentConfigurationProperty.setName(attrName);
-			currentConfigurationProperty.setValue(attrValue);
-			propVector.addElement(currentConfigurationProperty);
-		}
-		parentConfigurationElement.setProperties((ConfigurationPropertyModel[]) propVector.toArray(new ConfigurationPropertyModel[propVector.size()]));
-		propVector = null;
-	}
-
-	public void parseExtensionAttributes(Attributes attributes) {
-
-		PluginModel parent = (PluginModel) objectStack.peek();
-		ExtensionModel currentExtension = factory.createExtension();
-		currentExtension.setStartLine(locator.getLineNumber());
-		objectStack.push(currentExtension);
-
-		// Process Attributes
-		int len = (attributes != null) ? attributes.getLength() : 0;
-		for (int i = 0; i < len; i++) {
-			String attrName = attributes.getLocalName(i);
-			String attrValue = attributes.getValue(i).trim();
-
-			if (attrName.equals(EXTENSION_NAME))
-				currentExtension.setName(attrValue);
-			else if (attrName.equals(EXTENSION_ID))
-				currentExtension.setId(attrValue);
-			else if (attrName.equals(EXTENSION_TARGET)) {
-				// check if point is specified as a simple or qualified name
-				String targetName;
-				if (attrValue.lastIndexOf('.') == -1) {
-					String baseId = parent instanceof PluginDescriptorModel ? parent.getId() : ((PluginFragmentModel) parent).getPlugin();
-					targetName = baseId + "." + attrValue; //$NON-NLS-1$
-				} else
-					targetName = attrValue;
-				currentExtension.setExtensionPoint(targetName);
-			} else
-				internalError(NLS.bind(Messages.parse_unknownAttribute, EXTENSION, attrName));
-		}
-	}
-
-	public void parseExtensionPointAttributes(Attributes attributes) {
-
-		ExtensionPointModel currentExtPoint = factory.createExtensionPoint();
-		currentExtPoint.setStartLine(locator.getLineNumber());
-
-		// Process Attributes
-		int len = (attributes != null) ? attributes.getLength() : 0;
-		for (int i = 0; i < len; i++) {
-			String attrName = attributes.getLocalName(i);
-			String attrValue = attributes.getValue(i).trim();
-
-			if (attrName.equals(EXTENSION_POINT_NAME))
-				currentExtPoint.setName(attrValue);
-			else if (attrName.equals(EXTENSION_POINT_ID))
-				currentExtPoint.setId(attrValue);
-			else if (attrName.equals(EXTENSION_POINT_SCHEMA))
-				currentExtPoint.setSchema(attrValue);
-			else
-				internalError(NLS.bind(Messages.parse_unknownAttribute, EXTENSION_POINT, attrName));
-		}
-		// currentExtPoint contains a pointer to the parent plugin descriptor.
-		PluginModel root = (PluginModel) objectStack.peek();
-		currentExtPoint.setParent(root);
-
-		// Now populate the the vector just below us on the objectStack with this extension point
-		scratchVectors[EXTENSION_POINT_INDEX].addElement(currentExtPoint);
-	}
-
-	public void parseFragmentAttributes(Attributes attributes) {
-		PluginFragmentModel current = factory.createPluginFragment();
-		current.setStartLine(locator.getLineNumber());
-		objectStack.push(current);
-
-		// process attributes
-		int len = attributes.getLength();
-		for (int i = 0; i < len; i++) {
-			String attrName = attributes.getLocalName(i);
-			String attrValue = attributes.getValue(i).trim();
-
-			if (attrName.equals(FRAGMENT_ID))
-				current.setId(attrValue);
-			else if (attrName.equals(FRAGMENT_NAME))
-				current.setName(attrValue);
-			else if (attrName.equals(FRAGMENT_VERSION))
-				current.setVersion(attrValue);
-			else if (attrName.equals(FRAGMENT_PROVIDER))
-				current.setProviderName(attrValue);
-			else if (attrName.equals(FRAGMENT_PLUGIN_ID))
-				current.setPlugin(attrValue);
-			else if (attrName.equals(FRAGMENT_PLUGIN_VERSION))
-				current.setPluginVersion(attrValue);
-			else if (attrName.equals(FRAGMENT_PLUGIN_MATCH)) {
-				if (FRAGMENT_PLUGIN_MATCH_PERFECT.equals(attrValue))
-					current.setMatch(PluginFragmentModel.FRAGMENT_MATCH_PERFECT);
-				else if (FRAGMENT_PLUGIN_MATCH_EQUIVALENT.equals(attrValue))
-					current.setMatch(PluginFragmentModel.FRAGMENT_MATCH_EQUIVALENT);
-				else if (FRAGMENT_PLUGIN_MATCH_COMPATIBLE.equals(attrValue))
-					current.setMatch(PluginFragmentModel.FRAGMENT_MATCH_COMPATIBLE);
-				else if (FRAGMENT_PLUGIN_MATCH_GREATER_OR_EQUAL.equals(attrValue))
-					current.setMatch(PluginFragmentModel.FRAGMENT_MATCH_GREATER_OR_EQUAL);
-				else
-					internalError(NLS.bind(Messages.parse_validMatch, attrValue));
-			} else
-				internalError(NLS.bind(Messages.parse_unknownAttribute, FRAGMENT, attrName));
-		}
-	}
-
-	public void parseLibraryAttributes(Attributes attributes) {
-		// Push a vector to hold the export mask 
-		objectStack.push(new Vector());
-		LibraryModel current = factory.createLibrary();
-		current.setStartLine(locator.getLineNumber());
-		objectStack.push(current);
-
-		// Now the objectStack should contain the following:
-		//	plugin descriptor or fragment (bottom of the stack)
-		//	vector to hold all the library entries
-		//  vector to hold the export mask for this library entry
-		//  this library entry (top of the stack)
-
-		// process attributes
-		int len = (attributes != null) ? attributes.getLength() : 0;
-		for (int i = 0; i < len; i++) {
-			String attrName = attributes.getLocalName(i);
-			String attrValue = attributes.getValue(i).trim();
-
-			if (attrName.equals(LIBRARY_NAME))
-				current.setName(attrValue);
-			else if (attrName.equals(LIBRARY_TYPE)) {
-				attrValue = attrValue.toLowerCase();
-				if (attrValue.equals(LibraryModel.CODE) || attrValue.equals(LibraryModel.RESOURCE))
-					current.setType(attrValue.toLowerCase());
-				else
-					internalError(NLS.bind(Messages.parse_unknownLibraryType, attrValue, current.getName()));
-			} else
-				internalError(NLS.bind(Messages.parse_unknownAttribute, LIBRARY, attrName));
-		}
-	}
-
-	public void parsePluginAttributes(Attributes attributes) {
-
-		PluginDescriptorModel current = factory.createPluginDescriptor();
-		current.setStartLine(locator.getLineNumber());
-		objectStack.push(current);
-
-		// process attributes
-		int len = attributes.getLength();
-		for (int i = 0; i < len; i++) {
-			String attrName = attributes.getLocalName(i);
-			String attrValue = attributes.getValue(i).trim();
-
-			if (attrName.equals(PLUGIN_ID))
-				current.setId(attrValue);
-			else if (attrName.equals(PLUGIN_NAME))
-				current.setName(attrValue);
-			else if (attrName.equals(PLUGIN_VERSION))
-				current.setVersion(attrValue);
-			else if (attrName.equals(PLUGIN_VENDOR) || (attrName.equals(PLUGIN_PROVIDER)))
-				current.setProviderName(attrValue);
-			else if (attrName.equals(PLUGIN_CLASS))
-				current.setPluginClass(attrValue);
-			else
-				internalError(NLS.bind(Messages.parse_unknownAttribute, PLUGIN, attrName));
-		}
-	}
-
-	public void parsePluginRequiresImport(Attributes attributes) {
-		PluginPrerequisiteModel current = factory.createPluginPrerequisite();
-		current.setStartLine(locator.getLineNumber());
-
-		// process attributes
-		int len = (attributes != null) ? attributes.getLength() : 0;
-		for (int i = 0; i < len; i++) {
-			String attrName = attributes.getLocalName(i);
-			String attrValue = attributes.getValue(i).trim();
-
-			if (attrName.equals(PLUGIN_REQUIRES_PLUGIN))
-				current.setPlugin(attrValue);
-			else if (attrName.equals(PLUGIN_REQUIRES_PLUGIN_VERSION))
-				current.setVersion(attrValue);
-			else if (attrName.equals(PLUGIN_REQUIRES_OPTIONAL))
-				current.setOptional(TRUE.equalsIgnoreCase(attrValue));
-			else if (attrName.equals(PLUGIN_REQUIRES_MATCH)) {
-				if (PLUGIN_REQUIRES_MATCH_PERFECT.equals(attrValue))
-					current.setMatchByte(PluginPrerequisiteModel.PREREQ_MATCH_PERFECT);
-				else if ((PLUGIN_REQUIRES_MATCH_EQUIVALENT.equals(attrValue)) || (PLUGIN_REQUIRES_MATCH_EXACT.equals(attrValue)))
-					current.setMatchByte(PluginPrerequisiteModel.PREREQ_MATCH_EQUIVALENT);
-				else if (PLUGIN_REQUIRES_MATCH_COMPATIBLE.equals(attrValue))
-					current.setMatchByte(PluginPrerequisiteModel.PREREQ_MATCH_COMPATIBLE);
-				else if (PLUGIN_REQUIRES_MATCH_GREATER_OR_EQUAL.equals(attrValue))
-					current.setMatchByte(PluginPrerequisiteModel.PREREQ_MATCH_GREATER_OR_EQUAL);
-				else
-					internalError(NLS.bind(Messages.parse_validMatch, attrValue));
-			} else if (attrName.equals(PLUGIN_REQUIRES_EXPORT)) {
-				if (TRUE.equals(attrValue))
-					current.setExport(true);
-				else if (FALSE.equals(attrValue))
-					current.setExport(false);
-				else
-					internalError(NLS.bind(Messages.parse_validExport, attrValue));
-			} else
-				internalError(NLS.bind(Messages.parse_unknownAttribute, PLUGIN_REQUIRES_IMPORT, attrName));
-
-		}
-		// Populate the vector of prerequisites with this new element
-		((Vector) objectStack.peek()).addElement(current);
-	}
-
-	public void parseRequiresAttributes(Attributes attributes) {
-	}
-
-	static String replace(String s, String from, String to) {
-		String str = s;
-		int fromLen = from.length();
-		int toLen = to.length();
-		int ix = str.indexOf(from);
-		while (ix != -1) {
-			str = str.substring(0, ix) + to + str.substring(ix + fromLen);
-			ix = str.indexOf(from, ix + toLen);
-		}
-		return str;
-	}
-
-	public void startDocument() {
-		stateStack.push(new Integer(INITIAL_STATE));
-		for (int i = 0; i <= LAST_INDEX; i++) {
-			scratchVectors[i] = new Vector();
-		}
-	}
-
-	public void startElement(String uri, String elementName, String qName, Attributes attributes) {
-		switch (((Integer) stateStack.peek()).intValue()) {
-			case INITIAL_STATE :
-				handleInitialState(elementName, attributes);
-				break;
-			case FRAGMENT_STATE :
-				handlePluginState(elementName, attributes);
-				break;
-			case PLUGIN_STATE :
-				handlePluginState(elementName, attributes);
-				break;
-			case PLUGIN_RUNTIME_STATE :
-				handleRuntimeState(elementName, attributes);
-				break;
-			case PLUGIN_REQUIRES_STATE :
-				handleRequiresState(elementName, attributes);
-				break;
-			case PLUGIN_EXTENSION_POINT_STATE :
-				handleExtensionPointState(elementName, attributes);
-				break;
-			case PLUGIN_EXTENSION_STATE :
-			case CONFIGURATION_ELEMENT_STATE :
-				handleExtensionState(elementName, attributes);
-				break;
-			case RUNTIME_LIBRARY_STATE :
-				handleLibraryState(elementName, attributes);
-				break;
-			case LIBRARY_EXPORT_STATE :
-				handleLibraryExportState(elementName, attributes);
-				break;
-			case PLUGIN_REQUIRES_IMPORT_STATE :
-				handleRequiresImportState(elementName, attributes);
-				break;
-			default :
-				stateStack.push(new Integer(IGNORED_ELEMENT_STATE));
-				internalError(NLS.bind(Messages.parse_unknownTopElement, elementName));
-		}
-	}
-
-	public void warning(SAXParseException ex) {
-		logStatus(ex);
-	}
-
-	private void internalError(String message) {
-		if (locationName != null)
-			factory.error(new Status(IStatus.WARNING, Platform.PI_RUNTIME, Platform.PARSE_PROBLEM, locationName + ": " + message, null)); //$NON-NLS-1$
-		else
-			factory.error(new Status(IStatus.WARNING, Platform.PI_RUNTIME, Platform.PARSE_PROBLEM, message, null));
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/RegistryLoader.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/RegistryLoader.java
deleted file mode 100644
index 53bf9ef..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/RegistryLoader.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.model;
-
-import java.io.*;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Properties;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.internal.runtime.Messages;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.model.*;
-import org.eclipse.osgi.util.NLS;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXParseException;
-
-public class RegistryLoader {
-	private Factory factory;
-
-	// debug support
-	private boolean debug = false;
-	private long lastTick = System.currentTimeMillis();//used for performance timing
-
-	private RegistryLoader(Factory factory, boolean debug) {
-		super();
-		this.debug = debug;
-		this.factory = factory;
-	}
-
-	private void debug(String msg) {
-		long thisTick = System.currentTimeMillis();
-		System.out.println("RegistryLoader: " + msg + " [+" + (thisTick - lastTick) + "ms]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		lastTick = thisTick;
-	}
-
-	private String[] getPathMembers(URL path) {
-		String[] list = null;
-		String protocol = path.getProtocol();
-		if (protocol.equals("file")) { //$NON-NLS-1$
-			list = (new File(path.getFile())).list();
-		} else {
-			// XXX: attempt to read URL and see if we got html dir page
-		}
-		return list == null ? new String[0] : list;
-	}
-
-	/**
-	 * Reports an error and returns true.
-	 */
-	private boolean parseProblem(String message) {
-		factory.error(new Status(IStatus.WARNING, Platform.PI_RUNTIME, Platform.PARSE_PROBLEM, message, null));
-		return true;
-	}
-
-	private PluginRegistryModel parseRegistry(URL[] pluginPath) {
-		long startTick = System.currentTimeMillis();
-		PluginRegistryModel result = processManifestFiles(pluginPath);
-		if (InternalPlatform.DEBUG) {
-			long endTick = System.currentTimeMillis();
-			debug("Parsed Registry: " + (endTick - startTick) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return result;
-	}
-
-	public static PluginRegistryModel parseRegistry(URL[] pluginPath, Factory factory, boolean debug) {
-		return new RegistryLoader(factory, debug).parseRegistry(pluginPath);
-	}
-
-	private PluginModel processManifestFile(URL manifest) {
-		InputStream is = null;
-		try {
-			is = manifest.openStream();
-		} catch (IOException e) {
-			if (debug)
-				debug("No plugin found for: " + manifest); //$NON-NLS-1$
-			return null;
-		}
-		PluginModel result = null;
-		try {
-			try {
-				InputSource in = new InputSource(is);
-				// Give the system id a value in case we want it for
-				// error reporting within the parser.
-				in.setSystemId(manifest.getFile());
-				result = new PluginParser((Factory) factory).parsePlugin(in);
-			} finally {
-				is.close();
-			}
-		} catch (SAXParseException se) {
-			/* exception details logged by parser */
-			factory.error(new Status(IStatus.WARNING, Platform.PI_RUNTIME, Platform.PARSE_PROBLEM, NLS.bind(Messages.parse_errorProcessing, manifest), null));
-		} catch (Exception e) {
-			factory.error(new Status(IStatus.WARNING, Platform.PI_RUNTIME, Platform.PARSE_PROBLEM, NLS.bind(Messages.parse_errorProcessing, manifest + ":  " + e.getMessage()), null)); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	private PluginRegistryModel processManifestFiles(URL[] pluginPath) {
-		PluginRegistryModel result = factory.createPluginRegistry();
-		for (int i = 0; i < pluginPath.length; i++)
-			processPluginPathEntry(result, pluginPath[i]);
-		return result;
-	}
-
-	private void processPluginPathEntry(PluginRegistryModel registry, URL location) {
-		if (debug)
-			debug("Path - " + location); //$NON-NLS-1$
-		if (location.getFile().endsWith("/")) { //$NON-NLS-1$
-			// directory entry - search for plugins
-			String[] members = getPathMembers(location);
-			for (int j = 0; j < members.length; j++) {
-				boolean found = false;
-				try {
-					found = processPluginPathFile(registry, new URL(location, members[j] + "/plugin.xml")); //$NON-NLS-1$
-					if (!found)
-						found = processPluginPathFile(registry, new URL(location, members[j] + "/fragment.xml")); //$NON-NLS-1$
-				} catch (MalformedURLException e) {
-					// Skip bad URLs
-				}
-				if (debug)
-					debug(found ? "Processed - " : "Processed (not found) - " + members[j]); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} else {
-			// specific file entry - load the given file
-			boolean found = processPluginPathFile(registry, location);
-			if (debug)
-				debug(found ? "Processed - " : "Processed (not found) - " + location); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * @return true if a file was found at the given location, and false otherwise.
-	 */
-	private boolean processPluginPathFile(PluginRegistryModel registry, URL location) {
-		PluginModel entry = processManifestFile(location);
-		if (entry == null)
-			return false;
-		// Make sure all the required fields are here.
-		// This prevents us from things like NullPointerExceptions
-		// when we are assuming a field exists.
-		if (!requiredPluginModel(entry, location)) {
-			entry = null;
-			return false;
-		}
-		entry.setVersion(getQualifiedVersion(entry, location)); // check for version qualifier
-		if (entry instanceof PluginDescriptorModel) {
-			if (entry.getId() == null || entry.getVersion() == null) {
-				return parseProblem(NLS.bind(Messages.parse_nullPluginIdentifier, location));
-			}
-			//skip duplicate entries
-			if (registry.getPlugin(entry.getId(), entry.getVersion()) != null) {
-				return parseProblem(NLS.bind(Messages.parse_duplicatePlugin, entry.getId(), location));
-			}
-			registry.addPlugin((PluginDescriptorModel) entry);
-		} else {
-			if (entry.getId() == null || entry.getVersion() == null) {
-				return parseProblem(NLS.bind(Messages.parse_nullFragmentIdentifier, location));
-			}
-			if (entry instanceof PluginFragmentModel) {
-				registry.addFragment((PluginFragmentModel) entry);
-			} else {
-				return parseProblem(NLS.bind(Messages.parse_unknownEntry, location));
-			}
-		}
-		String url = location.toString();
-		url = url.substring(0, 1 + url.lastIndexOf('/'));
-		entry.setRegistry(registry);
-		entry.setLocation(url);
-		// this is for the registry cache
-		// InternalPlatform.addLastModifiedTime(location.getFile(), new File(location.getFile()).lastModified());
-		return true;
-	}
-
-	private String getQualifiedVersion(PluginModel entry, URL base) {
-		if (entry == null || entry.getVersion() == null || entry.getId() == null)
-			return null;
-
-		InputStream is = null;
-		try {
-			// check to see if we have buildmanifest.properties for this plugin
-			URL manifest = null;
-			manifest = new URL(base, "buildmanifest.properties"); //$NON-NLS-1$
-			Properties props = new Properties();
-			is = manifest.openStream();
-			props.load(is);
-
-			// lookup qualifier for this plugin and "morph" the identifier if needed
-			String key = "plugin@" + entry.getId(); //$NON-NLS-1$
-			String qualifier = props.getProperty(key);
-			if (qualifier == null)
-				return entry.getVersion();
-			PluginVersionIdentifier v = new PluginVersionIdentifier(entry.getVersion());
-			if (!v.getQualifierComponent().equals("")) //$NON-NLS-1$
-				return entry.getVersion();
-			else
-				return (new PluginVersionIdentifier(v.getMajorComponent(), v.getMinorComponent(), v.getServiceComponent(), qualifier)).toString();
-		} catch (Exception e) {
-			return entry.getVersion();
-		} finally {
-			if (is != null)
-				try {
-					is.close();
-				} catch (IOException e) {
-					// Don't throw anything back if the close fails
-				}
-		}
-	}
-
-	private boolean requiredPluginModel(PluginModel plugin, URL location) {
-		String name = plugin.getName();
-		String id = plugin.getId();
-		String version = plugin.getVersion();
-		int nameLength = name == null ? 0 : name.length();
-		int idLength = id == null ? 0 : id.length();
-		int versionLength = version == null ? 0 : version.length();
-
-		if (nameLength <= 0) {
-			parseProblem(NLS.bind(Messages.parse_missingPluginName, location));
-			return false;
-		}
-		if (idLength <= 0) {
-			parseProblem(NLS.bind(Messages.parse_missingPluginId, location));
-			return false;
-		}
-		if (versionLength <= 0) {
-			parseProblem(NLS.bind(Messages.parse_missingPluginVersion, location));
-			return false;
-		}
-
-		if (plugin instanceof PluginFragmentModel) {
-			String pluginName = ((PluginFragmentModel) plugin).getPlugin();
-			String pluginVersion = ((PluginFragmentModel) plugin).getPluginVersion();
-			int pNameLength = pluginName == null ? 0 : pluginName.length();
-			int pNameVersion = pluginVersion == null ? 0 : pluginVersion.length();
-			if (pNameLength <= 0) {
-				parseProblem(NLS.bind(Messages.parse_missingFPName, location));
-				return false;
-			}
-			if (pNameVersion <= 0) {
-				parseProblem(NLS.bind(Messages.parse_missingFPVersion, location));
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/RegistryResolver.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/RegistryResolver.java
deleted file mode 100644
index 97ca87d..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/internal/model/RegistryResolver.java
+++ /dev/null
@@ -1,1357 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.model;
-
-import java.util.*;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.internal.runtime.Messages;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.model.*;
-import org.eclipse.osgi.util.NLS;
-
-public class RegistryResolver {
-
-	private Map idmap;
-	private PluginRegistryModel reg;
-	private MultiStatus status;
-	private boolean trimPlugins = true;
-	private boolean crossLink = true;
-
-	private boolean DEBUG_RESOLVE = false;
-	private static final String OPTION_DEBUG_RESOLVE = "org.eclipse.core.runtime/registry/debug/resolve"; //$NON-NLS-1$
-
-	// constraint entry
-	// A constraint is made for each relationship where 'parent' requires 'prq'.
-	// ver is the version number we must try to match.  It can be null if we just
-	// want to match the latest.
-	// cEntry points to the parent ConstraintsEntry element.
-	private class Constraint {
-		private PluginDescriptorModel parent;
-		private PluginPrerequisiteModel prq;
-		private PluginVersionIdentifier ver;
-		private byte type = PluginPrerequisiteModel.PREREQ_MATCH_UNSPECIFIED;
-		private ConstraintsEntry cEntry = null;
-
-		private Constraint(PluginDescriptorModel parent, PluginPrerequisiteModel prq) {
-			this.parent = parent;
-			this.prq = prq;
-			if (prq != null) {
-				ver = RegistryResolver.this.getVersionIdentifier(prq);
-				type = prq.getMatchByte();
-				if ((ver != null) && (type == PluginPrerequisiteModel.PREREQ_MATCH_UNSPECIFIED))
-					type = PluginPrerequisiteModel.PREREQ_MATCH_COMPATIBLE;
-			}
-		}
-
-		private int getMatchType() {
-			return type;
-		}
-
-		private ConstraintsEntry getConstraintsEntry() {
-			return cEntry;
-		}
-
-		private void setConstraintsEntry(ConstraintsEntry entry) {
-			cEntry = entry;
-		}
-
-		private PluginDescriptorModel getParent() {
-			return parent;
-		}
-
-		private PluginPrerequisiteModel getPrerequisite() {
-			return prq;
-		}
-
-		private PluginVersionIdentifier getVersionIdentifier() {
-			return ver;
-		}
-
-		public String toString() {
-			if (prq == null)
-				return "(null)"; //$NON-NLS-1$
-			String s = parent.toString() + "->" + prq.getPlugin(); //$NON-NLS-1$
-			switch (prq.getMatchByte()) {
-				case PluginPrerequisiteModel.PREREQ_MATCH_UNSPECIFIED :
-					s += "(any)"; //$NON-NLS-1$
-					break;
-				case PluginPrerequisiteModel.PREREQ_MATCH_PERFECT :
-					s += IModel.PLUGIN_REQUIRES_MATCH_PERFECT;
-					break;
-				case PluginPrerequisiteModel.PREREQ_MATCH_EQUIVALENT :
-					s += IModel.PLUGIN_REQUIRES_MATCH_EQUIVALENT;
-					break;
-				case PluginPrerequisiteModel.PREREQ_MATCH_COMPATIBLE :
-					s += IModel.PLUGIN_REQUIRES_MATCH_COMPATIBLE;
-					break;
-				case PluginPrerequisiteModel.PREREQ_MATCH_GREATER_OR_EQUAL :
-					s += IModel.PLUGIN_REQUIRES_MATCH_GREATER_OR_EQUAL;
-					break;
-			}
-			return s;
-		}
-	}
-
-	// constraint index structure
-	// Each time an IndexEntry is created, a single ContraintsEntry
-	// is created and put into the IndexEntry's concurrentList.
-	// Note that the new ConstraintsEntry will always point
-	// back to the IndexEntry it is associated with (parent).
-	// A ConstraintsEntry holds a group of constraints that can be
-	// resolved, without conflict for a particular plugin id.  The
-	// constraints are all of the form where another plugin id 
-	// requires some version of this plugin id as a prerequisite.
-	private class ConstraintsEntry {
-		private IndexEntry parent;
-		private List constraintList = new LinkedList();
-		// lastResolved doesn't seem to be used.  Is it designed to
-		// eliminate the numerous calls to find a matching plugin 
-		// descriptor?  Calls to find a matching plugin descriptor
-		// iterate through each version of this plugin and each 
-		// constraint in each ConstraintsEntry.
-		private PluginDescriptorModel lastResolved = null;
-		private boolean isResolved = false;
-		private PluginDescriptorModel bestMatch = null;
-		private boolean bestMatchEnabled = false;
-
-		private ConstraintsEntry(IndexEntry parent) {
-			// Create a new ConstraintsEntry and point 'parent'
-			// back to the associated IndexEntry
-			this.parent = parent;
-		}
-
-		private int constraintCount() {
-			// Returns the number of Constraint entries in
-			// constraintList.  Initially this will be 0.
-			return constraintList.size();
-		}
-
-		private PluginDescriptorModel addConstraint(Constraint c) {
-			// Add this Constraint to the list of constraints 
-			// for this ConstraintsEntry.  Note that while a
-			// given ConstraintsEntry can have many Constraints,
-			// any Constraint can have only one ConstraintsEntry.
-			// This method will return a single plugin descriptor which
-			// is the most recent descriptor which satisfies this 
-			// constraint.
-			constraintList.add(c);
-			c.setConstraintsEntry(this);
-			// get all of the plugin descriptors which satisfy this 
-			// constraint and all other constraints in this ConstraintsEntry
-			List constrained = getMatchingDescriptors();
-			if (constrained.size() <= 0) {
-				// looks like we have a conflict
-				constraintList.remove(c);
-				c.setConstraintsEntry(null);
-				return null;
-			} else {
-				// match will be only the latest version plugin which 
-				// satisfies these constraints
-				PluginDescriptorModel match = (PluginDescriptorModel) constrained.get(0);
-				if (!match.equals(lastResolved)) {
-					lastResolved = match;
-					isResolved = false;
-				}
-				return match;
-			}
-		}
-
-		private void removeConstraint(Constraint c) {
-			if (DEBUG_RESOLVE)
-				debug("removing constraint " + c.toString()); //$NON-NLS-1$
-			constraintList.remove(c);
-			c.setConstraintsEntry(null);
-			lastResolved = null;
-			isResolved = false;
-		}
-
-		private void removeConstraintFor(PluginPrerequisiteModel prereq) {
-			List remove = new ArrayList();
-			for (Iterator list = constraintList.iterator(); list.hasNext();) {
-				Constraint c = (Constraint) list.next();
-				if (c.getPrerequisite() == prereq)
-					remove.add(c);
-			}
-			for (Iterator list = remove.iterator(); list.hasNext();)
-				removeConstraint((Constraint) list.next());
-		}
-
-		private PluginDescriptorModel getMatchingDescriptor() {
-			// We do this a lot. Can we use some mechanism to 
-			// hold the last matching descriptor and discard
-			// it if the constraints change?
-			List constrained = getMatchingDescriptors();
-			if (constrained.size() <= 0)
-				return null;
-			else
-				return (PluginDescriptorModel) constrained.get(0);
-		}
-
-		private List getMatchingDescriptors() {
-			// The object of the game here is to return a list of plugin
-			// descriptors that match the list of Constraint elements
-			// hanging off this ConstraintsEntry.
-
-			// constrained will be a list of matching plugin descriptors
-			List constrained = new LinkedList();
-
-			for (Iterator list = parent.versions().iterator(); list.hasNext();) {
-				// parent is an IndexEntry and versions is a list of all the 
-				// plugin descriptors, in version order (biggest to smallest),
-				// that have this plugin id.
-				PluginDescriptorModel pd = (PluginDescriptorModel) list.next();
-				if (pd.getEnabled())
-					constrained.add(pd);
-			}
-			// constrained now contains all of the enabled plugin descriptors for
-			// this IndexEntry.  The next step is to remove any that don't fit.
-
-			for (Iterator list = constraintList.iterator(); list.hasNext();) {
-				// For each Constraint, go through all of the versions of this plugin
-				// and remove any from 'constrained' which don't match the criteria
-				// for this Constraint.
-
-				// constraintList is all the Constraint entries for this ConstraintsEntry.
-				Constraint c = (Constraint) list.next();
-				if (c.getMatchType() == PluginPrerequisiteModel.PREREQ_MATCH_UNSPECIFIED)
-					continue;
-				for (Iterator list2 = parent.versions().iterator(); list2.hasNext();) {
-					PluginDescriptorModel pd = (PluginDescriptorModel) list2.next();
-					if (!pd.getEnabled())
-						// ignore disabled plugins
-						continue;
-					switch (c.getMatchType()) {
-						case PluginPrerequisiteModel.PREREQ_MATCH_PERFECT :
-							if (!getVersionIdentifier(pd).isPerfect(c.getVersionIdentifier()))
-								constrained.remove(pd);
-							break;
-						case PluginPrerequisiteModel.PREREQ_MATCH_EQUIVALENT :
-							if (!getVersionIdentifier(pd).isEquivalentTo(c.getVersionIdentifier()))
-								constrained.remove(pd);
-							break;
-						case PluginPrerequisiteModel.PREREQ_MATCH_COMPATIBLE :
-							if (!getVersionIdentifier(pd).isCompatibleWith(c.getVersionIdentifier()))
-								constrained.remove(pd);
-							break;
-						case PluginPrerequisiteModel.PREREQ_MATCH_GREATER_OR_EQUAL :
-							if (!getVersionIdentifier(pd).isGreaterOrEqualTo(c.getVersionIdentifier()))
-								constrained.remove(pd);
-							break;
-					}
-				}
-			}
-
-			// At this point, constrained will contain only those plugin descriptors which
-			// satisfy ALL of the Constraint entries.
-
-			return constrained;
-		}
-
-		private void preresolve(List roots) {
-			// All of the constraints that need to be added, have been.  Now just
-			// pick the plugin descriptor that is a best fit for all of these
-			// constraints.  Root nodes will not have any constraints (since nothing
-			// requires this plugin as a prerequisite, by definition).  For root
-			// node, just pick up the latest version.
-
-			if (constraintList.size() <= 0) {
-				// This should be a root descriptor.  So, just pick up the latest
-				// version of the root.
-				if (roots.contains(parent.getId())) {
-					bestMatch = (PluginDescriptorModel) parent.versions().get(0);
-					if (bestMatch == null) {
-						if (DEBUG_RESOLVE)
-							debug("*ERROR* no resolved descriptor for " + parent.getId()); //$NON-NLS-1$
-					} else
-						bestMatchEnabled = bestMatch.getEnabled();
-				}
-			} else {
-				// If this isn't a root descriptor, get the latest version of the
-				// plugin descriptor which matches all the constraints we have.
-				// Pick the plugin that best matches all the constraints.  Any
-				// allowable conflicts will be in another ConstraintsEntry.
-				bestMatch = getMatchingDescriptor();
-				if (bestMatch == null) {
-					if (DEBUG_RESOLVE)
-						debug("*ERROR* no resolved descriptor for " + parent.getId()); //$NON-NLS-1$
-				} else
-					bestMatchEnabled = true;
-			}
-		}
-
-		private void resolve() {
-			// Assumptions:  All constraints that need to be added, have been.
-			//		- preresolve (above) has been called and a bestMatch (if it 
-			//		exists) has been identified
-			//		- all versions of this plugin have been disabled (so it is
-			//		up to this method to enable the plugin that is a bestMatch
-			//		for all of the constraints in this ConstraintsEntry).
-			if (bestMatch != null) {
-				// All of the versions of this plugin will have been disabled.
-				// Enable only the one which is the best match.
-				// bestMatchEnabled will be set to false if this particular plugin
-				// caused an unresolvable conflict.  Therefore, setEnabled(bestMatchEnabled)
-				// will leave this delinquent plugin disabled.
-				bestMatch.setEnabled(bestMatchEnabled);
-				if (bestMatchEnabled) {
-					if (DEBUG_RESOLVE)
-						debug("configured " + bestMatch.toString()); //$NON-NLS-1$
-					if (constraintList.size() > 0) {
-						for (int i = 0; i < constraintList.size(); i++) {
-							// Put which actual version this prerequisite resolved to in the
-							// relevant prerequisite in the registry.
-							PluginPrerequisiteModel prq = (PluginPrerequisiteModel) ((Constraint) constraintList.get(i)).getPrerequisite();
-							prq.setResolvedVersion(getVersionIdentifier(bestMatch).toString());
-						}
-					}
-				}
-			}
-		}
-
-		private boolean isResolved() {
-			return this.isResolved;
-		}
-
-		private void isResolved(boolean isResolved) {
-			this.isResolved = isResolved;
-		}
-	}
-
-	// plugin descriptor index structure
-	// There is exactly one IndexEntry for each plugin id.
-	// The actual plugin descriptor is an element of verList.
-	// Multiple versions of this plugin id are found in verList
-	// and are ordered from the highest version number (assumed
-	// to be the most recent) to the lowest version number.
-	// concurrentList contains a list of ConstraintsEntry's which
-	// group constraints together into non-conflicting groups.
-	private class IndexEntry {
-		private String id;
-		private List verList = new LinkedList();
-		private List concurrentList = new ArrayList();
-
-		private IndexEntry(String id) {
-			this.id = id;
-			// Create the first ConstraintsEntry with no constraints
-			concurrentList.add(new ConstraintsEntry(this));
-		}
-
-		private String getId() {
-			return id;
-		}
-
-		private ConstraintsEntry getConstraintsEntryFor(Constraint c) {
-			// Each Constraint must have exactly one ConstraintsEntry but
-			// a ConstraintsEntry may have many (non-conflicting) Constraints.
-			ConstraintsEntry ce = c.getConstraintsEntry();
-			if (ce != null)
-				return ce;
-			ce = (ConstraintsEntry) concurrentList.get(0);
-			if (c.getPrerequisite() == null)
-				c.setConstraintsEntry(ce);
-			return ce;
-		}
-
-		private PluginDescriptorModel addConstraint(Constraint c) {
-			int concurrentCount = concurrentList.size();
-
-			// try to find constraits entry that can accommodate new constraint
-			for (Iterator list = concurrentList.iterator(); list.hasNext();) {
-				ConstraintsEntry cie = (ConstraintsEntry) list.next();
-				PluginDescriptorModel pd = cie.addConstraint(c);
-				// If pd comes back null, adding this constraint to the
-				// ConstraintsEntry cie will cause a conflict (no plugin
-				// descriptor can satisfy all the constraints).
-				if (pd != null) {
-
-					// constraint added OK and no concurrency
-					if (concurrentCount <= 1)
-						return pd;
-
-					// constraint added OK but have concurrency
-					if (allowConcurrencyFor(pd))
-						return pd;
-					else {
-						cie.removeConstraint(c); // cannot be concurrent
-						return null;
-					}
-				}
-			}
-
-			// If we get to this point, the constraint we are trying to add
-			// gave us no matching plugins when used in conjunction with the
-			// other constraints in a particular ConstraintsEntry.  Add a
-			// new ConstraintsEntry and put this constraint in it (only if
-			// concurrency is allowed).  Concurrency is allowed only if the
-			// plugin we find which matches this constraint has no extensions
-			// or extension points.
-
-			// attempt to create new constraints entry
-			ConstraintsEntry cie;
-			PluginDescriptorModel pd;
-
-			if (concurrentList.size() == 1) {
-				// ensure base entry allows concurrency
-				cie = (ConstraintsEntry) concurrentList.get(0);
-				pd = cie.getMatchingDescriptor();
-				if (!allowConcurrencyFor(pd))
-					return null;
-			}
-
-			cie = new ConstraintsEntry(this);
-			pd = cie.addConstraint(c);
-			if (pd == null) {
-				cie.removeConstraint(c); // no matching target
-				return null;
-			}
-			if (!allowConcurrencyFor(pd)) {
-				cie.removeConstraint(c); // cannot be concurrent
-				return null;
-			}
-			if (DEBUG_RESOLVE)
-				debug("creating new constraints list in " + id + " for " + c.toString()); //$NON-NLS-1$ //$NON-NLS-2$
-			concurrentList.add(cie);
-			return pd;
-		}
-
-		private boolean allowConcurrencyFor(PluginDescriptorModel pd) {
-			if (pd == null)
-				return false;
-			if (pd.getDeclaredExtensions() != null && pd.getDeclaredExtensions().length > 0)
-				return false;
-			if (pd.getDeclaredExtensionPoints() != null && pd.getDeclaredExtensionPoints().length > 0)
-				return false;
-			return true;
-		}
-
-		private void removeConstraintFor(PluginPrerequisiteModel prereq) {
-			for (Iterator list = concurrentList.iterator(); list.hasNext();)
-				((ConstraintsEntry) list.next()).removeConstraintFor(prereq);
-		}
-
-		private PluginDescriptorModel getMatchingDescriptorFor(Constraint c) {
-			ConstraintsEntry cie = getConstraintsEntryFor(c);
-			return cie.getMatchingDescriptor();
-		}
-
-		private void disableAllDescriptors() {
-			for (Iterator list = verList.iterator(); list.hasNext();) {
-				PluginDescriptorModel pd = (PluginDescriptorModel) list.next();
-				pd.setEnabled(false);
-			}
-		}
-
-		private void resolveDependencies(List roots) {
-			// preresolved will pick out the plugin which has the highest version
-			// number and satisfies all the constraints.  This is then put in
-			// bestMatch field of the ConstraintsEntry.
-			for (Iterator list = concurrentList.iterator(); list.hasNext();)
-				((ConstraintsEntry) list.next()).preresolve(roots);
-			// Now all versions of this plugin are disabled.
-			disableAllDescriptors();
-			// Now, find the best match (from preresolve above) and enable it.
-			// Be sure to update any prerequisite entries with the version number
-			// of the plugin we are actually using.
-			for (Iterator list = concurrentList.iterator(); list.hasNext();)
-				((ConstraintsEntry) list.next()).resolve();
-		}
-
-		/**
-		 * A root plug-in does not have any constraints attached to it.
-		 */
-		private boolean isRoot() {
-			if (concurrentList.size() != 1)
-				return false;
-			ConstraintsEntry constraintsEntry = (ConstraintsEntry) concurrentList.get(0);
-			return constraintsEntry.constraintCount() == 0;
-		}
-
-		private List versions() {
-			return verList;
-		}
-
-		private boolean isResolvedFor(Constraint c) {
-			ConstraintsEntry cie = getConstraintsEntryFor(c);
-			return cie.isResolved();
-		}
-
-		private void isResolvedFor(Constraint c, boolean value) {
-			ConstraintsEntry cie = getConstraintsEntryFor(c);
-			cie.isResolved(value);
-		}
-
-	}
-
-	// subtree resolution "cookie" (composite change list)
-	private class Cookie {
-		private boolean ok = true;
-		private List changes = new ArrayList(); // a list of Constraints
-
-		private Cookie() {
-		}
-
-		private boolean addChange(Constraint c) {
-			// Keep a list of all constraints so that
-			//	- we can spot circular dependencies
-			//	- we can clean up if there is an unresolvable conflict
-			PluginPrerequisiteModel prereq = c.getPrerequisite();
-			for (Iterator list = changes.iterator(); list.hasNext();)
-				if (prereq == ((Constraint) list.next()).getPrerequisite())
-					// We have a circular dependency
-					return false;
-			changes.add(c);
-			return true;
-		}
-
-		private List getChanges() {
-			return changes;
-		}
-
-		private boolean isOk() {
-			return ok;
-		}
-
-		private void isOk(boolean value) {
-			ok = value;
-		}
-	}
-
-	public RegistryResolver() {
-		String debug = Platform.getDebugOption(OPTION_DEBUG_RESOLVE);
-		DEBUG_RESOLVE = debug == null ? false : (debug.equalsIgnoreCase("true") ? true : false); //$NON-NLS-1$
-	}
-
-	private void add(PluginDescriptorModel pd) {
-
-		String key = pd.getId();
-		List verList;
-		IndexEntry ix = (IndexEntry) idmap.get(key);
-
-		// create new index entry if one does not exist for plugin
-		if (ix == null) {
-			ix = new IndexEntry(key);
-			idmap.put(key, ix);
-		}
-
-		// insert plugin into list maintaining version order
-		verList = ix.versions();
-		int i = 0;
-		for (i = 0; i < verList.size(); i++) {
-			PluginDescriptorModel element = (PluginDescriptorModel) verList.get(i);
-			if (getVersionIdentifier(pd).equals(getVersionIdentifier(element)))
-				return; // ignore duplicates
-			if (getVersionIdentifier(pd).isGreaterThan(getVersionIdentifier(element)))
-				break;
-		}
-		verList.add(i, pd);
-	}
-
-	private void addExtensions(ExtensionModel[] extensions, PluginDescriptorModel plugin) {
-		// Add all the extensions (presumably from a fragment) to plugin
-		int extLength = extensions.length;
-		for (int i = 0; i < extLength; i++) {
-			extensions[i].setParentPluginDescriptor(plugin);
-		}
-		ExtensionModel[] list = plugin.getDeclaredExtensions();
-		int listLength = (list == null ? 0 : list.length);
-		ExtensionModel[] result = null;
-		if (list == null)
-			result = new ExtensionModel[extLength];
-		else {
-			result = new ExtensionModel[list.length + extLength];
-			System.arraycopy(list, 0, result, 0, list.length);
-		}
-		System.arraycopy(extensions, 0, result, listLength, extLength);
-		plugin.setDeclaredExtensions(result);
-	}
-
-	private void addExtensionPoints(ExtensionPointModel[] extensionPoints, PluginDescriptorModel plugin) {
-		// Add all the extension points (presumably from a fragment) to plugin
-		int extPtLength = extensionPoints.length;
-		for (int i = 0; i < extPtLength; i++) {
-			extensionPoints[i].setParentPluginDescriptor(plugin);
-		}
-		ExtensionPointModel[] list = plugin.getDeclaredExtensionPoints();
-		int listLength = (list == null ? 0 : list.length);
-		ExtensionPointModel[] result = null;
-		if (list == null)
-			result = new ExtensionPointModel[extPtLength];
-		else {
-			result = new ExtensionPointModel[list.length + extPtLength];
-			System.arraycopy(list, 0, result, 0, list.length);
-		}
-		System.arraycopy(extensionPoints, 0, result, listLength, extPtLength);
-		plugin.setDeclaredExtensionPoints(result);
-	}
-
-	private void addLibraries(LibraryModel[] libraries, PluginDescriptorModel plugin) {
-		// Add all the libraries (presumably from a fragment) to plugin
-		int libLength = libraries.length;
-		LibraryModel[] list = plugin.getRuntime();
-		LibraryModel[] result = null;
-		int listLength = (list == null ? 0 : list.length);
-		if (list == null)
-			result = new LibraryModel[libLength];
-		else {
-			result = new LibraryModel[list.length + libLength];
-			System.arraycopy(list, 0, result, 0, list.length);
-		}
-		System.arraycopy(libraries, 0, result, listLength, libLength);
-		plugin.setRuntime(result);
-	}
-
-	private void addPrerequisites(PluginPrerequisiteModel[] prerequisites, PluginDescriptorModel plugin) {
-		// Add all the prerequisites (presumably from a fragment) to plugin
-		int reqLength = prerequisites.length;
-		PluginPrerequisiteModel[] list = plugin.getRequires();
-		PluginPrerequisiteModel[] result = null;
-		int listLength = (list == null ? 0 : list.length);
-		if (list == null)
-			result = new PluginPrerequisiteModel[reqLength];
-		else {
-			result = new PluginPrerequisiteModel[list.length + reqLength];
-			System.arraycopy(list, 0, result, 0, list.length);
-		}
-		System.arraycopy(prerequisites, 0, result, listLength, reqLength);
-		plugin.setRequires(result);
-	}
-
-	private void debug(String s) {
-		System.out.println("Registry Resolve: " + s); //$NON-NLS-1$
-	}
-
-	private void error(String message) {
-		Status error = new Status(IStatus.WARNING, Platform.PI_RUNTIME, Platform.PARSE_PROBLEM, message, null);
-		status.add(error);
-		if (InternalPlatform.DEBUG && DEBUG_RESOLVE)
-			System.out.println(error.toString());
-	}
-
-	private void information(String message) {
-		if (InternalPlatform.DEBUG && DEBUG_RESOLVE)
-			System.out.println(message);
-	}
-
-	public IExtensionPoint getExtensionPoint(PluginDescriptorModel plugin, String extensionPointId) {
-		if (extensionPointId == null)
-			return null;
-		ExtensionPointModel[] list = plugin.getDeclaredExtensionPoints();
-		if (list == null)
-			return null;
-		for (int i = 0; i < list.length; i++) {
-			if (extensionPointId.equals(list[i].getId()))
-				return (IExtensionPoint) list[i];
-		}
-		return null;
-	}
-
-	private PluginVersionIdentifier getVersionIdentifier(PluginModel model) {
-		try {
-			return new PluginVersionIdentifier(model.getVersion());
-		} catch (RuntimeException e) {
-			// if the version is invalid, an AssertionFailedException (not visible here) will be thrown
-			if (this.DEBUG_RESOLVE)
-				// only show if we are debugging
-				e.printStackTrace(System.out);
-			// Hopefully, we will never get here.  The version number
-			// has already been successfully converted from a string to
-			// a PluginVersionIdentifier and back to a string.  But keep
-			// this catch around in case something does go wrong.
-			return new PluginVersionIdentifier(0, 0, 0);
-		}
-	}
-
-	private PluginVersionIdentifier getVersionIdentifier(PluginPrerequisiteModel prereq) {
-		String version = prereq.getVersion();
-		return version == null ? null : new PluginVersionIdentifier(version);
-	}
-
-	private boolean fragmentHasPrerequisites(PluginFragmentModel fragment) {
-		PluginPrerequisiteModel[] requires = fragment.getRequires();
-		if (requires == null || requires.length == 0)
-			return true;
-		for (int i = 0; i < requires.length; i++) {
-			// Use the idmap to determine if a plugin exists.  We know
-			// that all plugins in this registry already have an entry
-			// in the idmap.  If the right idmap entry doesn't exist,
-			// this plugin is not in the registry.
-			if (idmap.get(requires[i].getPlugin()) == null) {
-				// We know this plugin doesn't exist
-				error(NLS.bind(Messages.parse_badPrereqOnFrag, fragment.getName(), requires[i].getPlugin()));
-				return false;
-			}
-		}
-		return true;
-	}
-
-	private void linkFragments() {
-		/* For each fragment, find out which plugin descriptor it belongs
-		 * to and add it to the list of fragments in this plugin.
-		 */
-		PluginFragmentModel[] fragments = reg.getFragments();
-		for (int i = 0; i < fragments.length; i++) {
-			PluginFragmentModel fragment = fragments[i];
-			if (!requiredFragment(fragment)) {
-				// There is a required field missing on this fragment, so 
-				// ignore it.
-				String id, name;
-				if ((id = fragment.getId()) != null)
-					error(NLS.bind(Messages.parse_fragmentMissingAttr, id));
-				else if ((name = fragment.getName()) != null)
-					error(NLS.bind(Messages.parse_fragmentMissingAttr, name));
-				else
-					error(Messages.parse_fragmentMissingIdName);
-				continue;
-			}
-			if (!fragmentHasPrerequisites(fragment)) {
-				// This fragment requires a plugin that does not 
-				// exist.  Ignore the fragment.
-				continue;
-			}
-
-			// Now find a plugin that fits the matching criteria specified for this fragment and
-			// its related plugin
-			PluginDescriptorModel plugin = null;
-			IndexEntry ix = (IndexEntry) idmap.get(fragment.getPluginId());
-			byte matchType = fragment.getMatch();
-			if (ix != null) {
-				for (Iterator list = ix.versions().iterator(); list.hasNext() && plugin == null;) {
-					PluginDescriptorModel pd = (PluginDescriptorModel) list.next();
-					if (pd.getEnabled()) {
-						// return the highest version that fits the matching criteria
-						switch (matchType) {
-							case PluginFragmentModel.FRAGMENT_MATCH_PERFECT :
-								if (getVersionIdentifier(pd).isPerfect(new PluginVersionIdentifier(fragment.getPluginVersion())))
-									plugin = pd;
-								break;
-							case PluginFragmentModel.FRAGMENT_MATCH_EQUIVALENT :
-								if (getVersionIdentifier(pd).isEquivalentTo(new PluginVersionIdentifier(fragment.getPluginVersion())))
-									plugin = pd;
-								break;
-							case PluginFragmentModel.FRAGMENT_MATCH_COMPATIBLE :
-							case PluginFragmentModel.FRAGMENT_MATCH_UNSPECIFIED :
-								if (getVersionIdentifier(pd).isCompatibleWith(new PluginVersionIdentifier(fragment.getPluginVersion())))
-									plugin = pd;
-								break;
-							case PluginFragmentModel.FRAGMENT_MATCH_GREATER_OR_EQUAL :
-								if (getVersionIdentifier(pd).isGreaterOrEqualTo(new PluginVersionIdentifier(fragment.getPluginVersion())))
-									plugin = pd;
-								break;
-						}
-					}
-				}
-			}
-
-			if (plugin == null) {
-				// We couldn't find this fragment's plugin
-				error(NLS.bind(Messages.parse_missingFragmentPd, fragment.getPluginId(), fragment.getId()));
-				continue;
-			}
-
-			// Add this fragment to the list of fragments for this plugin descriptor
-			PluginFragmentModel[] list = plugin.getFragments();
-			PluginFragmentModel[] newList;
-			if (list == null) {
-				newList = new PluginFragmentModel[1];
-				newList[0] = fragment;
-			} else {
-				newList = new PluginFragmentModel[list.length + 1];
-				System.arraycopy(list, 0, newList, 0, list.length);
-				newList[list.length] = fragment;
-			}
-			plugin.setFragments(newList);
-		}
-	}
-
-	private void removeConstraintFor(PluginPrerequisiteModel prereq) {
-
-		String id = prereq.getPlugin();
-		IndexEntry ix = (IndexEntry) idmap.get(id);
-		if (ix == null) {
-			if (DEBUG_RESOLVE)
-				debug("unable to locate index entry for " + id); //$NON-NLS-1$
-			return;
-		}
-		ix.removeConstraintFor(prereq);
-	}
-
-	private void resolve() {
-
-		// Start by putting each plugin in the idmap.  We are
-		// going to need this for the call to linkFragments.
-		PluginDescriptorModel[] pluginList = reg.getPlugins();
-		idmap = new HashMap();
-		for (int i = 0; i < pluginList.length; i++) {
-			// Check to see if all the required fields exist now.
-			// For example, if we have a null plugin version identifier,
-			// the add(pluginList[i]) will give a null pointer
-			// exception.
-			if (!requiredPluginDescriptor(pluginList[i])) {
-				pluginList[i].setEnabled(false);
-				String id, name;
-				if ((id = pluginList[i].getId()) != null)
-					error(NLS.bind(Messages.parse_pluginMissingAttr, id));
-				else if ((name = pluginList[i].getName()) != null)
-					error(NLS.bind(Messages.parse_pluginMissingAttr, name));
-				else
-					error(Messages.parse_pluginMissingIdName);
-				continue;
-			}
-			add(pluginList[i]);
-		}
-		// Add all the fragments to their associated plugin.
-		// Note that this will check for all the required fields in
-		// the fragment.
-		linkFragments();
-		// Now we have to cycle through the plugin list again
-		// to assimilate all the fragment information and 
-		// check for 'required' fields.
-		for (int i = 0; i < pluginList.length; i++) {
-			if (pluginList[i].getFragments() != null) {
-				// Take all the information in each fragment and
-				// embed it in the plugin descriptor
-				resolvePluginFragments(pluginList[i]);
-			}
-		}
-
-		// resolve root descriptors
-		List roots = resolveRootDescriptors();
-
-		if (roots.size() == 0) {
-			// No roots, likely due to a circular dependency
-			// (or multiple circular dependencies).  Disable
-			// all plugins before returning.  Remember to trim
-			// the registry if needed.
-			PluginDescriptorModel[] plugins = reg.getPlugins();
-			for (int i = 0; i < plugins.length; i++) {
-				plugins[i].setEnabled(false);
-			}
-			resolvePluginRegistry();
-			idmap = null;
-			reg = null;
-			error(Messages.plugin_unableToResolve);
-			return;
-		}
-
-		// roots is a list of those plugin ids that are not a
-		// prerequisite for any other plugin.  Note that roots
-		// contains ids only.
-
-		// process all root nodes (first those previously on roots list, then those on the orphans set) 
-		// The orphans of an iteration will become the roots of the next one.	
-		for (Set orphans, rootsSet = new HashSet(roots); !rootsSet.isEmpty(); rootsSet = orphans) {
-			orphans = new HashSet();
-			// walk the dependencies and setup constraints	
-			for (Iterator rootsIter = rootsSet.iterator(); rootsIter.hasNext();) {
-				String rootID = (String) rootsIter.next();
-				resolveNode(rootID, null, null, null, orphans);
-				// At this point we have set up all the Constraint and
-				// ConstraintsEntry components.  But we may not have found which
-				// plugin is the best match for a given set of constraints.
-			}
-			// build the roots set for the next iteration
-			for (Iterator orphansIter = orphans.iterator(); orphansIter.hasNext();) {
-				IndexEntry orphan = (IndexEntry) idmap.get(orphansIter.next());
-				// only after a complete iteration over the roots set we can decide if 
-				// a potential orphan is a real orphan
-				// Now we need to resolve for these new roots (they may
-				// not have been resolved before, especially if the parent
-				// was looking for an older version and not the latest
-				// version which is what we pick up for the roots).					
-				if (orphan.isRoot()) {
-					if (DEBUG_RESOLVE)
-						debug("orphan " + orphan.getId()); //$NON-NLS-1$				
-					roots.add(orphan.getId());
-				} else
-					orphansIter.remove();
-			}
-		}
-
-		// resolve dependencies
-		Iterator plugins = idmap.entrySet().iterator();
-		while (plugins.hasNext()) {
-			IndexEntry ix = (IndexEntry) ((Map.Entry) plugins.next()).getValue();
-			// Now go off and find the plugin that matches the
-			// constraints.  Note that root plugins will always use the 
-			// latest version.
-			ix.resolveDependencies(roots);
-		}
-
-		// walk down the registry structure and resolve links
-		// between extensions and extension points
-		resolvePluginRegistry();
-
-		// unhook registry and index
-		idmap = null;
-		reg = null;
-	}
-
-	public IStatus resolve(PluginRegistryModel registry) {
-		// This is the entry point to the registry resolver.
-		// Calling this method, with a valid registry will 
-		// cause this registry to be 'resolved'.
-
-		status = new MultiStatus(Platform.PI_RUNTIME, IStatus.OK, "", null); //$NON-NLS-1$
-
-		if (registry.isResolved())
-			// don't bother doing anything if it's already resolved
-			return status;
-
-		reg = registry;
-		resolve();
-		registry.markResolved();
-		return status;
-	}
-
-	private void resolveExtension(ExtensionModel ext) {
-
-		String target = ext.getExtensionPoint();
-		int ix = target.lastIndexOf("."); //$NON-NLS-1$
-		String pluginId = target.substring(0, ix);
-		String extPtId = target.substring(ix + 1);
-		String message;
-
-		PluginDescriptorModel plugin = (PluginDescriptorModel) reg.getPlugin(pluginId);
-		if (plugin == null) {
-			message = NLS.bind(Messages.parse_extPointUnknown, target, ext.getParentPluginDescriptor().getId());
-			error(message);
-			return;
-		}
-		if (!plugin.getEnabled()) {
-			message = NLS.bind(Messages.parse_extPointDisabled, target, ext.getParentPluginDescriptor().getId());
-			error(message);
-			return;
-		}
-
-		ExtensionPointModel extPt = (ExtensionPointModel) getExtensionPoint(plugin, extPtId);
-		if (extPt == null) {
-			message = NLS.bind(Messages.parse_extPointUnknown, target, ext.getParentPluginDescriptor().getId());
-			error(message);
-			return;
-		}
-
-		ExtensionModel[] oldValues = extPt.getDeclaredExtensions();
-		ExtensionModel[] newValues = null;
-		if (oldValues == null)
-			newValues = new ExtensionModel[1];
-		else {
-			newValues = new ExtensionModel[oldValues.length + 1];
-			System.arraycopy(oldValues, 0, newValues, 0, oldValues.length);
-		}
-		newValues[newValues.length - 1] = ext;
-		extPt.setDeclaredExtensions(newValues);
-	}
-
-	private Cookie resolveNode(String child, PluginDescriptorModel parent, PluginPrerequisiteModel prq, Cookie cookie, Set orphans) {
-		// This method is called recursively to setup dependency constraints.
-		// Top invocation is passed null parent and null prerequisite.
-		// We are trying to resolve for the plugin descriptor with id 'child'.
-
-		if (DEBUG_RESOLVE)
-			debug("PUSH> " + child); //$NON-NLS-1$
-
-		if (cookie == null)
-			cookie = new Cookie();
-
-		// lookup child entry
-		IndexEntry ix = (IndexEntry) idmap.get(child);
-		// We should now have the IndexEntry for the plugin we 
-		// wish to resolve
-		if (ix == null) {
-			// If this is an optional prerequisite and not a root
-			// node, we can just ignore this prerequisite if there
-			// is no IndexEntry (as there is no corresponding plugin)
-			// and continue processing.
-			if (prq.getOptional() && parent != null && child != null)
-				return cookie;
-			if (parent != null)
-				error(NLS.bind(Messages.parse_prereqDisabled, parent.getId(), child));
-			if (DEBUG_RESOLVE)
-				debug("<POP  " + child + " not found"); //$NON-NLS-1$ //$NON-NLS-2$
-			cookie.isOk(false);
-			return cookie;
-		}
-
-		// try to add new dependency constraint
-		Constraint currentConstraint = new Constraint(parent, prq);
-		// A constraint will be added for each parent which requires us.
-		PluginDescriptorModel childPd = null;
-		if (parent != null) {
-			childPd = ix.addConstraint(currentConstraint);
-			if (childPd == null) {
-				if (prq.getOptional()) {
-					// This is an optional prerequisite.  Ignore the conflict and this
-					// prerequisite.
-					orphans.add(ix.getId());
-					information(NLS.bind(Messages.parse_unsatisfiedOptPrereq, parent.getId(), child));
-					return cookie;
-				} else {
-					// This prerequisite is mandatory.  
-					String message = NLS.bind(Messages.parse_unsatisfiedPrereq, parent.getId(), child);
-					error(message);
-					if (DEBUG_RESOLVE)
-						debug("<POP  " + child + " unable to satisfy constraint"); //$NON-NLS-1$ //$NON-NLS-2$
-					cookie.isOk(false);
-					return cookie;
-				}
-			} else if (!cookie.addChange(currentConstraint)) {
-				if (prq.getOptional()) {
-					// This is an optional prerequisite.  Ignore the loop, and the
-					// prerequisite
-					information(NLS.bind(Messages.parse_prereqOptLoop, parent.getId(), child));
-					return cookie;
-				} else {
-					String message = NLS.bind(Messages.parse_prereqLoop, parent.getId(), child);
-					error(message);
-					if (DEBUG_RESOLVE)
-						debug("<POP  " + child + " prerequisite loop"); //$NON-NLS-1$ //$NON-NLS-2$
-					cookie.isOk(false);
-					return cookie;
-				}
-			}
-		} else {
-			// This is a root node.  There is no prerequisite so this IndexEntry must
-			// exist
-			childPd = ix.getMatchingDescriptorFor(currentConstraint);
-			if (childPd == null) {
-				if (DEBUG_RESOLVE)
-					debug("<POP  " + child + " not found (missing descriptor entry)"); //$NON-NLS-1$ //$NON-NLS-2$
-				cookie.isOk(false);
-				return cookie;
-			}
-		}
-
-		// check to see if subtree is already resolved
-		if (ix.isResolvedFor(currentConstraint)) {
-			if (DEBUG_RESOLVE)
-				debug("<POP  " + child + " already resolved"); //$NON-NLS-1$ //$NON-NLS-2$
-			return cookie;
-		}
-
-		// select the subtree to resolve
-		PluginPrerequisiteModel[] prereqs = childPd.getRequires();
-		PluginPrerequisiteModel prereq;
-		prereqs = prereqs == null ? new PluginPrerequisiteModel[0] : prereqs;
-		for (int i = 0; cookie.isOk() && i < prereqs.length; i++) {
-			prereq = (PluginPrerequisiteModel) prereqs[i];
-			cookie = resolveNode(prereq.getPlugin(), childPd, prereq, cookie, orphans);
-		}
-
-		// if we failed, remove any constraints we added
-		if (!cookie.isOk()) {
-			Constraint cookieConstraint;
-			for (Iterator change = cookie.getChanges().iterator(); change.hasNext();) {
-				cookieConstraint = (Constraint) change.next();
-				prereq = cookieConstraint.getPrerequisite();
-				if (childPd == cookieConstraint.getParent()) {
-					// keep track of orphaned subtrees
-					if (!orphans.contains(prereq.getPlugin()) && (idmap.get(prereq.getPlugin()) != null))
-						orphans.add(prereq.getPlugin());
-				}
-				removeConstraintFor(prereq);
-			}
-			// Make sure you picked up all the orphaned subtrees
-			// for this childPd
-			for (int i = 0; i < prereqs.length; i++) {
-				if (!orphans.contains(prereqs[i].getPlugin()) && (idmap.get(prereqs[i].getPlugin()) != null))
-					orphans.add(prereqs[i].getPlugin());
-			}
-			if (parent != null)
-				error(NLS.bind(Messages.parse_prereqDisabled, parent.getId(), child));
-			childPd.setEnabled(false);
-			if (DEBUG_RESOLVE)
-				debug("<POP  " + child + " failed to resolve subtree"); //$NON-NLS-1$ //$NON-NLS-2$
-			return cookie;
-		} else {
-			// we're done
-			ix.isResolvedFor(currentConstraint, true);
-			if (DEBUG_RESOLVE)
-				debug("<POP  " + child + " " + getVersionIdentifier(childPd)); //$NON-NLS-1$ //$NON-NLS-2$
-			return cookie;
-		}
-	}
-
-	private void resolvePluginDescriptor(PluginDescriptorModel pd) {
-		ExtensionModel[] list = pd.getDeclaredExtensions();
-		if (list == null || list.length == 0 || !pd.getEnabled())
-			// Can be disabled if all required attributes not present
-			return;
-		for (int i = 0; i < list.length; i++)
-			resolveExtension((ExtensionModel) list[i]);
-	}
-
-	private void resolvePluginFragment(PluginFragmentModel fragment, PluginDescriptorModel plugin) {
-		ExtensionModel[] extensions = fragment.getDeclaredExtensions();
-		if (extensions != null)
-			// Add all the fragment extensions to the plugin
-			addExtensions(extensions, plugin);
-
-		ExtensionPointModel[] points = fragment.getDeclaredExtensionPoints();
-		if (points != null)
-			// Add all the fragment extension points to the plugin
-			addExtensionPoints(points, plugin);
-
-		LibraryModel[] libraries = fragment.getRuntime();
-		if (libraries != null)
-			// Add all the fragment library entries to the plugin
-			addLibraries(libraries, plugin);
-
-		PluginPrerequisiteModel[] prerequisites = fragment.getRequires();
-		if (prerequisites != null)
-			// Add all the fragment prerequisites to the plugin
-			addPrerequisites(prerequisites, plugin);
-	}
-
-	private void resolvePluginFragments(PluginDescriptorModel plugin) {
-		/* For each fragment contained in the fragment list of this plugin, 
-		 * apply all the fragment bits to the plugin (e.g. all of the fragment's
-		 * extensions are added to the list of extensions in the plugin).  Be
-		 * sure to use only the latest version of any given fragment (in case
-		 * there are multiple versions of a given fragment id).  So note that,
-		 * if there are multiple versions of a given fragment id, all but the
-		 * latest version will be discarded.
-		 */
-
-		// The boolean 'dirty' will remain false if there is only one
-		// version of every fragment id associated with this plugin
-		boolean dirty = false;
-
-		PluginFragmentModel[] fragmentList = plugin.getFragments();
-		HashMap latestFragments = new HashMap(30);
-		for (int i = 0; i < fragmentList.length; i++) {
-			String fragmentId = fragmentList[i].getId();
-			PluginFragmentModel latestVersion = (PluginFragmentModel) latestFragments.get(fragmentId);
-			if (latestVersion == null) {
-				// We don't have any fragments with this id yet
-				latestFragments.put(fragmentId, fragmentList[i]);
-			} else {
-				dirty = true;
-				if (getVersionIdentifier(fragmentList[i]).equals(getVersionIdentifier(latestVersion)))
-					// ignore duplicates
-					error(NLS.bind(Messages.parse_duplicateFragment, fragmentId, fragmentList[i].getVersion()));
-				if (getVersionIdentifier(fragmentList[i]).isGreaterThan(getVersionIdentifier(latestVersion))) {
-					latestFragments.put(fragmentId, fragmentList[i]);
-				}
-			}
-		}
-
-		// latestFragments now contains the latest version of each fragment
-		// id for this plugin
-
-		// Now add the latest version of each fragment to the plugin
-		Set latestOnly = new HashSet();
-		for (Iterator list = latestFragments.values().iterator(); list.hasNext();) {
-			PluginFragmentModel latestFragment = (PluginFragmentModel) list.next();
-			if (dirty)
-				latestOnly.add(latestFragment);
-			int numLibraries = latestFragment.getRuntime() == null ? 0 : latestFragment.getRuntime().length;
-			resolvePluginFragment(latestFragment, plugin);
-			// If this fragment added library entries, check to see if it
-			// added a duplicate library entry.
-			if (numLibraries != 0) {
-				// Something got added
-				LibraryModel[] libraries = plugin.getRuntime();
-				// Put all the library names into a set as we know the set will not
-				// have any duplicates.
-				Set libNames = new HashSet();
-				int setSize = libNames.size();
-				for (int i = 0; i < libraries.length; i++) {
-					libNames.add(libraries[i].getName());
-					if (libNames.size() == setSize) {
-						// We know this library name didn't get added to the set.
-						// Ignore the duplicate but indicate an error
-						String[] bindings = {latestFragment.getId(), plugin.getId(), libraries[i].getName()};
-						error(NLS.bind(Messages.parse_duplicateLib, bindings));
-					} else {
-						setSize = libNames.size();
-					}
-				}
-			}
-		}
-		// Currently the fragments on the plugin include all fragment 
-		// versions.  Now strip off all but the latest version of each
-		// fragment id (only if necessary).
-		if (dirty)
-			plugin.setFragments((PluginFragmentModel[]) latestOnly.toArray(new PluginFragmentModel[latestOnly.size()]));
-
-	}
-
-	private void resolvePluginRegistry() {
-		// filter out disabled plugins from "live" registry
-		if (trimPlugins)
-			trimRegistry();
-
-		// resolve relationships
-		if (crossLink) {
-			// cross link all of the extensions and extension points.
-			PluginDescriptorModel[] plugins = reg.getPlugins();
-			for (int i = 0; i < plugins.length; i++)
-				resolvePluginDescriptor(plugins[i]);
-		}
-	}
-
-	private boolean requiredPluginDescriptor(PluginDescriptorModel plugin) {
-		boolean retValue = true;
-		retValue = plugin.getName() != null && plugin.getId() != null && plugin.getVersion() != null;
-		if (!retValue)
-			return retValue;
-
-		PluginPrerequisiteModel[] requiresList = plugin.getRequires();
-		ExtensionModel[] extensions = plugin.getDeclaredExtensions();
-		ExtensionPointModel[] extensionPoints = plugin.getDeclaredExtensionPoints();
-		LibraryModel[] libraryList = plugin.getRuntime();
-		PluginFragmentModel[] fragments = plugin.getFragments();
-
-		if (requiresList != null) {
-			for (int i = 0; i < requiresList.length && retValue; i++) {
-				retValue = retValue && requiredPrerequisite(requiresList[i]);
-			}
-		}
-		if (extensions != null) {
-			for (int i = 0; i < extensions.length && retValue; i++) {
-				retValue = retValue && requiredExtension(extensions[i]);
-			}
-		}
-		if (extensionPoints != null) {
-			for (int i = 0; i < extensionPoints.length && retValue; i++) {
-				retValue = retValue && requiredExtensionPoint(extensionPoints[i]);
-			}
-		}
-		if (libraryList != null) {
-			for (int i = 0; i < libraryList.length && retValue; i++) {
-				retValue = retValue && requiredLibrary(libraryList[i]);
-			}
-		}
-		if (fragments != null) {
-			for (int i = 0; i < fragments.length && retValue; i++) {
-				retValue = retValue && requiredFragment(fragments[i]);
-			}
-		}
-
-		return retValue;
-	}
-
-	private boolean requiredPrerequisite(PluginPrerequisiteModel prerequisite) {
-		return ((prerequisite.getPlugin() != null));
-	}
-
-	private boolean requiredExtension(ExtensionModel extension) {
-		return (extension.getExtensionPoint() != null);
-	}
-
-	private boolean requiredExtensionPoint(ExtensionPointModel extensionPoint) {
-		return ((extensionPoint.getName() != null) && (extensionPoint.getId() != null));
-	}
-
-	private boolean requiredLibrary(LibraryModel library) {
-		return (library.getName() != null);
-	}
-
-	private boolean requiredFragment(PluginFragmentModel fragment) {
-		return ((fragment.getName() != null) && (fragment.getId() != null) && (fragment.getPlugin() != null) && (fragment.getPluginVersion() != null) && (fragment.getVersion() != null));
-	}
-
-	private List resolveRootDescriptors() {
-
-		// Determine the roots of the dependency tree. Disable all
-		// but one versions of the root descriptors.
-
-		// get list of all plugin identifiers in the registry
-		List ids = new ArrayList();
-		ids.addAll(idmap.keySet());
-
-		// ids is just a list of all the plugin id's
-		// The following while loop will remove all id's that
-		// appear in any prerequisite list.
-
-		// iterate over the list eliminating targets of <requires> entries
-		Iterator p = idmap.entrySet().iterator();
-		while (p.hasNext()) {
-			IndexEntry ix = (IndexEntry) ((Map.Entry) p.next()).getValue();
-			if (ix != null) {
-				List list = ix.versions();
-				int ixSize = list.size();
-				if (ixSize > 0) {
-					// Remove any prerequisite mentioned in any version of this plugin
-					for (int i = 0; i < ixSize; i++) {
-						PluginDescriptorModel pd = (PluginDescriptorModel) list.get(i);
-						PluginPrerequisiteModel[] prereqs = pd.getRequires();
-						for (int j = 0; prereqs != null && j < prereqs.length; j++) {
-							ids.remove(prereqs[j].getPlugin());
-						}
-					}
-				}
-			}
-		}
-
-		if (ids.size() > 0) {
-			// disable all but the most recent version of root descriptors
-			String id;
-			p = ids.iterator();
-			while (p.hasNext()) {
-				id = (String) p.next();
-				IndexEntry ix = (IndexEntry) idmap.get(id);
-				if (ix != null) {
-					List list = ix.versions();
-					for (int i = 0; i < list.size(); i++) {
-						PluginDescriptorModel pd = (PluginDescriptorModel) list.get(i);
-						if (i == 0) {
-							// Don't disable this one.  It is the
-							// one with the highest version number.
-							if (DEBUG_RESOLVE)
-								debug("root " + pd); //$NON-NLS-1$
-						} else {
-							// Disable all versions except the one with the
-							// highest version number.
-							if (DEBUG_RESOLVE)
-								debug("     " + pd + " disabled"); //$NON-NLS-1$ //$NON-NLS-2$
-							pd.setEnabled(false);
-						}
-					}
-				}
-			}
-		} else {
-			if (DEBUG_RESOLVE)
-				debug("NO ROOTS"); //$NON-NLS-1$
-		}
-
-		return ids;
-	}
-
-	/**
-	 * Specifies whether extensions and extension points should be cross 
-	 * linked during the resolve process.
-	 */
-	public void setCrossLink(boolean value) {
-		crossLink = value;
-	}
-
-	/**
-	 * Specified whether disabled plugins should to be removed when the resolve
-	 * is completed.
-	 */
-	public void setTrimPlugins(boolean value) {
-		trimPlugins = value;
-	}
-
-	private void trimRegistry() {
-		PluginDescriptorModel[] list = reg.getPlugins();
-		for (int i = 0; i < list.length; i++) {
-			PluginDescriptorModel pd = (PluginDescriptorModel) list[i];
-			if (!pd.getEnabled()) {
-				if (DEBUG_RESOLVE)
-					debug("removing " + pd.toString()); //$NON-NLS-1$
-				reg.removePlugin(pd.getId(), pd.getVersion());
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ConfigurationElementModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ConfigurationElementModel.java
deleted file mode 100644
index 9d2752d..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ConfigurationElementModel.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-/**
- * An object which represents the user-defined contents of an extension in a
- * plug-in manifest.
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public class ConfigurationElementModel extends PluginModelObject {
-
-	// DTD properties (included in plug-in manifest)
-	private String value = null;
-	private ConfigurationPropertyModel[] properties = null;
-	private ConfigurationElementModel[] children = null;
-
-	// transient properties (not included in plug-in manifest)
-	private Object parent = null; // parent element or declaring extension
-
-	/**
-	 * Creates a new configuration element model in which all fields are <code>null</code>.
-	 */
-	public ConfigurationElementModel() {
-		super();
-	}
-
-	/**
-	 * Returns the element which contains this element. If this element is an
-	 * immediate child of an extension, the returned value can be downcast to
-	 * <code>ExtensionModel</code>. Otherwise the returned value can be
-	 * downcast to <code>ConfigurationElementModel</code>.
-	 * 
-	 * @return the parent of this configuration element or <code>null</code>
-	 */
-	public Object getParent() {
-		return parent;
-	}
-
-	/**
-	 * Returns the extension in which this configuration element is declared.
-	 * If this element is a top-level child of an extension, the returned value
-	 * is equivalent to <code>getParent</code>.
-	 * 
-	 * @return the extension in which this configuration element is declared or
-	 *               <code>null</code>
-	 */
-	public ExtensionModel getParentExtension() {
-		Object p = getParent();
-		while (p != null && p instanceof ConfigurationElementModel)
-			p = ((ConfigurationElementModel) p).getParent();
-		return (ExtensionModel) p;
-	}
-
-	/**
-	 * Returns the properties associated with this element.
-	 * 
-	 * @return the properties associated with this element or <code>null</code>
-	 */
-	public ConfigurationPropertyModel[] getProperties() {
-		return properties;
-	}
-
-	/**
-	 * Returns this element's sub-elements.
-	 * 
-	 * @return the sub-elements of this element or <code>null</code>
-	 */
-	public ConfigurationElementModel[] getSubElements() {
-		return children;
-	}
-
-	/**
-	 * Returns the value of this element.
-	 * 
-	 * @return the value of this element or <code>null</code>
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * Returns the value of this element.
-	 * 
-	 * @return the value of this element or <code>null</code>
-	 * @since 2.0
-	 */
-	public String getValueAsIs() {
-		return value;
-	}
-
-	/**
-	 * Sets this model object and all of its descendents to be read-only.
-	 * Subclasses may extend this implementation.
-	 * 
-	 * @see #isReadOnly()
-	 */
-	public void markReadOnly() {
-		super.markReadOnly();
-		if (children != null)
-			for (int i = 0; i < children.length; i++)
-				children[i].markReadOnly();
-		if (properties != null)
-			for (int i = 0; i < properties.length; i++)
-				properties[i].markReadOnly();
-	}
-
-	/**
-	 * Optimization to replace a non-localized key with its localized value.
-	 * Avoids having to access resource bundles for further lookups.
-	 * 
-	 * @param value the localized value of this model object
-	 */
-	public void setLocalizedValue(String value) {
-		this.value = value;
-	}
-
-	/**
-	 * Sets the parent of this element. The supplied parent is either an <code>ExtensionModel</code>,
-	 * if this element is to be a direct child of an extension, or another
-	 * <code>ConfigurationElement</code>. This object must not be read-only.
-	 * 
-	 * @param value
-	 *                   the new parent of this element. May be <code>null</code>.
-	 */
-	public void setParent(Object value) {
-		assertIsWriteable();
-		parent = value;
-	}
-
-	/**
-	 * Sets the properties associated with this element. This object must not
-	 * be read-only.
-	 * 
-	 * @param value
-	 *                   the properties to associate with this element. May be <code>null</code>.
-	 */
-	public void setProperties(ConfigurationPropertyModel[] value) {
-		assertIsWriteable();
-		properties = value;
-	}
-
-	/**
-	 * Sets configuration elements contained by this element This object must
-	 * not be read-only.
-	 * 
-	 * @param value
-	 *                   the configuration elements to be associated with this
-	 *                   element. May be <code>null</code>.
-	 */
-	public void setSubElements(ConfigurationElementModel[] value) {
-		assertIsWriteable();
-		children = value;
-	}
-
-	/**
-	 * Sets the value of this element. This object must not be read-only.
-	 * 
-	 * @param value
-	 *                   the new value of this element. May be <code>null</code>.
-	 */
-	public void setValue(String value) {
-		assertIsWriteable();
-		this.value = value;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ConfigurationPropertyModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ConfigurationPropertyModel.java
deleted file mode 100644
index 94eab18..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ConfigurationPropertyModel.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-/**
- * An object which represents the user-defined properties in a configuration
- * element of a plug-in manifest. Properties are <code>String</code> -based
- * key/value pairs.
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public class ConfigurationPropertyModel extends PluginModelObject {
-
-	// DTD properties (included in plug-in manifest)
-	private String value = null;
-
-	/**
-	 * Creates a new configuration property model in which all fields are
-	 * <code>null</code>.
-	 */
-	public ConfigurationPropertyModel() {
-		super();
-	}
-
-	/**
-	 * Returns the value of this property.
-	 * 
-	 * @return the value of this property or <code>null</code>
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * Optimization to replace a non-localized key with its localized value.
-	 * Avoids having to access resource bundles for further lookups.
-	 * 
-	 * @param value the localized value of this model object
-	 */
-	public void setLocalizedValue(String value) {
-		this.value = value;
-	}
-
-	/**
-	 * Sets the value of this property. This object must not be read-only.
-	 * 
-	 * @param value the new value of this property. May be <code>null</code>.
-	 */
-	public void setValue(String value) {
-		assertIsWriteable();
-		this.value = value;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ExtensionModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ExtensionModel.java
deleted file mode 100644
index 4d446ca..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ExtensionModel.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-/**
- * An object which represents the user-defined extension in a plug-in manifest.
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public class ExtensionModel extends PluginModelObject {
-
-	// DTD properties (included in plug-in manifest)
-	private String extensionPoint = null;
-	private String id = null;
-	private ConfigurationElementModel[] elements = null;
-
-	// transient properties (not included in plug-in manifest)
-	private PluginModel plugin = null; // declaring plugin
-
-	/**
-	 * Creates a new extension model in which all fields are <code>null</code>.
-	 */
-	public ExtensionModel() {
-		super();
-	}
-
-	/**
-	 * Returns the extension point with which this extension is associated.
-	 * 
-	 * @return the extension point with which this extension is associated or
-	 *               <code>null</code>
-	 */
-	public String getExtensionPoint() {
-		return extensionPoint;
-	}
-
-	/**
-	 * Returns the simple identifier of this extension, or <code>null</code>
-	 * if this extension does not have an identifier. This identifier is
-	 * specified in the plug-in manifest as a non-empty string containing no
-	 * period characters (<code>'.'</code>) and must be unique within the
-	 * defining plug-in.
-	 * 
-	 * @return the simple identifier of the extension (e.g. <code>"main"</code>)
-	 *               or <code>null</code>
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Returns the plug-in model (descriptor or fragment) in which this
-	 * extension is declared.
-	 * 
-	 * @return the plug-in model in which this extension is declared or <code>null</code>
-	 */
-	public PluginModel getParent() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the plug-in descriptor in which this extension is declared.
-	 * 
-	 * @return the plug-in descriptor in which this extension is declared or
-	 *               <code>null</code>
-	 */
-	public PluginDescriptorModel getParentPluginDescriptor() {
-		return (PluginDescriptorModel) plugin;
-	}
-
-	/**
-	 * Returns the configuration element children of this extension.
-	 * 
-	 * @return the configuration elements in this extension or <code>null</code>
-	 */
-	public ConfigurationElementModel[] getSubElements() {
-		return elements;
-	}
-
-	/**
-	 * Sets this model object and all of its descendents to be read-only.
-	 * Subclasses may extend this implementation.
-	 * 
-	 * @see #isReadOnly()
-	 */
-	public void markReadOnly() {
-		super.markReadOnly();
-		if (elements != null)
-			for (int i = 0; i < elements.length; i++)
-				elements[i].markReadOnly();
-	}
-
-	/**
-	 * Set the extension point with which this extension is associated. This
-	 * object must not be read-only.
-	 * 
-	 * @param value the extension point with which this extension is associated. May
-	 *               be <code>null</code>.
-	 */
-	public void setExtensionPoint(String value) {
-		assertIsWriteable();
-		extensionPoint = value;
-	}
-
-	/**
-	 * Sets the simple identifier of this extension, or <code>null</code> if
-	 * this extension does not have an identifier. This identifier is specified
-	 * in the plug-in manifest as a non-empty string containing no period
-	 * characters (<code>'.'</code>) and must be unique within the defining
-	 * plug-in. This object must not be read-only.
-	 * 
-	 * @param value
-	 *                   the simple identifier of the extension (e.g. <code>"main"</code>).
-	 *                   May be <code>null</code>.
-	 */
-	public void setId(String value) {
-		assertIsWriteable();
-		id = value;
-	}
-
-	/**
-	 * Sets the plug-in model in which this extension is declared. This object
-	 * must not be read-only.
-	 * 
-	 * @param value
-	 *                   the plug-in model in which this extension is declared. May be
-	 *                   <code>null</code>.
-	 */
-	public void setParent(PluginModel value) {
-		assertIsWriteable();
-		plugin = value;
-	}
-
-	/**
-	 * Sets the plug-in descriptor in which this extension is declared. This
-	 * object must not be read-only.
-	 * 
-	 * @param value
-	 *                   the plug-in descriptor in which this extension is declared.
-	 *                   May be <code>null</code>.
-	 */
-	public void setParentPluginDescriptor(PluginDescriptorModel value) {
-		assertIsWriteable();
-		plugin = value;
-	}
-
-	/**
-	 * Sets the configuration element children of this extension. This object
-	 * must not be read-only.
-	 * 
-	 * @param value
-	 *                   the configuration elements in this extension. May be <code>null</code>.
-	 */
-	public void setSubElements(ConfigurationElementModel[] value) {
-		assertIsWriteable();
-		elements = value;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ExtensionPointModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ExtensionPointModel.java
deleted file mode 100644
index 2c18777..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/ExtensionPointModel.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-/**
- * An object which represents the user-defined extension point in a plug-in
- * manifest.
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public class ExtensionPointModel extends PluginModelObject {
-
-	// DTD properties (included in plug-in manifest)
-	private String id = null;
-	private String schema = null;
-
-	// transient properties (not included in plug-in manifest)
-	private PluginModel plugin = null; // declaring plugin
-	private ExtensionModel[] extensions = null; // configured extensions
-
-	/**
-	 * Creates a new extension point model in which all fields are <code>null</code>.
-	 */
-	public ExtensionPointModel() {
-		super();
-	}
-
-	/**
-	 * Returns this extensions added to this extension point.
-	 * 
-	 * @return the extensions in this extension point or <code>null</code>
-	 */
-	public ExtensionModel[] getDeclaredExtensions() {
-		return extensions;
-	}
-
-	/**
-	 * Returns the simple identifier of this extension point, or <code>null</code>
-	 * if this extension point does not have an identifier. This identifier is
-	 * specified in the plug-in manifest as a non-empty string containing no
-	 * period characters (<code>'.'</code>) and must be unique within the
-	 * defining plug-in.
-	 * 
-	 * @return the simple identifier of the extension point (e.g. <code>"main"</code>)
-	 *               or <code>null</code>
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Returns the plug-in model (descriptor or fragment) in which this
-	 * extension is declared.
-	 * 
-	 * @return the plug-in model in which this extension is declared or <code>null</code>
-	 */
-	public PluginModel getParent() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the plug-in descriptor in which this extension point is
-	 * declared.
-	 * 
-	 * @return the plug-in descriptor in which this extension point is declared
-	 *               or <code>null</code>
-	 */
-	public PluginDescriptorModel getParentPluginDescriptor() {
-		return (PluginDescriptorModel) plugin;
-	}
-
-	/**
-	 * Returns the schema specification for this extension point.
-	 * 
-	 * @return the schema specification for this extension point or <code>null</code>
-	 */
-	public String getSchema() {
-		return schema;
-	}
-
-	/**
-	 * Sets this extensions added to this extension point. This object must not
-	 * be read-only.
-	 * 
-	 * @param value the extensions in this extension point. May be <code>null</code>.
-	 */
-	public void setDeclaredExtensions(ExtensionModel[] value) {
-		assertIsWriteable();
-		extensions = value;
-	}
-
-	/**
-	 * Sets the simple identifier of this extension point, or <code>null</code>
-	 * if this extension point does not have an identifier. This identifier is
-	 * specified in the plug-in manifest as a non-empty string containing no
-	 * period characters (<code>'.'</code>) and must be unique within the
-	 * defining plug-in. This object must not be read-only.
-	 * 
-	 * @param value the simple identifier of the extension point (e.g. <code>"main"</code>).
-	 *              May be <code>null</code>.
-	 */
-	public void setId(String value) {
-		assertIsWriteable();
-		id = value;
-	}
-
-	/**
-	 * Sets the plug-in model in which this extension is declared. This object
-	 * must not be read-only.
-	 * 
-	 * @param value the plug-in model in which this extension is declared. May be <code>null</code>.
-	 */
-	public void setParent(PluginModel value) {
-		assertIsWriteable();
-		plugin = value;
-	}
-
-	/**
-	 * Sets the plug-in descriptor in which this extension point is declared.
-	 * This object must not be read-only.
-	 * 
-	 * @param value the plug-in descriptor in which this extension point is declared.
-	 *             May be <code>null</code>.
-	 */
-	public void setParentPluginDescriptor(PluginDescriptorModel value) {
-		assertIsWriteable();
-		plugin = value;
-	}
-
-	/**
-	 * Sets the schema specification for this extension point. This object must
-	 * not be read-only.
-	 * 
-	 * @param value the schema specification for this extension point. May be
-	 *          <code>null</code>.
-	 */
-	public void setSchema(String value) {
-		assertIsWriteable();
-		schema = value;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/Factory.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/Factory.java
deleted file mode 100644
index 0d48059..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/Factory.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-
-/**
- * An object which can create plug-in related model objects (typically when
- * parsing plug-in manifest files).
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-
-public class Factory {
-	private MultiStatus status;
-
-	/**
-	 * Creates a factory which can be used to create plug-in model objects.
-	 * Errors and warnings during parsing etc. can be logged to the given 
-	 * status via the <code>error</code> method.
-	 *
-	 * @param status the status to which errors should be logged
-	 */
-	public Factory(MultiStatus status) {
-		super();
-		this.status = status;
-	}
-
-	/**
-	 * Returns a new configuration element model which is not initialized.
-	 *
-	 * @return a new configuration element model
-	 */
-	public ConfigurationElementModel createConfigurationElement() {
-		return new ConfigurationElementModel();
-	}
-
-	/**
-	 * Returns a new configuration property model which is not initialized.
-	 *
-	 * @return a new configuration property model
-	 */
-	public ConfigurationPropertyModel createConfigurationProperty() {
-		return new ConfigurationPropertyModel();
-	}
-
-	/**
-	 * Returns a new extension model which is not initialized.
-	 *
-	 * @return a new extension model
-	 */
-	public ExtensionModel createExtension() {
-		return new ExtensionModel();
-	}
-
-	/**
-	 * Returns a new extension point model which is not initialized.
-	 *
-	 * @return a new extension point model
-	 */
-	public ExtensionPointModel createExtensionPoint() {
-		return new ExtensionPointModel();
-	}
-
-	/**
-	 * Returns a new library model which is initialized to not export any
-	 * of its code.
-	 *
-	 * @return a new library model
-	 */
-	public LibraryModel createLibrary() {
-		return new LibraryModel();
-	}
-
-	/**
-	 * Returns a new plug-in descriptor model which is not initialized.
-	 *
-	 * @return a new plug-in descriptor model
-	 */
-	public PluginDescriptorModel createPluginDescriptor() {
-		return new PluginDescriptorModel();
-	}
-
-	/**
-	 * Returns a new plug-in fragment model which is not initialized.
-	 *
-	 * @return a new plug-in fragment model
-	 */
-	public PluginFragmentModel createPluginFragment() {
-		return new PluginFragmentModel();
-	}
-
-	/**
-	 * Returns a new plug-in prerequisite model which is initialized to
-	 * not export its code and to not require an exact match.
-	 *
-	 * @return a new plug-in prerequisite model
-	 */
-	public PluginPrerequisiteModel createPluginPrerequisite() {
-		return new PluginPrerequisiteModel();
-	}
-
-	/**
-	 * Returns a new plug-in registry model with an empty plug-in table.
-	 *
-	 * @return a new plug-in registry model
-	 */
-	public PluginRegistryModel createPluginRegistry() {
-		return new PluginRegistryModel();
-	}
-
-	/**
-	 * Returns a new URL model which is not initialized.
-	 *
-	 * @return a new URL model
-	 */
-	public URLModel createURL() {
-		return new URLModel();
-	}
-
-	/**
-	 * Handles an error state specified by the status.  The collection of all logged status
-	 * objects can be accessed using <code>getStatus()</code>.
-	 *
-	 * @param error a status detailing the error condition
-	 */
-	public void error(IStatus error) {
-		status.add(error);
-		if (InternalPlatform.DEBUG)
-			System.out.println(error.toString());
-	}
-
-	/**
-	 * Returns all of the status objects logged thus far by this factory.
-	 *
-	 * @return a multi-status containing all of the logged status objects
-	 */
-	public MultiStatus getStatus() {
-		return status;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/LibraryModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/LibraryModel.java
deleted file mode 100644
index e75c684..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/LibraryModel.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ILibrary;
-
-/**
- * A runtime library declared in a plug-in.  Libraries contribute elements to the search path.
- * These contributions are specified as a path to a directory or Jar file.  This path is always
- * considered to be relative to the containing plug-in.  
- * <p>
- * Libraries are typed.  The type is used to determine to which search path the library's
- * contribution should be added.  The valid types are: <code>CODE</code> and
- * <code>RESOURCE</code>.  
- * </p>
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public class LibraryModel extends PluginModelObject {
-
-	// DTD properties (included in plug-in manifest)
-	private String[] exports = null;
-	private String type = CODE;
-	private String[] packagePrefixes = null;
-
-	// transient properties (not included in plug-in manifest)
-	private boolean isExported = false;
-	private boolean isFullyExported = false;
-
-	/**
-	 * Constant string (value "code") indicating the code library type.
-	 */
-	public static final String CODE = "code"; //$NON-NLS-1$
-
-	/**
-	 * Constant string (value "resource") indicating the resource library type.
-	 */
-	public static final String RESOURCE = "resource"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new library model in which all fields
-	 * are <code>null</code>.
-	 */
-	public LibraryModel() {
-		super();
-	}
-
-	/**
-	 * Returns this library's export mask.
-	 *
-	 * @return this library's export mask or <code>null</code>
-	 */
-	public String[] getExports() {
-		return exports;
-	}
-
-	/**
-	 * Returns this library's type.  
-	 *
-	 * @return the type of this library.  The valid types are: <code>CODE</code> and <code>RESOURCE</code>.
-	 * @see #CODE
-	 * @see #RESOURCE
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * Returns whether or not any of the code in this library is exported.
-	 *
-	 * @return whether or not any of the code in this library represents is exported
-	 */
-	public boolean isExported() {
-		return isExported;
-	}
-
-	/**
-	 * Returns whether or not all of the code in this library is exported.
-	 *
-	 * @return whether or not all of the code in this library is exported
-	 */
-	public boolean isFullyExported() {
-		return isFullyExported;
-	}
-
-	/**
-	 * Sets this library's export mask.
-	 * This object must not be read-only.
-	 *
-	 * @param value this library's export mask.  May be <code>null</code>.
-	 */
-	public void setExports(String[] value) {
-		assertIsWriteable();
-		exports = value;
-		if (value == null) {
-			isExported = false;
-			isFullyExported = false;
-		} else {
-			for (int i = 0; i < value.length; i++) {
-				if (!value[i].equals("")) //$NON-NLS-1$
-					isExported = true;
-				if (value[i].equals("*")) //$NON-NLS-1$
-					isFullyExported = true;
-			}
-		}
-	}
-
-	/**
-	 * Sets this library's type. The valid types are: <code>CODE</code> and <code>RESOURCE</code>.
-	 * The given type value is canonicalized before being set.
-	 * This object must not be read-only.
-	 *
-	 * @param value the type of this library.
-	 * @see #CODE
-	 * @see #RESOURCE
-	 */
-	public void setType(String value) {
-		assertIsWriteable();
-		String lcValue = value.toLowerCase();
-		Assert.isTrue(lcValue.equals(CODE) || lcValue.equals(RESOURCE));
-		type = lcValue;
-	}
-
-	/**
-	 * @see ILibrary#getPackagePrefixes()
-	 */
-	public String[] getPackagePrefixes() {
-		return packagePrefixes;
-	}
-
-	/**
-	 * Sets this library's package prefixes to be the specified array or <code>null</code>.
-	 * 
-	 * @param value the list of package prefixes for this library
-	 */
-	public void setPackagePrefixes(String[] value) {
-		packagePrefixes = value;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginDescriptorModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginDescriptorModel.java
deleted file mode 100644
index 1c5d8e4..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginDescriptorModel.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-/**
- * An object which represents the user-defined contents of a plug-in
- * in a plug-in manifest.
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public class PluginDescriptorModel extends PluginModel {
-
-	// DTD properties (included in plug-in manifest)
-	private String pluginClass = null;
-
-	// transient properties (not included in plug-in manifest)
-	private boolean enabled = true; // whether or not the plugin definition loaded ok
-	private PluginFragmentModel[] fragments;
-
-	/**
-	 * Creates a new plug-in descriptor model in which all fields
-	 * are <code>null</code>.
-	 */
-	public PluginDescriptorModel() {
-		super();
-	}
-
-	/**
-	 * Returns true if this plugin has all of it's prerequisites and is,
-	 * therefore enabled.
-	 * 
-	 * @return whether or not this plug-in is fully resolved
-	 */
-	public boolean getEnabled() {
-		return enabled;
-	}
-
-	/**
-	 * Returns the fragments installed for this plug-in.
-	 *
-	 * @return this plug-in's fragments or <code>null</code>
-	 */
-	public PluginFragmentModel[] getFragments() {
-		return fragments;
-	}
-
-	/**
-	 * Returns the fully qualified name of the Java class which implements
-	 * the runtime support for this plug-in.
-	 *
-	 * @return the name of this plug-in's runtime class or <code>null</code>.
-	 */
-	public String getPluginClass() {
-		return pluginClass;
-	}
-
-	/**
-	 * Returns the unique identifier of the plug-in related to this model
-	 * or <code>null</code>.  
-	 * This identifier is a non-empty string and is unique 
-	 * within the plug-in registry.
-	 *
-	 * @return the unique identifier of the plug-in related to this model
-	 *		(e.g. <code>"com.example"</code>) or <code>null</code>. 
-	 */
-	public String getPluginId() {
-		return getId();
-	}
-
-	/**
-	 * Sets the value of the field 'enabled' to the parameter 'value'.
-	 * If this plugin is enabled (default) it is assumed to have all
-	 * of it's prerequisites.
-	 *
-	 * @param value set to false if this plugin should be disabled and
-	 * true otherwise.
-	 */
-	public void setEnabled(boolean value) {
-		enabled = value;
-	}
-
-	/**
-	 * Sets the list of fragments for this plug-in.
-	 * This object must not be read-only.
-	 *
-	 * @param value the fragments for this plug-in.  May be <code>null</code>.
-	 */
-	public void setFragments(PluginFragmentModel[] value) {
-		assertIsWriteable();
-		fragments = value;
-	}
-
-	/**
-	 * Sets the fully qualified name of the Java class which implements
-	 * the runtime support for this plug-in.
-	 * This object must not be read-only.
-	 *
-	 * @param value the name of this plug-in's runtime class.
-	 *		May be <code>null</code>.
-	 */
-	public void setPluginClass(String value) {
-		assertIsWriteable();
-		pluginClass = value;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginFragmentModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginFragmentModel.java
deleted file mode 100644
index 37e36f2..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginFragmentModel.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.PluginVersionIdentifier;
-
-/**
- * An object which represents the user-defined contents of a plug-in fragment
- * in a plug-in manifest.
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public class PluginFragmentModel extends PluginModel {
-
-	public static final byte FRAGMENT_MATCH_UNSPECIFIED = 0;
-	public static final byte FRAGMENT_MATCH_PERFECT = 1;
-	public static final byte FRAGMENT_MATCH_EQUIVALENT = 2;
-	public static final byte FRAGMENT_MATCH_COMPATIBLE = 3;
-	public static final byte FRAGMENT_MATCH_GREATER_OR_EQUAL = 4;
-
-	// DTD properties (included in plug-in manifest)
-	private String plugin = null;
-	private String pluginVersion = null;
-	private byte pluginMatch = FRAGMENT_MATCH_UNSPECIFIED;
-
-	/**
-	 * Creates a new plug-in descriptor model in which all fields
-	 * are <code>null</code>.
-	 */
-	public PluginFragmentModel() {
-		super();
-	}
-
-	/**
-	 * Returns a byte code indicating the type of match this fragment requires
-	 * when trying to find its associated plugin.
-	 * The byte code can be any one of the following:
-	 * FRAGMENT_MATCH_UNSPECIFIED			initial value
-	 * FRAGMENT_MATCH_PERFECT				perfectly equal match
-	 * FRAGMENT_MATCH_EQUIVALENT			equivalent match
-	 * FRAGMENT_MATCH_COMPATIBLE			compatible match
-	 * FRAGMENT_MATCH_GREATER_OR_EQUAL		greater than or equal to match
-	 *
-	 * @return a byte code indicating the type of match this fragment requires
-	 * @since 2.0
-	 */
-	public byte getMatch() {
-		return pluginMatch;
-	}
-
-	/**
-	 * Returns the fully qualified name of the plug-in for which this is a fragment
-	 *
-	 * @return the name of this fragment's plug-in or <code>null</code>.
-	 */
-	public String getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the unique identifier of the plug-in related to this model
-	 * or <code>null</code>.  
-	 * This identifier is a non-empty string and is unique 
-	 * within the plug-in registry.
-	 *
-	 * @return the unique identifier of the plug-in related to this model
-	 *		(e.g. <code>"com.example"</code>) or <code>null</code>. 
-	 */
-	public String getPluginId() {
-		return getPlugin();
-	}
-
-	/**
-	 * Returns the version name of the plug-in for which this is a fragment.
-	 *
-	 * @return the version name of this fragment's plug-in or <code>null</code>
-	 */
-	public String getPluginVersion() {
-		return pluginVersion;
-	}
-
-	/**
-	 * Sets the type of match this fragment requires when trying to
-	 * find its associated plugin.  The value parameter may be any
-	 * one of the following:
-	 * FRAGMENT_MATCH_UNSPECIFIED			initial value
-	 * FRAGMENT_MATCH_PERFECT				perfectly equal match
-	 * FRAGMENT_MATCH_EQUIVALENT			equivalent match
-	 * FRAGMENT_MATCH_COMPATIBLE			compatible match
-	 * FRAGMENT_MATCH_GREATER_OR_EQUAL		greater than or equal to match
-	 * This object must not be read-only.
-	 *
-	 * @param value the type of match required with the associated plugin
-	 * @since 2.0
-	 */
-	public void setMatch(byte value) {
-		assertIsWriteable();
-		Assert.isTrue((value == FRAGMENT_MATCH_PERFECT) || (value == FRAGMENT_MATCH_EQUIVALENT) || (value == FRAGMENT_MATCH_COMPATIBLE) || (value == FRAGMENT_MATCH_GREATER_OR_EQUAL));
-		pluginMatch = value;
-	}
-
-	/**
-	 * Sets the fully qualified name of the plug-in for which this is a fragment
-	 * This object must not be read-only.
-	 *
-	 * @param value the name of this fragment's plug-in.
-	 *		May be <code>null</code>.
-	 */
-	public void setPlugin(String value) {
-		assertIsWriteable();
-		plugin = value;
-	}
-
-	/**
-	 * Sets the version name of the plug-in for which this is a fragment.
-	 * The given version number is canonicalized.
-	 * This object must not be read-only.
-	 *
-	 * @param value the version name of this fragment's plug-in.
-	 *		May be <code>null</code>.
-	 */
-	public void setPluginVersion(String value) {
-		assertIsWriteable();
-		pluginVersion = new PluginVersionIdentifier(value).toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginModel.java
deleted file mode 100644
index f9ea2fa..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginModel.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-import org.eclipse.core.runtime.PluginVersionIdentifier;
-
-/**
- * An object which represents the user-defined contents of a plug-in model
- * (either a descriptor or a fragment) in a plug-in manifest.
- * <p>
- * This class may not be instantiated, but may be further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public abstract class PluginModel extends PluginModelObject {
-
-	/**
-	 * Manifest schema version. The version number is canonicalized.
-	 * May be <code>null</code>.
-	 * 
-	 * @since 3.0
-	 */
-	private String schemaVersion = null;
-
-	// DTD properties (included in plug-in manifest)
-	private String id = null;
-	private String providerName = null;
-	private String version = null;
-	private LibraryModel[] runtime = null;
-	private ExtensionPointModel[] extensionPoints = null;
-	private ExtensionModel[] extensions = null;
-	private PluginPrerequisiteModel[] requires = null;
-
-	// transient properties (not included in plug-in manifest)
-	private PluginRegistryModel registry = null;
-	private String location = null;
-
-	/**
-	 * Creates a new plug-in descriptor model in which all fields
-	 * are <code>null</code>.
-	 */
-	public PluginModel() {
-		super();
-	}
-
-	/**
-	 * Returns the extension points in this plug-in descriptor.
-	 *
-	 * @return the extension points in this plug-in descriptor or <code>null</code>
-	 */
-	public ExtensionPointModel[] getDeclaredExtensionPoints() {
-		return extensionPoints;
-	}
-
-	/**
-	 * Returns the extensions in this plug-in descriptor.
-	 *
-	 * @return the extensions in this plug-in descriptor or <code>null</code>
-	 */
-	public ExtensionModel[] getDeclaredExtensions() {
-		return extensions;
-	}
-
-	/**
-	 * Returns the unique identifier of this plug-in model
-	 * or <code>null</code>.
-	 * This identifier is a non-empty string and is unique 
-	 * within the plug-in registry.
-	 *
-	 * @return the unique identifier of this plugin model
-	 *		(e.g. <code>"com.example"</code>) or <code>null</code>. 
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Returns the location of the plug-in corresponding to this plug-in 
-	 * descriptor.  The location is in the form of a URL.
-	 *
-	 * @return the location of this plug-in descriptor or <code>null</code>.
-	 */
-	public String getLocation() {
-		return location;
-	}
-
-	/**
-	 * Returns the unique identifier of the plug-in related to this model
-	 * or <code>null</code>.  
-	 * This identifier is a non-empty string and is unique 
-	 * within the plug-in registry.
-	 *
-	 * @return the unique identifier of the plug-in related to this model
-	 *		(e.g. <code>"com.example"</code>) or <code>null</code>. 
-	 */
-	public abstract String getPluginId();
-
-	/**
-	 * Returns the name of the provider who authored this plug-in.
-	 *
-	 * @return name of the provider who authored this plug-in or <code>null</code>
-	 */
-	public String getProviderName() {
-		return providerName;
-	}
-
-	/**
-	 * Returns the plug-in registry of which this plug-in descriptor is a member.
-	 *
-	 * @return the registry in which this descriptor has been installed or 
-	 *		<code>null</code> if none.
-	 */
-	public PluginRegistryModel getRegistry() {
-		return registry;
-	}
-
-	/**
-	 * Returns the prerequisites of this plug-in.
-	 *
-	 * @return the prerequisites of this plug-in or <code>null</code>
-	 */
-	public PluginPrerequisiteModel[] getRequires() {
-		return requires;
-	}
-
-	/**
-	 * Returns the libraries configured for this plug-in.
-	 *
-	 * @return the libraries configured for this plug-in or <code>null</code>
-	 */
-	public LibraryModel[] getRuntime() {
-		return runtime;
-	}
-
-	/**
-	 * Returns the version name of this plug-in.
-	 *
-	 * @return the version name of this plug-in or <code>null</code>
-	 */
-	public String getVersion() {
-		return version;
-	}
-
-	/**
-	 * Sets this model object and all of its descendents to be read-only.
-	 * Subclasses may extend this implementation.
-	 *
-	 * @see #isReadOnly()
-	 */
-	public void markReadOnly() {
-		super.markReadOnly();
-		if (runtime != null)
-			for (int i = 0; i < runtime.length; i++)
-				runtime[i].markReadOnly();
-		if (extensionPoints != null)
-			for (int i = 0; i < extensionPoints.length; i++)
-				extensionPoints[i].markReadOnly();
-		if (extensions != null)
-			for (int i = 0; i < extensions.length; i++)
-				extensions[i].markReadOnly();
-		if (requires != null)
-			for (int i = 0; i < requires.length; i++)
-				requires[i].markReadOnly();
-	}
-
-	/**
-	 * Sets the extension points in this plug-in descriptor.
-	 * This object must not be read-only.
-	 *
-	 * @param value the extension points in this plug-in descriptor.
-	 *		May be <code>null</code>.
-	 */
-	public void setDeclaredExtensionPoints(ExtensionPointModel[] value) {
-		assertIsWriteable();
-		extensionPoints = value;
-	}
-
-	/**
-	 * Sets the extensions in this plug-in descriptor.
-	 * This object must not be read-only.
-	 *
-	 * @param value the extensions in this plug-in descriptor.
-	 *		May be <code>null</code>.
-	 */
-	public void setDeclaredExtensions(ExtensionModel[] value) {
-		assertIsWriteable();
-		extensions = value;
-	}
-
-	/**
-	 * Sets the unique identifier of this plug-in model.
-	 * The identifier is a non-empty string and is unique 
-	 * within the plug-in registry.
-	 * This object must not be read-only.
-	 *
-	 * @param value the unique identifier of the plug-in model (e.g. <code>"com.example"</code>).
-	 *		May be <code>null</code>.
-	 */
-	public void setId(String value) {
-		assertIsWriteable();
-		id = value;
-	}
-
-	/**
-	 * Optimization to replace a non-localized key with its localized value.  Avoids having
-	 * to access resource bundles for further lookups.
-	 * 
-	 * @param value the localized provider name for this model object
-	 */
-	public void setLocalizedProviderName(String value) {
-		providerName = value;
-	}
-
-	/**
-	 * Sets the location of the plug-in manifest file (e.g., <code>plugin.xml</code>)
-	 * which corresponds to this plug-in descriptor.  The location is in the
-	 * form of a URL.
-	 * This object must not be read-only.
-	 *
-	 * @param value the location of this plug-in descriptor.  May be <code>null</code>.
-	 */
-	public void setLocation(String value) {
-		assertIsWriteable();
-		location = value;
-	}
-
-	/**
-	 * Sets the name of the provider who authored this plug-in.
-	 * This object must not be read-only.
-	 *
-	 * @param value name of the provider who authored this plug-in.
-	 *		May be <code>null</code>.
-	 */
-	public void setProviderName(String value) {
-		assertIsWriteable();
-		providerName = value;
-	}
-
-	/**
-	 * Sets the registry with which this plug-in descriptor is associated.
-	 * This object must not be read-only.
-	 *
-	 * @param value the registry with which this plug-in is associated.
-	 *		May be <code>null</code>.
-	 */
-	public void setRegistry(PluginRegistryModel value) {
-		assertIsWriteable();
-		registry = value;
-	}
-
-	/**
-	 * Sets the prerequisites of this plug-in.
-	 * This object must not be read-only.
-	 *
-	 * @param value the prerequisites of this plug-in.  May be <code>null</code>.
-	 */
-	public void setRequires(PluginPrerequisiteModel[] value) {
-		assertIsWriteable();
-		requires = value;
-	}
-
-	/**
-	 * Sets the libraries configured for this plug-in.
-	 * This object must not be read-only.
-	 *
-	 * @param value the libraries configured for this plug-in.  May be <code>null</code>.
-	 */
-	public void setRuntime(LibraryModel[] value) {
-		assertIsWriteable();
-		runtime = value;
-	}
-
-	/**
-	 * Sets the version name of this plug-in.  The version number
-	 * is canonicalized.
-	 * This object must not be read-only.
-	 *
-	 * @param value the version name of this plug-in.
-	 *		May be <code>null</code>.
-	 */
-	public void setVersion(String value) {
-		assertIsWriteable();
-		version = new PluginVersionIdentifier(value).toString();
-	}
-
-	/**
-	 * Returns the manifest schema version of this plug-in. The version number is
-	 * canonicalized.
-	 * <p>
-	 * The manifest schema version indicates which shape of plug-in manifest this is.
-	 * This was introduced in 3.0; plug-ins created prior to then did not explicitly
-	 * declare a manifest schema version.
-	 * </p> 
-	 *
-	 * @return the manifest schema version of this plug-in.
-	 *		May be <code>null</code>.
-	 * @since 3.0
-	 */
-	public String getSchemaVersion() {
-		return schemaVersion;
-	}
-
-	/**
-	 * Sets the manifest schema version of this plug-in. The version number is
-	 * canonicalized. This object must not be read-only.
-	 * <p>
-	 * The manifest schema version indicates which shape of plug-in manifest this is.
-	 * This was introduced in 3.0; plug-ins created prior to then did not explicitly
-	 * declare a manifest schema version.
-	 * </p> 
-	 *
-	 * @param value the manifest schema version of this plug-in.
-	 *		May be <code>null</code>.
-	 * @since 3.0
-	 */
-	public void setSchemaVersion(String value) {
-		assertIsWriteable();
-		if (value == null)
-			schemaVersion = null;
-		else
-			schemaVersion = new PluginVersionIdentifier(value).toString();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginModelObject.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginModelObject.java
deleted file mode 100644
index 401675d..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginModelObject.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * An object which has the general characteristics of all elements
- * in a plug-in manifest.
- * <p>
- * This class may be subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-
-public abstract class PluginModelObject {
-
-	// DTD properties (included in plug-in manifest)
-	private String name = null;
-
-	// transient properties (not included in plug-in manifest)
-	private int flags = 0;
-	// the last bit is a read-only flag
-	// IMPORTANT: One bit in the "flags" integer is used to store the 
-	// read-only flag and the other bits are used to store an integer value
-	// which can be from -1 to (2**31) - 1. To help with the bit masking, the integer
-	// value stored in "flags" is (value + 1). This means that a "flags" value
-	// of 0 will NOT be marked as read-only and will return -1 for the start line value.
-	static final int M_READ_ONLY = 0x80000000;
-
-	/**
-	 * Checks that this model object is writeable.  A runtime exception
-	 * is thrown if it is not.
-	 */
-	protected void assertIsWriteable() {
-		Assert.isTrue(!isReadOnly(), "Model is read-only"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the name of this element.
-	 * 
-	 * @return the name of this element or <code>null</code>
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Return the line number for the start tag for this plug-in object. This
-	 * is the line number of the element declaration from the plug-in manifest file.
-	 * 
-	 * @return the line number of the start tag for this object
-	 */
-	public int getStartLine() {
-		return (flags & ~M_READ_ONLY) - 1;
-	}
-
-	/**
-	 * Returns whether or not this model object is read-only.
-	 * 
-	 * @return <code>true</code> if this model object is read-only,
-	 *		<code>false</code> otherwise
-	 * @see #markReadOnly()
-	 */
-	public boolean isReadOnly() {
-		return (flags & M_READ_ONLY) == M_READ_ONLY;
-	}
-
-	/**
-	 * Sets this model object and all of its descendents to be read-only.
-	 * Subclasses may extend this implementation.
-	 *
-	 * @see #isReadOnly()
-	 */
-	public void markReadOnly() {
-		flags |= M_READ_ONLY;
-	}
-
-	/**
-	 * Optimization to replace a non-localized key with its localized value.  Avoids having
-	 * to access resource bundles for further lookups.
-	 * 
-	 * @param value the localized name of this model object
-	 */
-	public void setLocalizedName(String value) {
-		name = value;
-	}
-
-	/**
-	 * Sets the name of this element.
-	 * 
-	 * @param value the new name of this element.  May be <code>null</code>.
-	 */
-	public void setName(String value) {
-		assertIsWriteable();
-		name = value;
-	}
-
-	/**
-	 * Set the line number for the start tag for this plug-in object. This is the
-	 * line number for the element declaration from the plug-in manifest file.
-	 * This value can only be set once, subsequent calls to this method will be
-	 * ignored.
-	 * 
-	 * @param lineNumber the line number of this object's declaration in the file
-	 */
-	public void setStartLine(int lineNumber) {
-		if (getStartLine() == -1)
-			flags = (lineNumber + 1) | (flags & M_READ_ONLY);
-	}
-
-	/**
-	 * Return a string representation of this object. This value is not to be relied
-	 * on and can change at any time. To be used for debugging purposes only.
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return this.getClass() + "(" + getName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginPrerequisiteModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginPrerequisiteModel.java
deleted file mode 100644
index 17f5210..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginPrerequisiteModel.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * An object which represents the relationship between a plug-in and a
- * prerequisite plug-in in the dependent's plug-in manifest.
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public class PluginPrerequisiteModel extends PluginModelObject {
-
-	public static final byte PREREQ_MATCH_UNSPECIFIED = 0;
-	public static final byte PREREQ_MATCH_PERFECT = 1;
-	public static final byte PREREQ_MATCH_EQUIVALENT = 2;
-	public static final byte PREREQ_MATCH_COMPATIBLE = 3;
-	public static final byte PREREQ_MATCH_GREATER_OR_EQUAL = 4;
-
-	// DTD properties (included in plug-in manifest)
-	private String plugin = null;
-	private String version = null;
-	private byte match = PREREQ_MATCH_UNSPECIFIED;
-	private boolean export = false;
-	private String resolvedVersion = null;
-	private boolean optional = false;
-
-	/**
-	 * Creates a new plug-in prerequisite model in which all fields
-	 * are <code>null</code>.
-	 */
-	public PluginPrerequisiteModel() {
-		super();
-	}
-
-	/**
-	 * Returns whether or not the code in this pre-requisite is exported.
-	 *
-	 * @return whether or not the code in this pre-requisite is exported
-	 */
-	public boolean getExport() {
-		return export;
-	}
-
-	/**
-	 * Returns whether or not this pre-requisite requires an exact match.
-	 *
-	 * @return whether or not this pre-requisite requires an exact match
-	 * @deprecated - use getMatchByte
-	 */
-	public boolean getMatch() {
-		return (match == PREREQ_MATCH_EQUIVALENT);
-	}
-
-	/**
-	 * Returns a byte code indicating the type of match this pre-requisite requires.
-	 * The byte code can be any one of the following:
-	 * PREREQ_MATCH_UNSPECIFIED			initial value
-	 * PREREQ_MATCH_PERFECT				perfectly equal match
-	 * PREREQ_MATCH_EQUIVALENT			equivalent match
-	 * PREREQ_MATCH_COMPATIBLE			compatible match
-	 * PREREQ_MATCH_GREATER_OR_EQUAL	greater than or equal to match
-	 *
-	 * @return a byte code indicating the type of match this pre-requisite requires
-	 * @since 2.0
-	 */
-	public byte getMatchByte() {
-		return match;
-	}
-
-	/**
-	 * Returns whether this pre-requisite is optional.
-	 *
-	 * @return whether this pre-requisite is optional
-	 */
-	public boolean getOptional() {
-		return optional;
-	}
-
-	/**
-	 * Returns the plug-in identifier of the prerequisite plug-in.
-	 * 
-	 * @return the plug-in identifier or <code>null</code>
-	 */
-	public String getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the resolved version of the prerequisite plug-in.  The
-	 * returned value is in the format specified by <code>PluginVersionIdentifier</code>.
-	 *
-	 * @return the version of the prerequisite plug-in
-	 * @see org.eclipse.core.runtime.PluginVersionIdentifier
-	 */
-	public String getResolvedVersion() {
-		return resolvedVersion;
-	}
-
-	/**
-	 * Returns the version name of this plug-in.
-	 *
-	 * @return the version name of this plug-in or <code>null</code>
-	 */
-	public String getVersion() {
-		return version;
-	}
-
-	/**
-	 * Sets whether or not the code in this pre-requisite is exported.
-	 * This object must not be read-only.
-	 *
-	 * @param value whether or not the code in this pre-requisite is exported
-	 */
-	public void setExport(boolean value) {
-		assertIsWriteable();
-		export = value;
-	}
-
-	/**
-	 * Sets whether or not this pre-requisite requires an exact match.
-	 * This object must not be read-only.
-	 *
-	 * @param value whether or not this pre-requisite requires an exact match
-	 * @deprecated use setMatchByte
-	 */
-	public void setMatch(boolean value) {
-		assertIsWriteable();
-		if (value) {
-			setMatchByte(PREREQ_MATCH_EQUIVALENT);
-		} else {
-			setMatchByte(PREREQ_MATCH_COMPATIBLE);
-		}
-	}
-
-	/**
-	 * Sets whether or not this pre-requisite requires an exact match.
-	 * This object must not be read-only.
-	 *
-	 * @param value whether or not this pre-requisite requires an exact match
-	 * @since 2.0
-	 */
-	public void setMatchByte(byte value) {
-		assertIsWriteable();
-		Assert.isTrue((value == PREREQ_MATCH_PERFECT) || (value == PREREQ_MATCH_EQUIVALENT) || (value == PREREQ_MATCH_COMPATIBLE) || (value == PREREQ_MATCH_GREATER_OR_EQUAL));
-		match = value;
-	}
-
-	/**
-	 * Sets whether this pre-requisite is optional.
-	 * This object must not be read-only.
-	 *
-	 * @param value whether this pre-requisite is optional
-	 */
-	public void setOptional(boolean value) {
-		assertIsWriteable();
-		optional = value;
-	}
-
-	/**
-	 * Sets the plug-in identifier of this prerequisite plug-in.
-	 * This object must not be read-only.
-	 * 
-	 * @param value the prerequisite plug-in identifier.  May be <code>null</code>.
-	 */
-	public void setPlugin(String value) {
-		assertIsWriteable();
-		plugin = value;
-	}
-
-	/**
-	 * Sets the resolved version of the prerequisite plug-in.  The
-	 * given value is in the format specified by <code>PluginVersionIdentifier</code>.
-	 *
-	 * @param value the version of the prerequisite plug-in
-	 * @see org.eclipse.core.runtime.PluginVersionIdentifier
-	 */
-	public void setResolvedVersion(String value) {
-		assertIsWriteable();
-		resolvedVersion = value;
-	}
-
-	/**
-	 * Sets the version name of this plug-in prerequisite.
-	 * This object must not be read-only.
-	 *
-	 * @param value the version name of this plug-in prerequisite.
-	 *		May be <code>null</code>.
-	 */
-	public void setVersion(String value) {
-		assertIsWriteable();
-		version = value;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginRegistryModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginRegistryModel.java
deleted file mode 100644
index a027781..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/PluginRegistryModel.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-import java.net.URL;
-import java.util.HashMap;
-import java.util.List;
-import org.eclipse.core.internal.model.PluginMap;
-import org.eclipse.core.internal.model.RegistryResolver;
-import org.eclipse.core.internal.plugins.InternalPlatform;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A container for a collection of plug-in descriptors.
- * <p>
- * This class may be instantiated, or further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-public class PluginRegistryModel {
-
-	// transient properties (not included in plug-in manifest)
-	protected PluginMap plugins = new PluginMap(new HashMap(30), false, true);
-	protected PluginMap fragments = new PluginMap(new HashMap(30), false, true);
-	private boolean readOnly = false;
-	private boolean resolved = false;
-
-	/**
-	 * Creates a new plug-in registry model which contains no plug-ins.
-	 */
-	public PluginRegistryModel() {
-		super();
-	}
-
-	/**
-	 * Adds the specified plug-in fragment to this registry.  An existing fragment
-	 * with the same unique id and version is replaced by the new
-	 * value.  
-	 *
-	 * @param fragment the plug-in fragment to add
-	 */
-	public void addFragment(PluginFragmentModel fragment) {
-		assertIsWriteable();
-		fragments.add(fragment);
-	}
-
-	/**
-	 * Adds the specified plug-in to this registry.  An existing plug-in
-	 * with the same unique id and version is replaced by the new
-	 * value.  
-	 *
-	 * @param plugin the plug-in descriptor to add
-	 */
-	public void addPlugin(PluginDescriptorModel plugin) {
-		assertIsWriteable();
-		plugins.add(plugin);
-	}
-
-	/**
-	 * Checks that this model object is writeable.  A runtime exception
-	 * is thrown if it is not.
-	 */
-	protected void assertIsWriteable() {
-		Assert.isTrue(!isReadOnly(), "Model is read-only"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the plug-in fragment with the given identifier
-	 * in this plug-in registry, or <code>null</code> if there is no such
-	 * fragment.  If there are multiple versions of the identified fragment,
-	 * one will be non-deterministically chosen and returned.  
-	 *
-	 * @param id the unique identifier of the plug-in fragment
-	 *		(e.g. <code>"com.example.acme"</code>).
-	 * @return the plug-in fragment, or <code>null</code>
-	 */
-	public PluginFragmentModel getFragment(String id) {
-		return (PluginFragmentModel) fragments.getAny(id);
-	}
-
-	/**
-	 * Returns the identified plug-in fragment or <code>null</code> if
-	 * the fragment does not exist.
-	 *
-	 * @param id the unique identifier of the plug-in fragment
-	 * @param version fragment version identifier. If <code>null</code> is
-	 * specified, a non-deterministically chosen version of the identified fragment
-	 * (if any) will be returned
-	 * @return the matching fragment in this registry, or <code>null</code>
-	 */
-	public PluginFragmentModel getFragment(String id, String version) {
-		return (PluginFragmentModel) fragments.get(id, version);
-	}
-
-	/**
-	 * Returns the list of plug-in fragments managed by this registry.
-	 *
-	 * @return the fragments in this registry
-	 */
-	public PluginFragmentModel[] getFragments() {
-		PluginFragmentModel[] result = new PluginFragmentModel[fragments.size()];
-		fragments.copyToArray(result);
-		return result;
-	}
-
-	/**
-	 * Returns all versions of the identified plug-in fragment
-	 * known to this plug-in registry.
-	 * Returns an empty array if there are no fragments
-	 * with the specified identifier.
-	 *
-	 * @param id the unique identifier of the plug-in fragment
-	 *		(e.g. <code>"org.eclipse.core.resources"</code>).
-	 * @return the fragments known to this plug-in registry with the given id
-	 */
-	public PluginFragmentModel[] getFragments(String id) {
-		List versions = fragments.getVersions(id);
-		if (versions == null || versions.isEmpty())
-			return new PluginFragmentModel[0];
-		return (PluginFragmentModel[]) versions.toArray(new PluginFragmentModel[versions.size()]);
-	}
-
-	/**
-	 * Returns the plug-in descriptor with the given plug-in identifier
-	 * in this plug-in registry, or <code>null</code> if there is no such
-	 * plug-in.  If there are multiple versions of the identified plug-in,
-	 * one will be non-deterministically chosen and returned.  
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"com.example.acme"</code>).
-	 * @return the plug-in descriptor, or <code>null</code>
-	 */
-	public PluginDescriptorModel getPlugin(String pluginId) {
-		return (PluginDescriptorModel) plugins.getAny(pluginId);
-	}
-
-	/**
-	 * Returns the identified plug-in or <code>null</code> if
-	 * the plug-in does not exist. 
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"org.eclipse.core.resources"</code>)
-	 * @param version plug-in version identifier. If <code>null</code> is specified,
-	 * a non-deterministically chosen version of the identified plug-in (if any)
-	 * will be returned
-	 * @return the matching plug-in in this registry or <code>null</code>
-	 */
-	public PluginDescriptorModel getPlugin(String pluginId, String version) {
-		PluginDescriptorModel[] list = getPlugins(pluginId);
-		if (list == null || list.length == 0)
-			return null;
-		if (version == null)
-			// Just return the first one in the list (random)
-			return list[0];
-
-		for (int i = 0; i < list.length; i++) {
-			PluginDescriptorModel element = list[i];
-			if (element.getVersion().equals(version))
-				return element;
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the list of plug-ins managed by this registry.
-	 *
-	 * @return the plug-ins in this registry
-	 */
-	public PluginDescriptorModel[] getPlugins() {
-		PluginDescriptorModel[] result = new PluginDescriptorModel[plugins.size()];
-		plugins.copyToArray(result);
-		return result;
-	}
-
-	/**
-	 * Returns all versions of the identified plug-in descriptor
-	 * known to this plug-in registry.
-	 * Returns an empty array if there are no plug-ins
-	 * with the specified identifier.
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"org.eclipse.core.resources"</code>).
-	 * @return the plug-in descriptors known to this plug-in registry
-	 */
-	public PluginDescriptorModel[] getPlugins(String pluginId) {
-		List versions = plugins.getVersions(pluginId);
-		if (versions == null || versions.isEmpty())
-			return new PluginDescriptorModel[0];
-		return (PluginDescriptorModel[]) versions.toArray(new PluginDescriptorModel[versions.size()]);
-
-	}
-
-	/**
-	 * Returns whether or not this model object is read-only.
-	 * 
-	 * @return <code>true</code> if this model object is read-only,
-	 *		<code>false</code> otherwise
-	 * @see #markReadOnly()
-	 */
-	public boolean isReadOnly() {
-		return readOnly;
-	}
-
-	/**
-	 * Returns whether or not this model object has been resolved.
-	 * 
-	 * @return <code>true</code> if this model object has been resolved,
-	 *		<code>false</code> otherwise
-	 */
-	public boolean isResolved() {
-		return resolved;
-	}
-
-	/**
-	 * Sets this model object and all of its descendents to be read-only.
-	 * Subclasses may extend this implementation.
-	 *
-	 * @see #isReadOnly()
-	 */
-	public void markReadOnly() {
-		readOnly = true;
-		plugins.markReadOnly();
-		fragments.markReadOnly();
-	}
-
-	/**
-	 * Sets this model object to be resolved.
-	 */
-	public void markResolved() {
-		resolved = true;
-	}
-
-	/**
-	 * Removes the fragment with id and version if it exists in this registry.
-	 * This method has no effect if a fragment with the given id and version 
-	 * cannot be found.
-	 *
-	 * @param id the unique identifier of the fragment to remove
-	 * @param version the version of the fragment to remove
-	 */
-	public void removeFragment(String id, String version) {
-		assertIsWriteable();
-		fragments.remove(id, version);
-	}
-
-	/**
-	 * Removes all versions of the identified plug-in fragment from this registry.
-	 * This method has no effect if such a fragment cannot be found.
-	 *
-	 * @param id the unique identifier of the fragments to remove
-	 */
-	public void removeFragments(String id) {
-		assertIsWriteable();
-		fragments.removeVersions(id);
-	}
-
-	/**
-	 * Removes the plug-in with id and version if it exists in this registry.
-	 * This method has no effect if a plug-in with the given id and version 
-	 * cannot be found.
-	 *
-	 * @param pluginId the unique identifier of the plug-in to remove
-	 * @param version the version of the plug-in to remove
-	 */
-	public void removePlugin(String pluginId, String version) {
-		assertIsWriteable();
-		plugins.remove(pluginId, version);
-	}
-
-	/**
-	 * Removes all versions of the given plug-in from this registry.
-	 * This method has no effect if such a plug-in cannot be found.
-	 *
-	 * @param pluginId the unique identifier of the plug-ins to remove
-	 */
-	public void removePlugins(String pluginId) {
-		assertIsWriteable();
-		plugins.removeVersions(pluginId);
-	}
-
-	/**
-	 * Runs a resolve through the entire registry.  This resolve will
-	 * mark any PluginDescriptorModels which do not have access to all
-	 * of their prerequisites as disabled.  Prerequisites which cause
-	 * cyclical dependencies will be marked as disabled.
-	 * <p>
-	 * If the parameter trimDisabledPlugins is set to true, all PluginDescriptorModels
-	 * which are labelled as disabled will be removed from the registry.
-	 * </p><p>
-	 * If the paramter doCrossLinking is set to true, links will be
-	 * created between ExtensionPointModels and their corresponding
-	 * ExtensionModels.  Not that these links will include disabled
-	 * plugins if trimDisabledPlugins was set to false.
-	 * </p>
-	 * @param trimDisabledPlugins if true, remove all disabled plugins
-	 * from the registry (recommended value = true)
-	 * @param doCrossLinking if true, link all ExtensionModels in the registry
-	 * to their corresponding ExtensionPointModel (recommended value = true).
-	 * @return a status object describing the result of resolving.
-	 */
-	public IStatus resolve(boolean trimDisabledPlugins, boolean doCrossLinking) {
-		RegistryResolver resolver = new RegistryResolver();
-		resolver.setTrimPlugins(trimDisabledPlugins);
-		resolver.setCrossLink(doCrossLinking);
-		return resolver.resolve(this);
-	}
-
-	/**
-	 * Returns a plug-in registry containing all of the plug-ins discovered
-	 * on the given plug-in path.  Any problems encountered are added to
-	 * the status managed by the supplied factory.
-	 * <p>
-	 * The given plug-in path is the list of locations in which to look for plug-ins.
-	 * If an entry identifies a directory (i.e., ends in a '/'), this method
-	 * attempts to scan all sub-directories for plug-ins.  Alternatively, an
-	 * entry may identify a particular plug-in manifest (<code>plugin.xml</code>) file.
-	 * </p>
-	 * <p>
-	 * <b>Note:</b> this method does not affect the running platform.  It is intended
-	 * for introspecting installed plug-ins on this and other platforms.  The returned
-	 * registry is <b>not</b> the same as the platform's registry.
-	 * </p>
-	 * @param pluginPath the list of locations in which to look for plug-ins
-	 * @param factory the factory to use to create runtime model objects
-	 * @return the registry of parsed plug-ins
-	 */
-	public static PluginRegistryModel parsePlugins(URL[] pluginPath, Factory factory) {
-		return InternalPlatform.parsePlugins(pluginPath, factory, false);
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/URLModel.java b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/URLModel.java
deleted file mode 100644
index 31f8b8c..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/URLModel.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime.model;
-
-/**
- * An object which represents a named URL in a component or configuration
- * manifest.
- * <p>
- * This class may be instantiated and further subclassed.
- * </p>
- * @deprecated In Eclipse 3.0 the runtime was refactored and all 
- * non-essential elements removed.  This class provides facilities primarily intended
- * for tooling.  As such it has been removed and no directly substitutable API provided.
- */
-
-public class URLModel extends PluginModelObject {
-	// DTD properties (included in install manifest)
-	private String url = null;
-
-	/**
-	 * Returns the URL specification.
-	 *
-	 * @return the URL specification or <code>null</code>.
-	 */
-	public String getURL() {
-		return url;
-	}
-
-	/**
-	 * Sets the URL specification.
-	 * This object must not be read-only.
-	 *
-	 * @param value the URL specification.
-	 *		May be <code>null</code>.
-	 */
-	public void setURL(String value) {
-		assertIsWriteable();
-		url = value;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/package.html b/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/package.html
deleted file mode 100644
index a1289bb..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-model/org/eclipse/core/runtime/model/package.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides core support for the modeling plug-ins and the plug-in registry.
-<h2>Package Specification</h2>
-This package specifies the runtime API related to modeling plug-ins and the plug-in
-registry.  The types provided here are typically data containers and have very little 
-behaviour other than setters and getters.  They are primarily intended for clients writing
-tools which manipulate/change registry entries as part of their normal work.  
-
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/compatibility/PluginActivator.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/compatibility/PluginActivator.java
deleted file mode 100644
index 1363549..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/compatibility/PluginActivator.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.core.internal.compatibility;
-
-import org.eclipse.core.internal.plugins.PluginDescriptor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class PluginActivator implements BundleActivator {
-	private Plugin plugin;
-
-	public PluginActivator() {
-		super();
-	}
-
-	public void start(BundleContext context) throws Exception {
-		PluginDescriptor pd = (PluginDescriptor) Platform.getPluginRegistry().getPluginDescriptor(context.getBundle().getSymbolicName());
-		plugin = pd.getPlugin();
-		try {
-			plugin.start(context);
-			plugin.startup();
-		} catch(Exception e) {
-			try {
-				plugin.shutdown();
-				plugin.stop(context);
-				pd.markAsDeactivated();
-			} catch(Exception e1) {
-				// We are mostly interested in the original exception 
-				e1.printStackTrace();
-			}
-			throw e;
-		}
-	}
-
-	public void stop(BundleContext context) throws Exception {
-		plugin.shutdown();
-		plugin.stop(context);
-		((PluginDescriptor) plugin.getDescriptor()).doPluginDeactivation();
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/CompatibilityActivator.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/CompatibilityActivator.java
deleted file mode 100644
index e574445..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/CompatibilityActivator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.plugins;
-
-import org.eclipse.core.internal.runtime.CompatibilityHelper;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Platform;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class CompatibilityActivator implements BundleActivator {
-	public void start(BundleContext context) throws Exception {
-		IPluginDescriptor descriptor = CompatibilityHelper.getPluginDescriptor(Platform.PI_RUNTIME);
-		CompatibilityHelper.setPlugin(descriptor, InternalPlatform.getDefault().getRuntimeInstance());
-		CompatibilityHelper.setActive(descriptor);
-	}
-
-	public void stop(BundleContext context) throws Exception {
-		IPluginDescriptor descriptor = CompatibilityHelper.getPluginDescriptor(Platform.PI_RUNTIME);
-		CompatibilityHelper.setPlugin(descriptor, null);
-		((PluginRegistry) org.eclipse.core.internal.plugins.InternalPlatform.getPluginRegistry()).close();
-		CompatibilityHelper.nullCompatibility();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/DefaultPlugin.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/DefaultPlugin.java
deleted file mode 100644
index c09953d..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/DefaultPlugin.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.plugins;
-
-/**
- * Dummy plugin runtime class implementation
- */
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Plugin;
-
-public class DefaultPlugin extends Plugin {
-	public DefaultPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/DevClassPathHelper.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/DevClassPathHelper.java
deleted file mode 100644
index 33af604..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/DevClassPathHelper.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.plugins;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.*;
-
-public class DevClassPathHelper {
-	static protected boolean inDevelopmentMode = false;
-	static protected String[] devDefaultClasspath;
-	static protected Properties devProperties = null;
-
-	static {
-		// Check the osgi.dev property to see if dev classpath entries have been defined.
-		String osgiDev = System.getProperty("osgi.dev"); //$NON-NLS-1$
-		if (osgiDev != null) {
-			try {
-				inDevelopmentMode = true;
-				URL location = new URL(osgiDev);
-				devProperties = load(location);
-				devDefaultClasspath = getArrayFromList(devProperties.getProperty("*")); //$NON-NLS-1$
-			} catch (MalformedURLException e) {
-				devDefaultClasspath = getArrayFromList(osgiDev);
-			}
-		}
-	}
-
-	public static String[] getDevClassPath(String id) {
-		String[] result = null;
-		if (id != null && devProperties != null) {
-			String entry = devProperties.getProperty(id);
-			if (entry != null)
-				result = getArrayFromList(entry);
-		}
-		if (result == null)
-			result = devDefaultClasspath;
-		return result;
-	}
-
-	/**
-	 * Returns the result of converting a list of comma-separated tokens into an array
-	 * 
-	 * @return the array of string tokens
-	 * @param prop the initial comma-separated string
-	 */
-	public static String[] getArrayFromList(String prop) {
-		if (prop == null || prop.trim().equals("")) //$NON-NLS-1$
-			return new String[0];
-		Vector list = new Vector();
-		StringTokenizer tokens = new StringTokenizer(prop, ","); //$NON-NLS-1$
-		while (tokens.hasMoreTokens()) {
-			String token = tokens.nextToken().trim();
-			if (!token.equals("")) //$NON-NLS-1$
-				list.addElement(token);
-		}
-		return list.isEmpty() ? new String[0] : (String[]) list.toArray(new String[list.size()]);
-	}
-
-	public static boolean inDevelopmentMode() {
-		return inDevelopmentMode;
-	}
-
-	/*
-	 * Load the given properties file
-	 */
-	private static Properties load(URL url) {
-		Properties props = new Properties();
-		try {
-			InputStream is = null;
-			try {
-				is = url.openStream();
-				props.load(is);
-			} finally {
-				if (is != null)
-					is.close();
-			}
-		} catch (IOException e) {
-			// TODO consider logging here
-		}
-		return props;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/InternalPlatform.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/InternalPlatform.java
deleted file mode 100644
index b197f69..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/InternalPlatform.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.plugins;
-
-import java.net.URL;
-import org.eclipse.core.internal.model.RegistryLoader;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.model.Factory;
-import org.eclipse.core.runtime.model.PluginRegistryModel;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-
-
-/**
- * @deprecated Marking as deprecated to remove the warnings
- */
-public class InternalPlatform {
-	private static IPluginRegistry registry = null;
-
-	public static IPluginRegistry getPluginRegistry() {
-		if (registry == null) {
-			registry = new PluginRegistry();
-		}
-		return registry;
-	}
-
-	public static IPluginDescriptor getPluginDescriptor(String pluginId) {
-		return getPluginRegistry().getPluginDescriptor(pluginId);
-	}
-
-	public static void installPlugins(URL[] installURLs) throws CoreException {
-		String message = Policy.bind("platform.errorInstalling"); //$NON-NLS-1$
-		MultiStatus result = new MultiStatus(Platform.PI_RUNTIME, 0, message, null);
-		BundleContext context = org.eclipse.core.internal.runtime.InternalPlatform.getDefault().getBundleContext();
-		for (int i = 0; i < installURLs.length; i++) {
-			try {
-				context.installBundle(installURLs[i].toExternalForm());
-			} catch (BundleException e) {
-				IStatus status = new Status(IStatus.ERROR, Platform.PI_RUNTIME, 0, org.eclipse.core.internal.plugins.Policy.bind("platform.cannotInstallPlugin", installURLs[i].toExternalForm()), e); //$NON-NLS-1$
-				result.merge(status);
-			}
-		}
-		if (!result.isOK())
-			throw new CoreException(result);
-	}
-
-
-	/**
-	 * Convenience method equivalent to parsePlugins(URL[], Factory, boolean) where debug is set to false.
-	 * @see #parsePlugins(URL[], Factory, boolean)
-	 */
-	public static PluginRegistryModel parsePlugins(URL[] pluginPath, Factory factory) {
-		return parsePlugins(pluginPath, factory, false);
-	}
-
-	/**
-	 * Returns a plug-in registry containing all of the plug-ins discovered
-	 * on the given plug-in path.  Any problems encountered are added to
-	 * the status managed by the supplied factory.
-	 * <p>
-	 * The given plug-in path is the list of locations in which to look for plug-ins.
-	 * If an entry identifies a directory (i.e., ends in a '/'), this method
-	 * attempts to scan all sub-directories for plug-ins.  Alternatively, an
-	 * entry may identify a particular plug-in manifest (<code>plugin.xml</code>) file.
-	 * </p>
-	 * <p>
-	 * <b>Note:</b> this method does not affect the running platform.  It is intended
-	 * for introspecting installed plug-ins on this and other platforms.  The returned
-	 * registry is <b>not</b> the same as the platform's registry.
-	 * </p>
-	 *
-	 * @param pluginPath the list of locations in which to look for plug-ins
-	 * @param factory the factory to use to create runtime model objects
-	 * @param debug turn the debug information on or off
-	 * @return the registry of parsed plug-ins
-	 */
-	public synchronized static PluginRegistryModel parsePlugins(URL[] pluginPath, Factory factory, boolean debug) {
-		return RegistryLoader.parseRegistry(pluginPath, factory, debug);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/Library.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/Library.java
deleted file mode 100644
index 12b70bc..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/Library.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.plugins;
-
-import org.eclipse.core.runtime.*;
-
-public class Library implements ILibrary {
-	public String path;
-
-	public Library(String path) {
-		this.path = path;
-	}
-
-	public String[] getContentFilters() {
-		return null;
-	}
-
-	public IPath getPath() {
-		return new Path(path);
-	}
-
-	public String getType() {
-		return ILibrary.CODE;
-	}
-
-	public boolean isExported() {
-		return true;
-	}
-
-	public boolean isFullyExported() {
-		return true;
-	}
-
-	public String[] getPackagePrefixes() {
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginClassLoader.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginClassLoader.java
deleted file mode 100644
index d0f6ca5..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginClassLoader.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.plugins;
-
-import java.io.IOException;
-import java.net.*;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.ILibrary;
-import org.eclipse.core.runtime.Platform;
-import org.osgi.framework.Bundle;
-
-public class PluginClassLoader extends URLClassLoader {
-	private Bundle bundle; //We should be able to get rid of this field, since the info is in the descriptor
-	private PluginDescriptor descriptor;
-
-	PluginClassLoader(PluginDescriptor descriptor) {
-		super(computeURLs(descriptor));
-		this.descriptor = descriptor;
-		this.bundle = InternalPlatform.getDefault().getBundle(descriptor.getUniqueIdentifier());
-		if (bundle == null)
-			throw new IllegalArgumentException();
-	}
-
-	private static URL[] computeURLs(PluginDescriptor descriptor) {
-		Bundle bundle = InternalPlatform.getDefault().getBundle(descriptor.getUniqueIdentifier());
-		if (bundle == null)
-			throw new IllegalArgumentException();
-
-		ILibrary[] libs = descriptor.getRuntimeLibraries();
-		String[] devPath = computeDevPath(bundle);
-		URL pluginBase = descriptor.getInstallURL();
-		try {
-			pluginBase = Platform.resolve(descriptor.getInstallURL());
-		} catch (IOException e1) {
-			//Ignore
-		}
-
-		URL[] urls = new URL[devPath.length + libs.length];
-		int j = 0;
-		for (int i = 0; i < devPath.length; i++) {
-			try {
-				urls[j++] = new URL(pluginBase, devPath[i]);
-			} catch (MalformedURLException e) {
-				//Ignore the exception
-			}
-		}
-		for (int i = 0; i < libs.length; i++) {
-			try {
-				urls[j++] = new URL(pluginBase, libs[i].getPath().toOSString());
-			} catch (MalformedURLException e) {
-				//Ignore the exception
-			}
-		}
-		return urls;
-	}
-
-	private static String[] computeDevPath(Bundle bundle) {
-		if (!DevClassPathHelper.inDevelopmentMode())
-			return new String[0];
-
-		String pluginId = bundle.getSymbolicName();
-		if (pluginId == null)
-			return new String[0];
-		return DevClassPathHelper.getDevClassPath(pluginId);
-	}
-
-	protected Class findClass(String name) throws ClassNotFoundException {
-		return bundle.loadClass(name); // if no CNFE is thrown, activate the bundle (if needed)
-	}
-
-	public URL findResource(String name) {
-		return bundle.getResource(name);
-	}
-
-	public PluginDescriptor getPluginDescriptor() {
-		return descriptor;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginDescriptor.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginDescriptor.java
deleted file mode 100644
index b2f5ad8..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginDescriptor.java
+++ /dev/null
@@ -1,458 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.plugins;
-
-import java.io.IOException;
-import java.lang.reflect.Constructor;
-import java.net.URL;
-import java.util.*;
-import org.eclipse.core.internal.boot.PlatformURLHandler;
-import org.eclipse.core.internal.runtime.*;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.service.resolver.BundleDescription;
-import org.eclipse.osgi.service.resolver.BundleSpecification;
-import org.eclipse.osgi.util.ManifestElement;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.*;
-
-
-/**
- * @deprecated Marking as deprecated to remove the warnings
- */
-public class PluginDescriptor implements IPluginDescriptor {
-
-	private static final String PLUGIN_CLASS = "Plugin-Class"; //$NON-NLS-1$
-	protected Plugin pluginObject = null; // plugin object
-	private Bundle bundleOsgi;
-
-	//The three following fields can't be replaced by a test to the bundle state.
-	private boolean active = false; // plugin is active
-	private volatile boolean activePending = false; // being activated
-	private boolean deactivated = false; // plugin deactivated due to startup errors
-	private ResourceBundle resources = null; 
-	private PluginClassLoader classLoader;
-
-	// constants
-	static final String PLUGIN_URL = PlatformURLHandler.PROTOCOL + PlatformURLHandler.PROTOCOL_SEPARATOR + "/" + PlatformURLPluginConnection.PLUGIN + "/"; //$NON-NLS-1$ //$NON-NLS-2$
-	static final String VERSION_SEPARATOR = "_"; //$NON-NLS-1$
-
-	synchronized public void doPluginDeactivation() {
-		pluginObject = null;
-		active = false;
-		activePending = false;
-		deactivated = false;
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public IExtension getExtension(String id) {
-		IExtension[] exts = getExtensions();
-		for (int i = 0; i < exts.length; i++) {
-			if (exts[i].getSimpleIdentifier().equals(id))
-				return exts[i];
-		}
-		return null;
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public IExtensionPoint getExtensionPoint(String extensionPointId) {
-		return InternalPlatform.getDefault().getRegistry().getExtensionPoint(getId(), extensionPointId);
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public IExtensionPoint[] getExtensionPoints() {
-		return InternalPlatform.getDefault().getRegistry().getExtensionPoints(getId());
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public IExtension[] getExtensions() {
-		return org.eclipse.core.internal.runtime.InternalPlatform.getDefault().getRegistry().getExtensions(getId());
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public URL getInstallURL() {
-		try {
-			return new URL(PLUGIN_URL + toString() + '/');
-		} catch (IOException e) {
-			throw new IllegalStateException(); // unchecked
-		}
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public String getLabel() {
-		return (String) bundleOsgi.getHeaders().get(Constants.BUNDLE_NAME);
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public ClassLoader getPluginClassLoader() {
-		synchronized (this) {
-			if (classLoader == null)
-				classLoader = new PluginClassLoader(this);
-		}
-		return classLoader;
-	}
-
-	public PluginRegistry getPluginRegistry() {
-		return (PluginRegistry) org.eclipse.core.internal.plugins.InternalPlatform.getPluginRegistry();
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public String getProviderName() {
-		return (String) bundleOsgi.getHeaders().get(Constants.BUNDLE_VENDOR);
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public ResourceBundle getResourceBundle() throws MissingResourceException {
-		if (resources==null)
-			resources = ResourceTranslator.getResourceBundle(bundleOsgi);
-		return resources;
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public String getResourceString(String value) {
-		return ResourceTranslator.getResourceString(bundleOsgi, value);
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public String getResourceString(String value, ResourceBundle b) {
-		return ResourceTranslator.getResourceString(bundleOsgi, value, b);
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public ILibrary[] getRuntimeLibraries() {
-		Bundle[] allBundles;
-		Bundle[] fragments = InternalPlatform.getDefault().getFragments(bundleOsgi);
-		if (fragments != null) {
-			allBundles = new Bundle[fragments.length + 1];
-			allBundles[0] = bundleOsgi;
-			System.arraycopy(fragments, 0, allBundles, 1, fragments.length);
-		} else
-			allBundles = new Bundle[] {bundleOsgi};
-		ArrayList allLibraries = new ArrayList();
-		// keep track of whether or not we have already added a "." to this classpath
-		boolean addedDot = false;
-		for (int i = 0; i < allBundles.length; i++)
-			try {
-				ManifestElement[] classpathElements = ManifestElement.parseHeader(Constants.BUNDLE_CLASSPATH, (String) allBundles[i].getHeaders("").get(Constants.BUNDLE_CLASSPATH)); //$NON-NLS-1$
-				// if there is no bundle classpath header, then we have to 
-				// add "." to the classpath
-				if (classpathElements == null) {
-					if (addedDot) 
-						continue; 
-					allLibraries.add(new Library(".")); //$NON-NLS-1$
-					addedDot = true;
-				} else
-					for (int j = 0; j < classpathElements.length; j++)
-						allLibraries.add(new Library(classpathElements[j].getValue()));
-			} catch (BundleException e) {
-				//Ignore because by the time we get here the errors will have already been logged.
-			}
-		return (ILibrary[]) allLibraries.toArray(new ILibrary[allLibraries.size()]);
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public String getUniqueIdentifier() {
-		return getId();
-	}
-
-	/**
-	 * @see #toString()
-	 */
-	public static String getUniqueIdentifierFromString(String pluginString) {
-		int ix = pluginString.indexOf(VERSION_SEPARATOR);
-		return ix == -1 ? pluginString : pluginString.substring(0, ix);
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public PluginVersionIdentifier getVersionIdentifier() {
-		String version = (String) bundleOsgi.getHeaders("").get(Constants.BUNDLE_VERSION); //$NON-NLS-1$
-		try {
-			return new PluginVersionIdentifier(version);
-		} catch (Exception e) {
-			return new PluginVersionIdentifier("1.0.0"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see #toString()
-	 */
-	public static PluginVersionIdentifier getVersionIdentifierFromString(String pluginString) {
-		return new PluginVersionIdentifier(pluginString);
-	}
-
-	public IPluginPrerequisite[] getPluginPrerequisites() {
-		BundleDescription description = Platform.getPlatformAdmin().getState(false).getBundle(bundleOsgi.getBundleId());
-		BundleSpecification[] specs = description.getRequiredBundles();
-
-		IPluginPrerequisite[] resolvedPrerequisites = new IPluginPrerequisite[specs.length];
-		for (int j = 0; j < specs.length; j++)
-			resolvedPrerequisites[j] = new PluginPrerequisite(specs[j]);
-		return resolvedPrerequisites;
-	}
-
-	/**
-	 * Returns true if the plugin is active or is currently in the process of being 
-	 * activated, and false otherwse.
-	 * NOTE: This method is not synchronized because it is called from within a
-	 * sync block in PluginClassLoader.
-	 */
-	boolean hasActivationStarted() {
-		return activePending || active;
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public synchronized boolean isPluginActivated() {
-		//note that this method is synchronized for good reason.  
-		//During plugin activation, neither true nor false would be valid
-		//return values for this method, so it must block until activation
-		//completes.  For example, returning false during activation
-		//would break the registry shutdown procedure, because a
-		//plugin being activated during shutdown would never be shut down.
-		return bundleOsgi.getState() == Bundle.ACTIVE;
-	}
-
-	/*
-	 * NOTE: This method is not synchronized because it is called from within a
-	 * sync block in PluginClassLoader.
-	 */
-	public boolean isPluginDeactivated() {
-		return deactivated;
-	}
-
-	private void logError(IStatus status) {
-		InternalPlatform.getDefault().getLog(org.eclipse.core.internal.runtime.InternalPlatform.getDefault().getBundleContext().getBundle()).log(status);
-	}
-
-	/**
-	 * Returns <code>true</code> if we should continue with the plugin activation.
-	 */
-	private boolean pluginActivationEnter() throws CoreException {
-		if (deactivated) {
-			// had permanent error on startup
-			String errorMsg = NLS.bind(Messages.plugin_pluginDisabled, getId());
-			throwException(errorMsg, null);
-		}
-		if (active || activePending) {
-			// already up and running 
-			return false;
-		}
-		activePending = true;
-		// go ahead and try to activate
-		return true;
-	}
-
-	private void pluginActivationExit(boolean errorExit) {
-		if (errorExit) {
-			active = false;
-			deactivated = true;
-		} else
-			active = true;
-		// we are done with the activation
-		activePending = false;
-	}
-
-	private void throwException(String message, Throwable exception) throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.PLUGIN_ERROR, message, exception);
-		logError(status);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * @see #getUniqueIdentifierFromString(String)
-	 * @see #getVersionIdentifierFromString(String)
-	 */
-	public String toString() {
-		return getUniqueIdentifier() + VERSION_SEPARATOR + getVersionIdentifier().toString();
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public final URL find(IPath path) {
-		URL result = FindSupport.find(bundleOsgi, path);
-		if (result != null)
-			try {
-				result = Platform.resolve(result);
-			} catch (IOException e) {
-				// if the URL cannot be resolved for some reason, return the original result.
-			}
-		return result;
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public final URL find(IPath path, Map override) {
-		URL result = FindSupport.find(bundleOsgi, path, override);
-		if (result != null)
-			try {
-				result = Platform.resolve(result);
-			} catch (IOException e) {
-				// if the URL cannot be resolved for some reason, return the original result.
-			}
-		return result;
-	}
-
-	/**
-	 * @see IPluginDescriptor
-	 */
-	public Plugin getPlugin() throws CoreException {
-		if (pluginObject == null)
-			doPluginActivation();
-		return pluginObject;
-	}
-
-	synchronized void doPluginActivation() throws CoreException {
-		//This class is only called when getPlugin() is invoked.
-		// It needs to handle the case where it is called multiple times during the activation
-		// processing itself (as a result of other classes from this
-		// plugin being directly referenced by the plugin class)
-
-		// NOTE: there is a remote scenario where the plugin class can
-		// deadlock, if it starts separate thread(s) within its
-		// constructor or startup() method, and waits on those
-		// threads before returning (ie. calls join()).
-
-		// sanity checking
-		if ((bundleOsgi.getState() & (Bundle.RESOLVED | Bundle.STARTING | Bundle.ACTIVE)) == 0)
-			throw new IllegalArgumentException();
-		// plug-in hasn't been activated yet - start bundle
-		if (bundleOsgi.getState() == Bundle.RESOLVED)
-			try {
-				bundleOsgi.start();
-			} catch (BundleException e) {
-				throwException(NLS.bind(Messages.plugin_startupProblems, e), e);
-			}
-		if (pluginObject != null)
-			return;
-		boolean errorExit = true;
-		//	check if already activated or pending		
-		if (pluginActivationEnter()) {
-			try {
-				internalDoPluginActivation();
-				errorExit = false;
-			} finally {
-				pluginActivationExit(errorExit);
-			}
-		} else {
-			//Create a fake plugin object for all new bundles that do not use the Plugin class in their activator hierarchy
-			if (active && pluginObject == null) {
-				active = false;
-				pluginObject = new DefaultPlugin(this);
-				active = true;
-			}
-		}
-
-	}
-
-	private String getPluginClass() {
-		return (String) bundleOsgi.getHeaders("").get(PLUGIN_CLASS); //$NON-NLS-1$
-	}
-
-	private String getId() {
-		return bundleOsgi.getSymbolicName();
-	}
-
-	private void internalDoPluginActivation() throws CoreException {
-		String errorMsg;
-		// load the runtime class 
-		String pluginClassName = getPluginClass();
-		Class runtimeClass = null;
-		try {
-			if (pluginClassName == null || pluginClassName.equals("")) {//$NON-NLS-1$
-				runtimeClass = DefaultPlugin.class;
-				pluginClassName = DefaultPlugin.class.getName();
-			}
-			else
-				runtimeClass = bundleOsgi.loadClass(pluginClassName);
-		} catch (ClassNotFoundException e) {
-			errorMsg = NLS.bind(Messages.plugin_loadClassError, getId(), pluginClassName);
-			throwException(errorMsg, e);
-		}
-
-		// find the correct constructor
-		Constructor construct = null;
-		try {
-			construct = runtimeClass.getConstructor(new Class[] {IPluginDescriptor.class});
-		} catch (NoSuchMethodException eNoConstructor) {
-			errorMsg = NLS.bind(Messages.plugin_instantiateClassError, getId(), pluginClassName);
-			throwException(errorMsg, eNoConstructor);
-		}
-
-		// create a new instance
-		try {
-			pluginObject = (Plugin) construct.newInstance(new Object[] {this});
-		} catch (ClassCastException e) {
-			errorMsg = NLS.bind(Messages.plugin_notPluginClass, pluginClassName);
-			throwException(errorMsg, e);
-		} catch (Exception e) {
-			errorMsg = NLS.bind(Messages.plugin_instantiateClassError, getId(), pluginClassName);
-			throwException(errorMsg, e);
-		}
-	}
-
-	public PluginDescriptor(org.osgi.framework.Bundle b) {
-		bundleOsgi = b;
-		if ((b.getState() & Bundle.ACTIVE) != 0)
-			active = true;
-	}
-
-	public Bundle getBundle() {
-		return bundleOsgi;
-	}
-
-	public void setPlugin(Plugin object) {
-		pluginObject = object;
-	}
-
-	public synchronized void setActive() {
-		this.active = true;
-	}
-	
-	public boolean hasPluginObject() {
-		return pluginObject!=null;
-	}
-
-	public void markAsDeactivated() {
-		deactivated = true;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginPrerequisite.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginPrerequisite.java
deleted file mode 100644
index 3008d8d..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginPrerequisite.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.plugins;
-
-import org.eclipse.core.runtime.IPluginPrerequisite;
-import org.eclipse.core.runtime.PluginVersionIdentifier;
-import org.eclipse.osgi.service.resolver.BundleSpecification;
-import org.eclipse.osgi.service.resolver.VersionRange;
-import org.osgi.framework.Version;
-
-
-/**
- * @deprecated Marking as deprecated to remove the warnings
- */
-public class PluginPrerequisite implements IPluginPrerequisite {
-	private static final Version maxVersion = new Version(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
-	private BundleSpecification prereq = null;
-
-	public PluginPrerequisite(BundleSpecification b) {
-		prereq = b;
-	}
-
-	public PluginVersionIdentifier getResolvedVersionIdentifier() {
-		Version actualVersion = prereq.getSupplier().getVersion();
-		if (actualVersion == null)
-			return null;
-		return new PluginVersionIdentifier(actualVersion.toString());
-	}
-
-	public String getUniqueIdentifier() {
-		return prereq.getName();
-	}
-
-	public PluginVersionIdentifier getVersionIdentifier() {
-		Version specifiedVersion = prereq.getVersionRange() == null ? null : prereq.getVersionRange().getMinimum();
-		if (specifiedVersion == null)
-			return null;
-		return new PluginVersionIdentifier(specifiedVersion.toString());
-	}
-
-	public boolean isExported() {
-		return prereq.isExported();
-	}
-
-	public boolean isMatchedAsGreaterOrEqual() {
-		return isMatchedAsGreaterOrEqual(prereq.getVersionRange());
-	}
-
-	public boolean isMatchedAsCompatible() {
-		return isMatchedAsCompatible(prereq.getVersionRange());
-	}
-
-	public boolean isMatchedAsEquivalent() {
-		return isMatchedAsEquivalent(prereq.getVersionRange());
-	}
-
-	public boolean isMatchedAsPerfect() {
-		return isMatchedAsPerfect(prereq.getVersionRange());
-	}
-
-	public boolean isMatchedAsExact() {
-		return isMatchedAsEquivalent();
-	}
-
-	public boolean isOptional() {
-		return prereq.isOptional();
-	}
-
-	private static boolean isMatchedAsGreaterOrEqual(VersionRange versionRange) {
-		if (versionRange == null || versionRange.getMinimum() == null)
-			return false;
-		Version maximum = versionRange.getMaximum();
-		if (maximum == null || maximum.compareTo(maxVersion) >= 0)
-			return true;
-		return false;
-	}
-
-	private static boolean isMatchedAsPerfect(VersionRange versionRange) {
-		if (versionRange == null || versionRange.getMinimum() == null)
-			return false;
-		Version minimum = versionRange.getMinimum();
-		Version maximum = versionRange.getMaximum() == null ? maxVersion : versionRange.getMaximum();
-		if (minimum.equals(maximum))
-			return true;
-		return false;
-	}
-
-	private static boolean isMatchedAsEquivalent(VersionRange versionRange) {
-		if (versionRange == null || versionRange.getMinimum() == null)
-			return false;
-		Version minimum = versionRange.getMinimum();
-		Version maximum = versionRange.getMaximum() == null ? maxVersion : versionRange.getMaximum();
-		if (!versionRange.getIncludeMinimum() || versionRange.getIncludeMaximum())
-			return false;
-		else if (minimum.getMajor() == maximum.getMajor() - 1)
-			return false;
-		else if (minimum.getMajor() != maximum.getMajor())
-			return false;
-		else if (minimum.getMinor() == maximum.getMinor() - 1)
-			return true;
-		return false;
-	}
-
-	private static boolean isMatchedAsCompatible(VersionRange versionRange) {
-		if (versionRange == null || versionRange.getMinimum() == null)
-			return false;
-		Version minimum = versionRange.getMinimum();
-		Version maximum = versionRange.getMaximum() == null ? maxVersion : versionRange.getMaximum();
-		if (!versionRange.getIncludeMinimum() || versionRange.getIncludeMaximum())
-			return false;
-		else if (minimum.getMajor() == maximum.getMajor() - 1)
-			return true;
-		return false;	
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginRegistry.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginRegistry.java
deleted file mode 100644
index 1c47001..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/PluginRegistry.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.plugins;
-
-import java.util.*;
-import java.util.ArrayList;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.*;
-import org.osgi.framework.*;
-
-/**
- * @deprecated Marking as deprecated to remove the warnings
- */
-public class PluginRegistry implements IPluginRegistry {
-	private IExtensionRegistry extRegistry;
-	private RegistryListener listener;
-	
-	protected WeakHashMap descriptors = new WeakHashMap();	//key is a bundle object, value is a pluginDescriptor. The synchornization is required
-
-	public PluginRegistry() {
-		extRegistry = InternalPlatform.getDefault().getRegistry();
-		listener = new RegistryListener();
-		InternalPlatform.getDefault().getBundleContext().addBundleListener(listener);
-	}
-
-	public void close() {
-		InternalPlatform.getDefault().getBundleContext().removeBundleListener(listener);
-		listener = null; 
-		descriptors = null;
-	}
-	
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IConfigurationElement[] getConfigurationElementsFor(String uniqueId) {
-		return extRegistry.getConfigurationElementsFor(uniqueId);
-	}
-
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IConfigurationElement[] getConfigurationElementsFor(String pluginId, String pointId) {
-		return extRegistry.getConfigurationElementsFor(pluginId, pointId);
-	}
-
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IConfigurationElement[] getConfigurationElementsFor(String pluginId, String pointId, String extensionId) {
-		return extRegistry.getConfigurationElementsFor(pluginId, pointId, extensionId);
-	}
-
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IExtension getExtension(String xptUniqueId, String extUniqueId) {
-		return extRegistry.getExtension(xptUniqueId, extUniqueId);
-	}
-
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IExtension getExtension(String pluginId, String xptSimpleId, String extId) {
-		return extRegistry.getExtension(pluginId, xptSimpleId, extId);
-	}
-
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IExtensionPoint getExtensionPoint(String xptUniqueId) {
-		return extRegistry.getExtensionPoint(xptUniqueId);
-	}
-
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IExtensionPoint getExtensionPoint(String plugin, String xpt) {
-		return extRegistry.getExtensionPoint(plugin, xpt);
-	}
-
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IExtensionPoint[] getExtensionPoints() {
-		return extRegistry.getExtensionPoints();
-	}
-	
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IPluginDescriptor getPluginDescriptor(String plugin) {
-		Bundle correspondingBundle = InternalPlatform.getDefault().getBundle(plugin);
-		if (correspondingBundle == null)
-			return null;
-		return getPluginDescriptor(correspondingBundle);
-	}
-
-	private PluginDescriptor getPluginDescriptor(Bundle bundle) {
-		if (InternalPlatform.getDefault().isFragment(bundle) || descriptors == null) {
-			return null;
-		}
-		synchronized(descriptors) {
-			PluginDescriptor correspondingDescriptor = (PluginDescriptor) descriptors.get(bundle);
-			if (bundle != null) {
-				// we haven't created a plugin descriptor yet or it was for a different bundle
-				if (correspondingDescriptor == null || correspondingDescriptor.getBundle() != bundle) {
-					// create a new plugin descriptor and save it for the next time
-					correspondingDescriptor = new PluginDescriptor(bundle);
-					descriptors.put(bundle, correspondingDescriptor);
-				}
-				return correspondingDescriptor;
-			}
-			// if a bundle does not exist, ensure we don't keep a plugin descriptor for it
-			if (correspondingDescriptor != null)
-				descriptors.remove(bundle);
-		}
-		return null;
-	}
-	
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IPluginDescriptor[] getPluginDescriptors(String plugin) {
-		Bundle[] bundles = InternalPlatform.getDefault().getBundles(plugin, null);
-		if (bundles == null)
-			return new IPluginDescriptor[0];
-		IPluginDescriptor[] results = new IPluginDescriptor[bundles.length];
-		int added = 0;
-		for (int i = 0; i < bundles.length; i++) {
-			PluginDescriptor desc = getPluginDescriptor(bundles[i]);
-			if (desc != null)
-				results[added++] = desc;
-		}
-		if (added == bundles.length)
-			return results;
-		
-		if (added == 0)
-			return new IPluginDescriptor[0];
-		
-		IPluginDescriptor[] toReturn = new IPluginDescriptor[added];
-		System.arraycopy(results, 0, toReturn, 0, added);
-		return toReturn;
-	}
-
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IPluginDescriptor getPluginDescriptor(String pluginId, PluginVersionIdentifier version) {
-		Bundle[] bundles = InternalPlatform.getDefault().getBundles(pluginId, version.toString());
-		if (bundles == null)
-			return null;
-		
-		return getPluginDescriptor(bundles[0]);
-	}
-
-	/**
-	 * @deprecated Marking as deprecated to remove the warnings
-	 */
-	public IPluginDescriptor[] getPluginDescriptors() {
-		Bundle[] bundles = InternalPlatform.getDefault().getBundleContext().getBundles();
-		ArrayList pds = new ArrayList(bundles.length);
-		for (int i = 0; i < bundles.length; i++) {
-			boolean isFragment = InternalPlatform.getDefault().isFragment(bundles[i]);
-			if (!isFragment && bundles[i].getSymbolicName() != null && (bundles[i].getState() == Bundle.RESOLVED || bundles[i].getState() == Bundle.STARTING || bundles[i].getState() == Bundle.ACTIVE))
-				pds.add(getPluginDescriptor(bundles[i]));
-		}
-		IPluginDescriptor[] result = new IPluginDescriptor[pds.size()];
-		return (IPluginDescriptor[]) pds.toArray(result);
-	}
-
-	void logError(IStatus status) {
-		InternalPlatform.getDefault().log(status);
-		if (InternalPlatform.DEBUG)
-			System.out.println(status.getMessage());
-	}
-
-	public class RegistryListener implements BundleListener {
-		public void bundleChanged(BundleEvent event) {
-			if (descriptors == null)
-				return;
-			
-			synchronized(descriptors) {
-				if (event.getType() == BundleEvent.UNINSTALLED || event.getType() == BundleEvent.UNRESOLVED) {
-					descriptors.remove(event.getBundle());
-				}
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/Policy.java b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/Policy.java
deleted file mode 100644
index 74ec166..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/Policy.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.plugins;
-
-import java.text.MessageFormat;
-import java.util.*;
-import org.eclipse.core.runtime.*;
-
-public class Policy {
-	private static String bundleName = "org.eclipse.core.internal.plugins.messages"; //$NON-NLS-1$
-	private static ResourceBundle bundle;
-
-	/*
-	 * Returns a resource bundle, creating one if it none is available. 
-	 */
-	private static ResourceBundle getResourceBundle() {
-		// thread safety
-		ResourceBundle tmpBundle = bundle;
-		if (tmpBundle != null)
-			return tmpBundle;
-		// always create a new classloader to be passed in 
-		// in order to prevent ResourceBundle caching
-		return bundle = ResourceBundle.getBundle(bundleName, Locale.getDefault());
-	}
-
-	/**
-	 * Lookup the message with the given ID in this catalog 
-	 */
-	public static String bind(String id) {
-		return bind(id, (String[]) null);
-	}
-
-	/**
-	 * Lookup the message with the given ID in this catalog and bind its
-	 * substitution locations with the given string.
-	 */
-	public static String bind(String id, String binding) {
-		return bind(id, new String[] {binding});
-	}
-
-	/**
-	 * Lookup the message with the given ID in this catalog and bind its
-	 * substitution locations with the given strings.
-	 */
-	public static String bind(String id, String binding1, String binding2) {
-		return bind(id, new String[] {binding1, binding2});
-	}
-
-	/**
-	 * Lookup the message with the given ID in this catalog and bind its
-	 * substitution locations with the given string values.
-	 */
-	public static String bind(String id, String[] bindings) {
-		if (id == null)
-			return "No message available"; //$NON-NLS-1$
-		String message = null;
-		try {
-			message = getResourceBundle().getString(id);
-		} catch (MissingResourceException e) {
-			// If we got an exception looking for the message, fail gracefully by just returning
-			// the id we were looking for.  In most cases this is semi-informative so is not too bad.
-			return "Missing message: " + id + " in: " + bundleName; //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		if (bindings == null)
-			return message;
-		return MessageFormat.format(message, bindings);
-	}
-
-	public static IProgressMonitor monitorFor(IProgressMonitor monitor) {
-		if (monitor == null)
-			return new NullProgressMonitor();
-		return monitor;
-	}
-
-	public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks) {
-		if (monitor == null)
-			return new NullProgressMonitor();
-		if (monitor instanceof NullProgressMonitor)
-			return monitor;
-		return new SubProgressMonitor(monitor, ticks);
-	}
-
-	public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks, int style) {
-		if (monitor == null)
-			return new NullProgressMonitor();
-		if (monitor instanceof NullProgressMonitor)
-			return monitor;
-		return new SubProgressMonitor(monitor, ticks, style);
-	}
-
-	/**
-	 * Print a debug message to the console. If the given boolean is <code>true</code> then
-	 * pre-pend the message with the current date.
-	 */
-	public static void debug(boolean includeDate, String message) {
-		if (includeDate)
-			message = new Date(System.currentTimeMillis()) + " - " + message; //$NON-NLS-1$
-		System.out.println(message);
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/messages.properties b/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/messages.properties
deleted file mode 100644
index 9a50fc6..0000000
--- a/bundles/org.eclipse.core.runtime.compatibility/src-runtime/org/eclipse/core/internal/plugins/messages.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-### Runtime backward compatibility message catalog
-
-
-# Plugin activation/deactivation messages
-activator.applicationNotStarted=Legacy plug-in \"{0}\" must not be automatically activated on startup. This is probably caused by a previous crash in Eclipse.
-
-#Platform messages
-platform.errorInstalling=Error installing plug-in(s).
-platform.cannotInstallPlugin=Could not install plugin from \"{0}\".
diff --git a/bundles/org.eclipse.core.runtime/.classpath b/bundles/org.eclipse.core.runtime/.classpath
deleted file mode 100644
index 9681d7c..0000000
--- a/bundles/org.eclipse.core.runtime/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<accessrules>
-			<accessrule kind="discouraged" pattern="**/internal"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.runtime/.cvsignore b/bundles/org.eclipse.core.runtime/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/bundles/org.eclipse.core.runtime/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.runtime/.options b/bundles/org.eclipse.core.runtime/.options
deleted file mode 100644
index 57f99a0..0000000
--- a/bundles/org.eclipse.core.runtime/.options
+++ /dev/null
@@ -1,26 +0,0 @@
-# Debugging options for the org.eclipse.core.runtime plugin
-
-# Turn on general debugging for the org.eclipse.core.runtime plugin.
-# Also displays overall startup time.
-org.eclipse.core.runtime/debug=false
-
-# Prints out values of OS, WS, NL, and ARCH
-org.eclipse.core.runtime/debug/context=false
-
-# Captures performance event information (See org.eclipse.core.runtime.PerformanceStats)
-org.eclipse.core.runtime/perf=false
-
-# Tracks performance events that run within an acceptable duration
-org.eclipse.core.runtime/perf/success=false
-
-# Turn on debugging for the compatibility layer
-org.eclipse.core.runtime/compatibility/debug=false
-
-# Turn on debugging for plugin preferences
-org.eclipse.core.runtime/preferences/plugin=false
-
-# Turn on debugging in the support for non-local plugins.
-org.eclipse.core.runtime/url/debug=false
-org.eclipse.core.runtime/url/debug/connect=false
-org.eclipse.core.runtime/url/debug/cachelookup=false
-org.eclipse.core.runtime/url/debug/cachecopy=false
diff --git a/bundles/org.eclipse.core.runtime/.project b/bundles/org.eclipse.core.runtime/.project
deleted file mode 100644
index 3643f04..0000000
--- a/bundles/org.eclipse.core.runtime/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.runtime</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 1993c40..0000000
--- a/bundles/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue May 25 14:58:43 EDT 2004
-encoding/<project>=ISO-8859-1
-eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8807128..0000000
--- a/bundles/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Fri May 20 10:26:53 EDT 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=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=1000
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-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=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=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=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=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.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 2cc1fe3..0000000
--- a/bundles/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri Jan 06 16:48:11 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=;
-org.eclipse.jdt.ui.ondemandthreshold=3
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="New classes and interfaces" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2006 IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n *******************************************************************************/\r\n${package_declaration}\r\n\r\n/**\r\n * \r\n */\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block&\#13;\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.core.runtime/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.runtime/META-INF/MANIFEST.MF
deleted file mode 100644
index dae4e24..0000000
--- a/bundles/org.eclipse.core.runtime/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-Version: 3.2.0.qualifier
-Bundle-SymbolicName: org.eclipse.core.runtime; singleton:=true
-Bundle-Vendor: %providerName
-Bundle-Activator: org.eclipse.core.internal.runtime.PlatformActivator
-Bundle-Localization: plugin
-Export-Package: org.eclipse.core.internal.boot;x-friends:="org.eclipse.core.resources,org.eclipse.core.runtime.compatibility,org.eclipse.pde.build",
- org.eclipse.core.internal.preferences;x-internal:=true,
- org.eclipse.core.internal.runtime;x-friends:="org.eclipse.core.runtime.compatibility",
- org.eclipse.core.runtime
-Require-Bundle: org.eclipse.equinox.registry;visibility:=reexport,
- org.eclipse.core.jobs;visibility:=reexport,
- org.eclipse.equinox.preferences;visibility:=reexport,
- org.eclipse.core.contenttype;visibility:=reexport,
- org.eclipse.equinox.common;visibility:=reexport,
- org.eclipse.osgi;bundle-version="[3.1.0,4.0.0)";visibility:=reexport
diff --git a/bundles/org.eclipse.core.runtime/about.html b/bundles/org.eclipse.core.runtime/about.html
deleted file mode 100644
index bc8b12b..0000000
--- a/bundles/org.eclipse.core.runtime/about.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<p>September 26, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html" target="_blank">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Cryptography</h3>
-
-<p><b>Export Control</b></p>
-<p>The plug-in contains encryption software.  The country in which you are currently may have restrictions on the import, possession,
-and use, and/or re-export to another country, of encryption software.  BEFORE using any encryption software, please check the country's
-laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this
-is permitted.</p>
-
-<p><b>Encryption Items</b></p>
-
-<p>Details of the encryption software in this plug-in are provided to assist in obtaining relevant export control classification and approval.
-Cryptography in this plug-in has been classified as Export Commodity Control Number (ECCN) 5D002.c.1 by the U.S. Government Department of Commerce,
-Bureau of Export Administration and deemed eligible for export under License Exception Technology Software Unrestricted (TSU) for both object code
-and source code.</p>
-
-<p>The plug-in contains a proprietary routine that encrypts and decrypts information used to login to Version Control Management (VCM) repositories.
-This routine uses the SHA-1 message digest algorithm implemented in a Java (TM) Runtime Environment (JRE), to generate a cryptographically secure sequence of bytes based on a
-user-supplied password combined with bytes supplied by a random number generator.  The secure random numbers generated by this sequence are then added to each byte in the data
-to be encrypted. When the data is to be decrypted, the same password will generate the same sequence of random numbers, which is then subtracted from each byte in the encrypted data.
-Note that a JRE and therefore the aforementioned SHA-1 message digest code is not included with the plug-in.</p>
-
-<p>The following Java classes contain encryption items (the plug-in may contain both binary and source code):</p>
-
-<ul>
-	<li>org.eclipse.core.internal.runtime.Cipher</li>
-</ul>
-
-<small>Java and all Java-based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries.</small>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.runtime/build.properties b/bundles/org.eclipse.core.runtime/build.properties
deleted file mode 100644
index 8521e17..0000000
--- a/bundles/org.eclipse.core.runtime/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .options,\
-               about.html,\
-               plugin.properties,\
-               plugin.xml,\
-               .,\
-               META-INF/
-source.. = src/
-src.includes = about.html,\
-               schema/
-
diff --git a/bundles/org.eclipse.core.runtime/component.xml b/bundles/org.eclipse.core.runtime/component.xml
deleted file mode 100644
index 130dd16..0000000
--- a/bundles/org.eclipse.core.runtime/component.xml
+++ /dev/null
@@ -1,62 +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 Runtime">
-   <component-depends unrestricted="true"/>
-
- <plugin id="org.eclipse.core.runtime" />
- <plugin id="org.eclipse.core.runtime.compatibility" />
-
- <package name="org.eclipse.core.boot"/>
- 
- <package name="org.eclipse.core.runtime">
-   <type name="EventStats" instantiate="false" subclass="false" />
-   <type name="IAdapterManager" implement="false" />
-   <type name="IConfigurationElement" implement="false" />
-   <type name="IExtension" implement="false" />
-   <type name="IExtensionDelta" implement="false" />
-   <type name="IExtensionPoint" implement="false" />
-   <type name="IExtensionRegistry" implement="false" />
-   <type name="ILibrary" implement="false" />
-   <type name="ILog" implement="false" />
-   <type name="InvalidRegistryObjectException" subclass="false" instantiate="false"/>
-   <type name="IPath" implement="false" />
-   <type name="IPluginDescriptor" implement="false" />
-   <type name="IPluginPrerequisite" implement="false" />
-   <type name="IPluginRegistry" implement="false" />
-   <type name="IRegistryChangeEvent" implement="false" />
-   <type name="Path" subclass="false" />
-   <type name="PluginVersionIdentifier" subclass="false" />
-   <type name="Preferences" subclass="false" />
-   <type name="QualifiedName" subclass="false" />
- </package>
- 
- <package name="org.eclipse.core.runtime.content">
-	<type name="BinarySignatureDescriber" instantiate="false" />
-	<type name="IContentDescription" implement="false" />
-	<type name="IContentType" implement="false" />
-	<type name="IContentTypeManager" implement="false" />
-	<type name="XMLRootElementContentDescriber" instantiate="false" />
- </package>
- 
- <package name="org.eclipse.core.runtime.dynamicHelpers"/>
- 
- <package name="org.eclipse.core.runtime.jobs">
-	<type name="IJobChangeEvent" implement="false" />
-	<type name="IJobManager" implement="false" />
-	<type name="IJobStatus" implement="false" />
-	<type name="ILock" implement="false" />
-	<type name="MultiRule" subclass="false" />
- </package>
- 
- <package name="org.eclipse.core.runtime.preferences">
-	<type name="IExportedPreferences" implement="false" />
-	<type name="IPreferencesService" implement="false" />
- </package>
- 
- <package name="org.osgi.service.prefs"/>
- 
- <package name="org.eclipse.core.runtime.model"/>
-
-</component>
diff --git a/bundles/org.eclipse.core.runtime/plugin.properties b/bundles/org.eclipse.core.runtime/plugin.properties
deleted file mode 100644
index 3aad9c4..0000000
--- a/bundles/org.eclipse.core.runtime/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = Core Runtime
-providerName = Eclipse.org
-applicationsName = Applications
-shutdownHook = Shutdown Hook
-adaptersName = Adapter factories
-productsName = Products
-contentTypesName = Content Types
-preferencesName=Preferences
diff --git a/bundles/org.eclipse.core.runtime/plugin.xml b/bundles/org.eclipse.core.runtime/plugin.xml
deleted file mode 100644
index f9972bb..0000000
--- a/bundles/org.eclipse.core.runtime/plugin.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="applications" name="%applicationsName" schema="schema/applications.exsd"/>
-   <extension-point id="products" name="%productsName" schema="schema/products.exsd"/>
-   <extension-point id="adapters" name="%adaptersName" schema="schema/adapters.exsd"/>
-   <extension-point id="preferences" name="%preferencesName" schema="schema/preferences.exsd"/>
-   <extension-point id="contentTypes" name="%contentTypesName" schema="schema/contentTypes.exsd"/>
-</plugin>
diff --git a/bundles/org.eclipse.core.runtime/schema/adapters.exsd b/bundles/org.eclipse.core.runtime/schema/adapters.exsd
deleted file mode 100644
index c759c77..0000000
--- a/bundles/org.eclipse.core.runtime/schema/adapters.exsd
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.runtime">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.runtime" id="adapters" name="Adapters"/>
-      </appInfo>
-      <documentation>
-         The adapters extension point allows plug-ins to declaratively register adapter factories.  This information is used to by the 
-         runtime XML expression language to determine existence of adapters without causing plug-ins to be loaded.
-         Registration of adapter factories via extension point eliminates the need to manually register adapter factories when a plug-in starts up.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="factory" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="factory">
-      <complexType>
-         <sequence>
-            <element ref="adapter" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="adaptableType" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The fully qualified name of a class (typically implementing IAdaptable) that this factory provides adapters for.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The fully qualified name of the adapter factory class.  Must implement &lt;tt&gt;org.eclipse.core.runtime.IAdapterFactory&lt;/tt&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.runtime.IAdapterFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="adapter">
-      <complexType>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The fully qualified name of a Java class or interface that this factory can adapt to.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of an adapter declaration.  This example declares that this plug-in will provide an adapter factory that will adapt objects of type IFile to objects of type MyFile.
-&lt;p&gt;
-   &lt;pre&gt;
-      &lt;extension point=&quot;org.eclipse.core.runtime.adapters&quot;&gt;
-         &lt;factory 
-            class=&quot;com.xyz.MyFileAdapterFactory&quot; 
-            adaptableType=&quot;org.eclipse.core.resources.IFile&quot;&gt;
-            &lt;adapter type=&quot;com.xyz.MyFile&quot;/&gt;
-         &lt;/factory&gt;
-      &lt;/extension&gt;
-   &lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Adapter factories registered using this extension point can be queried using the method 
-&lt;code&gt;IAdapterManager.hasAdapter&lt;/code&gt;, or retrieved using one of the &lt;tt&gt;getAdapter&lt;/tt&gt; methods on &lt;tt&gt;IAdapterFactory&lt;/tt&gt;.
-An adapter factory registered with this extension point does not need to be registered at runtime using &lt;tt&gt;IAdapterFactory.registerAdapters&lt;/tt&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         Several plug-ins in the platform provide adapters for a number of different IAdaptable objects.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which 
-accompanies 
-this distribution, and is available at 
-&lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.core.runtime/schema/applications.exsd b/bundles/org.eclipse.core.runtime/schema/applications.exsd
deleted file mode 100644
index a3c2b16..0000000
--- a/bundles/org.eclipse.core.runtime/schema/applications.exsd
+++ /dev/null
@@ -1,162 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.runtime">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.runtime" id="applications" name="Applications"/>
-      </appInfo>
-      <documentation>
-         Platform runtime supports plug-ins which would like to 
-declare main entry points.  That is, programs which 
-would like to run using the platform runtime but yet 
-control all aspects of execution can declare themselves 
-as an application.  Declared applications can be run 
-directly from the main platform launcher by specifying 
-the &lt;i&gt;-application&lt;/i&gt; argument where the parameter 
-is the id of an extension supplied to the 
-applications extension point described here.  
-This application is instantiated and run by the platform.  
-Platform clients can also use the platform to lookup and 
-run multiple applications.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="application"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="application">
-      <complexType>
-         <sequence>
-            <element ref="run" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="run">
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the fully-qualified name of a class which implements 
-&lt;samp&gt;org.eclipse.core.runtime.IPlatformRunnable&lt;/samp&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.runtime.IPlatformRunnable"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of this parameter made available to instances of the specified application class
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the value of this parameter made available to instances of the specified application class
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of an application declaration: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension id=&quot;coolApplication&quot; point=&quot;org.eclipse.core.runtime.applications&quot;&gt; 
-      &lt;application&gt; 
-         &lt;run class=&quot;com.xyz.applications.Cool&quot;&gt; 
-            &lt;parameter name=&quot;optimize&quot; value=&quot;true&quot;/&gt; 
-         &lt;/run&gt; 
-      &lt;/application&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The value of the class attribute must represent an 
-implementor of 
-&lt;samp&gt;org.eclipse.core.runtime.IPlatformRunnable&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The platform supplies a number of applications including the platform workbench itself.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which 
-accompanies 
-this distribution, and is available at 
-&lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.core.runtime/schema/contentTypes.exsd b/bundles/org.eclipse.core.runtime/schema/contentTypes.exsd
deleted file mode 100644
index a5289ae..0000000
--- a/bundles/org.eclipse.core.runtime/schema/contentTypes.exsd
+++ /dev/null
@@ -1,360 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.runtime">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.runtime" id="contentTypes" name="Content Types"/>
-      </appInfo>
-      <documentation>
-         The content types extension point allows plug-ins to contribute to the platform content type catalog. There are two forms of contributions: &lt;cite&gt;content types&lt;/cite&gt; and &lt;cite&gt;file associations&lt;/cite&gt;.
-&lt;ul&gt;
-&lt;li&gt;
-a content type represents a file format and its naming conventions. Content types can be defined from scratch, or can inherit from existing ones, specializing them. Also, a content type can be made into an alias for another content type (see the &lt;code&gt;alias-for&lt;/code&gt; attribute). When this feature is used:
-  &lt;ul&gt;&lt;li&gt;if the target is absent, the alias content type is processed 
-  as a normal content type;&lt;/li&gt;
-  &lt;li&gt;if the target is present, all references to the alias type are automatically
-  transformed into references to the target type, and the alias type cannot be 
-  accessed nor is exposed through the API.&lt;/li&gt;&lt;/ul&gt;
-&lt;/li&gt;
-&lt;li&gt;
-a file association extends an existing content type by associating new file names and/or extensions to it&lt;/li&gt;
-&lt;/ul&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="content-type" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="file-association" 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="content-type">
-      <complexType>
-         <sequence>
-            <element ref="describer" minOccurs="0" maxOccurs="1"/>
-            <element ref="property" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the identifier for this content type (either a simple id unique for content types within the extension namespace, or a fully qualified id). The token cannot contain whitespace
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="base-type" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified identifier of this content type&apos;s base type. This content type will inherit its base type&apos;s file associations, content describer and default charset, unless they are redefined
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the human-readable name of this content type
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="file-extensions" type="string">
-            <annotation>
-               <documentation>
-                  a comma-separated list of file extensions to be associated with this content type
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="file-names" type="string">
-            <annotation>
-               <documentation>
-                  a comma-separated list of file names to be associated with this content type
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="priority" use="default" value="normal">
-            <annotation>
-               <documentation>
-                  the priority for this content type. Priorities are used to solve conflicts (when two content types are associated to the same file name/extension)
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="low">
-                  </enumeration>
-                  <enumeration value="normal">
-                  </enumeration>
-                  <enumeration value="high">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="default-charset" type="string">
-            <annotation>
-               <documentation>
-                  the default charset for this content type, or an empty string, if this content type should not have a default charset even if the parent has one. This is a convenience attribute, equivalent to specifying:
-&lt;pre&gt;
-  &lt;content-type&gt;
-    &lt;property name=&quot;org.eclipse.core.runtime.charset&quot; default=&quot;charset-name&quot;/&gt;
-  &lt;/content-type&gt;
-&lt;/pre&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="describer" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified name of a class that implements &lt;samp&gt;org.eclipse.core.runtime.content.IContentDescriber&lt;/samp&gt; or &lt;samp&gt;org.eclipse.core.runtime.content.ITextContentDescriber&lt;/samp&gt;, or an empty string, if this content type should not have a describer even if the parent has one
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="alias-for" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified identifier of the content type this content type is an alias for
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="describer">
-      <annotation>
-         <documentation>
-            If the describer attribute is used in the content-type element, this element is ignored.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the fully qualified name of a class that implements &lt;samp&gt;org.eclipse.core.runtime.content.IContentDescriber&lt;/samp&gt; or &lt;samp&gt;org.eclipse.core.runtime.content.ITextContentDescriber&lt;/samp&gt;, or an empty string, if this content type should not have a describer even if the parent has one
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.runtime.content.IContentDescriber"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="plugin" type="string">
-            <annotation>
-               <documentation>
-                  the id for the plug-in providing the describer class
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="file-association">
-      <complexType>
-         <attribute name="content-type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the fully qualified identifier for the content type this file association contributes to
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="file-names" type="string">
-            <annotation>
-               <documentation>
-                  a comma-separated list of file names to be associated with the target content type
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="file-extensions" type="string">
-            <annotation>
-               <documentation>
-                  a comma-separated list of file extensions to be associated with the target content type
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of this parameter made available to instances of the specified content describer class
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  an arbitrary value associated with the given name and made available to instances of the specified content describer class
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="property">
-      <annotation>
-         <documentation>
-            Declares a property related to this content type, optionally assigning a default value. See &lt;samp&gt;org.eclipse.core.runtime.content.IContentDescription&lt;/samp&gt; for more information on properties.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the property. If the property is being overriden and has been originally defined in a different namespace, a fully qualified property name must be used
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="default" type="string">
-            <annotation>
-               <documentation>
-                  the default value of the property, or an empty string, if this content type should not have a default value for this property even if a parent has one
-               </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>
-         Following is an example of a XML-based content type declaration using &lt;code&gt;org.eclipse.core.runtime.content.XMLRootElementContentDescriber&lt;/code&gt;, 
-a built-in describer: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.core.runtime.contentTypes&quot;&gt; 
-      &lt;content-type id=&quot;ABC&quot;
-       base-type=&quot;org.eclipse.core.runtime.xml&quot;      
-       file-extensions=&quot;a,b,c&quot;&gt;
-       &lt;describer class=&quot;org.eclipse.core.runtime.content.XMLRootElementContentDescriber&quot;&gt;
-        &lt;parameter name=&quot;element&quot; value=&quot;abc&quot;/&gt;
-       &lt;/describer&gt;
-      &lt;/content-type&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-Here is an example of a simple text-based content type that has a specific file extension:
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.core.runtime.contentTypes&quot;&gt; 
-      &lt;content-type id=&quot;MyText&quot;
-       base-type=&quot;org.eclipse.core.runtime.text&quot;
-       file-extensions=&quot;mytxt&quot;/&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-When there is need to associate new file names/extensions to an existing content type (as opposed to defining a new content type), a plug-in can contribute a file association as seen below. This has the effect of enhancing the definition of the text content type to include files with names following the &quot;*.mytxt&quot; pattern.
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.core.runtime.contentTypes&quot;&gt; 
-      &lt;file-association 
-       content-type=&quot;org.eclipse.core.runtime.text&quot;
-       file-extensions=&quot;mytxt&quot;/&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-Here is an example of a content type that defines properties:
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.core.runtime.contentTypes&quot;&gt; 
-      &lt;content-type id=&quot;MyContentType&quot;
-       file-extensions=&quot;dat&quot;&gt;
-         &lt;property name=&quot;file-format&quot; value=&quot;1&quot;/&gt;
-      &lt;/content-type&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The value of the class attribute in the describer element must represent an 
-implementor of 
-&lt;samp&gt;org.eclipse.core.runtime.content.IContentDescriber&lt;/samp&gt; or &lt;samp&gt;org.eclipse.core.runtime.content.ITextContentDescriber&lt;/samp&gt;.
-
-&lt;samp&gt;org.eclipse.core.runtime.content.IContentDescription&lt;/samp&gt; objects returned by the &lt;samp&gt;org.eclipse.core.runtime.content&lt;/samp&gt; API
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;The org.eclipse.core.runtime plug-in provides the following content types:&lt;ul&gt;
-&lt;li&gt;org.eclipse.core.runtime.text&lt;/li&gt;
-&lt;li&gt;org.eclipse.core.runtime.xml&lt;/li&gt;
-&lt;/ul&gt;
-Other plug-ins in the platform contribute other content types.
-&lt;/p&gt;
-&lt;p&gt;
-Also, the org.eclipse.core.runtime plug-in provides ready-to-use implementations of content describers:&lt;ul&gt;
-&lt;li&gt;org.eclipse.core.runtime.content.XMLRootElementContentDescriber&lt;/li&gt;
-&lt;li&gt;org.eclipse.core.runtime.content.BinarySignatureDescriber&lt;/li&gt;
-&lt;/ul&gt;
-&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/bundles/org.eclipse.core.runtime/schema/preferences.exsd b/bundles/org.eclipse.core.runtime/schema/preferences.exsd
deleted file mode 100644
index 4eee8ba..0000000
--- a/bundles/org.eclipse.core.runtime/schema/preferences.exsd
+++ /dev/null
@@ -1,174 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.runtime">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.runtime" id="preferences" name="Preferences"/>
-      </appInfo>
-      <documentation>
-         The preferences extension point allows plug-ins to add new preference scopes to the Eclipse preference mechanism as well as specify the class to run to initialize default preference values at runtime.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="scope" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="initializer" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="modifier" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="scope">
-      <annotation>
-         <documentation>
-            Element describing a client&apos;s definiton of a new preference scope.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the scope.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the class.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="IScope"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="initializer">
-      <annotation>
-         <documentation>
-            Element which defines the class to use for runtime preference initialization.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the class.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="modifier">
-      <annotation>
-         <documentation>
-            Element which defines the class to use for preference modification listening.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the class.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.runtime.preferences.PreferenceModifyListener"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of a preference scope declaration.  This example declares that this plug-in will provide a preference implementation for the scope &quot;foo&quot;. It also declares that when the default values are loaded for this plug-in, the class &quot;MyPreferenceInitializer&quot; contains code to be run to initialize preference default values at runtime.
-&lt;p&gt;
-   &lt;pre&gt;
-      &lt;extension point=&quot;org.eclipse.core.runtime.preferences&quot;&gt;
-         &lt;scope name=&quot;foo&quot; class=&quot;com.example.FooPrefs&quot;/&gt;
-         &lt;initializer class=&quot;com.example.MyPreferenceInitializer&quot;/&gt;
-         &lt;modifier class=&quot;com.example.MyModifyListener&quot;/&gt;
-      &lt;/extension&gt;
-   &lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The preference service (obtained by calling &lt;code&gt;org.eclipse.core.runtime.Platform.getPreferencesService()&lt;/code&gt;) is the hook into the Eclipse preference mechanism.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The org.eclipse.core.runtime plug-in provides preference implementations for the &quot;configuration&quot;, &quot;instance&quot;, and &quot;default&quot; scopes.  The org.eclipse.core.resources plug-in provides an implementation for &quot;project&quot; preferences.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which 
-accompanies 
-this distribution, and is available at 
-&lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.core.runtime/schema/products.exsd b/bundles/org.eclipse.core.runtime/schema/products.exsd
deleted file mode 100644
index b9b7ca0..0000000
--- a/bundles/org.eclipse.core.runtime/schema/products.exsd
+++ /dev/null
@@ -1,210 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.core.runtime">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.core.runtime" id="products" name="Products"/>
-      </appInfo>
-      <documentation>
-         Products are the Eclipse unit of branding.  Product extensions are supplied by plug-ins wishing to define one or more products.  There must be one product per extension as the extension id is used in processing and identifying the product.
-&lt;p&gt;
-There are two possible forms of product extension, static and dynamic.  Static product extensions directly contain all relevant information about the product.  Dynamic product extensions identify a class (an &lt;code&gt;IProductProvider&lt;/code&gt;) which is capable of defining one or more products when queried.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <choice>
-               <element ref="product"/>
-               <element ref="provider"/>
-            </choice>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="product">
-      <complexType>
-         <sequence>
-            <element ref="property" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="application" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the default application to run when running this product
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the human-readable name of this product
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  the human-readable description of this product
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="property">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the key under which this property is stored
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the value of this property
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="provider">
-      <annotation>
-         <documentation>
-            details of a product provider
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="run"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="run">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the fully-qualified name of a class which implements 
-&lt;samp&gt;org.eclipse.core.runtime.IProductProvider&lt;/samp&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.runtime.IProductProvider"/>
-               </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 static product declaration: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension id=&quot;coolProduct&quot; point=&quot;org.eclipse.core.runtime.products&quot;&gt; 
-      &lt;product name=&quot;%coolName&quot; application=&quot;coolApplication&quot; description=&quot;%coolDescription&quot;&gt; 
-          &lt;property name=&quot;windowImage&quot; value=&quot;window.gif&quot;/&gt; 
-          &lt;property name=&quot;aboutImage&quot; value=&quot;image.gif&quot;/&gt; 
-          &lt;property name=&quot;aboutText&quot; value=&quot;%aboutText&quot;/&gt; 
-          &lt;property name=&quot;appName&quot; value=&quot;CoolApp&quot;/&gt; 
-          &lt;property name=&quot;welcomePage&quot; value=&quot;$nl$/welcome.xml&quot;/&gt; 
-          &lt;property name=&quot;preferenceCustomization&quot; value=&quot;plugin_customization.ini&quot;/&gt; 
-      &lt;/product&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-
-The following is an example of a dynamic product (product provider) declaration:
-Following is an example of an application declaration: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension id=&quot;coolProvider&quot; point=&quot;org.eclipse.core.runtime.products&quot;&gt; 
-      &lt;provider&gt; 
-         &lt;run class=&quot;com.example.productProvider&quot;/&gt; 
-      &lt;/provider&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Static product extensions provided here are represented at runtime by instances of &lt;code&gt;IProduct&lt;/code&gt;.  Dynamic product extensions must identify an implementor of &lt;code&gt;IProductProvider&lt;/code&gt;.  See &lt;code&gt;org.eclipse.ui.branding.IProductConstants&lt;/code&gt; 
-for details of the branding related product properties defined by the Eclipse UI.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         No implementations of &lt;code&gt;IProductProvider&lt;/code&gt; are supplied.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which 
-accompanies 
-this distribution, and is available at 
-&lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.core.runtime/scripts/src-runtime.jardesc b/bundles/org.eclipse.core.runtime/scripts/src-runtime.jardesc
deleted file mode 100644
index 865c948..0000000
--- a/bundles/org.eclipse.core.runtime/scripts/src-runtime.jardesc
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<jardesc>
-	<jar path="C:/IBM/Equinox/workspaces/Equinox/org.eclipse.core.runtime/runtime.jar"/>
-	<options compress="true"
-		descriptionLocation="/org.eclipse.core.runtime/scripts/src-runtime.jardesc"
-		exportErrors="true" exportWarnings="true" logErrors="true"
-		logWarnings="true" overwrite="false" saveDescription="true" useSourceFolders="false"/>
-	<manifest generateManifest="false"
-		manifestLocation="/org.eclipse.core.runtime/src-runtime/META-INF/MANIFEST.MF"
-		manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="false">
-		<sealing sealJar="false"><packagesToSeal/><packagesToUnSeal/></sealing>
-	</manifest>
-	<selectedElements exportClassFiles="true" exportJavaFiles="false">
-		<javaElement handleIdentifier="=org.eclipse.core.runtime/src-runtime"/>
-	</selectedElements>
-</jardesc>
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/boot/PlatformURLBaseConnection.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/boot/PlatformURLBaseConnection.java
deleted file mode 100644
index 5289c07..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/boot/PlatformURLBaseConnection.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.core.internal.boot;
-
-import java.io.IOException;
-import java.net.URL;
-import org.eclipse.core.internal.runtime.Messages;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Platform URL support
- * platform:/base/	maps to platform installation location
- */
-public class PlatformURLBaseConnection extends PlatformURLConnection {
-
-	// platform/ protocol
-	public static final String PLATFORM = "base"; //$NON-NLS-1$
-	public static final String PLATFORM_URL_STRING = PlatformURLHandler.PROTOCOL + PlatformURLHandler.PROTOCOL_SEPARATOR + "/" + PLATFORM + "/"; //$NON-NLS-1$ //$NON-NLS-2$
-
-	private static URL installURL;
-
-	public PlatformURLBaseConnection(URL url) {
-		super(url);
-	}
-
-	protected boolean allowCaching() {
-		return true;
-	}
-
-	protected URL resolve() throws IOException {
-		String spec = url.getFile().trim();
-		if (spec.startsWith("/")) //$NON-NLS-1$
-			spec = spec.substring(1);
-		if (!spec.startsWith(PLATFORM + "/")) { //$NON-NLS-1$
-			String message = NLS.bind(Messages.url_badVariant, url);
-			throw new IOException(message);
-		}
-		return spec.length() == PLATFORM.length() + 1 ? installURL : new URL(installURL, spec.substring(PLATFORM.length() + 1));
-	}
-
-	public static void startup(URL url) {
-		// register connection type for platform:/base/ handling
-		if (installURL != null)
-			return;
-		installURL = url;
-		PlatformURLHandler.register(PLATFORM, PlatformURLBaseConnection.class);
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/boot/PlatformURLConnection.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/boot/PlatformURLConnection.java
deleted file mode 100644
index 8a11160..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/boot/PlatformURLConnection.java
+++ /dev/null
@@ -1,501 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.boot;
-
-import java.io.*;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Enumeration;
-import java.util.Properties;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.internal.runtime.Messages;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Platform URL support
- */
-public abstract class PlatformURLConnection extends URLConnection {
-
-	private static String os, ws, nl;
-
-	// URL access
-	private boolean isInCache = false;
-	private boolean isJar = false;
-
-	//	protected URL url;				// declared in super (platform: URL)
-	private URL resolvedURL = null; // resolved file URL (eg. http: URL)
-	private URL cachedURL = null; // file URL in cache (file: URL)
-
-	private URLConnection connection = null; // actual connection
-
-	// local cache
-	private static Properties cacheIndex = new Properties();
-	private static String cacheLocation;
-	private static String indexName;
-	private static String filePrefix;
-
-	// constants	
-	private static final int BUF_SIZE = 32768;
-	private static final Object NOT_FOUND = new Object(); // marker
-	private static final String CACHE_PROP = ".cache.properties"; //$NON-NLS-1$
-	private static final String CACHE_LOCATION_PROP = "location"; //$NON-NLS-1$
-	private static final String CACHE_INDEX_PROP = "index"; //$NON-NLS-1$
-	private static final String CACHE_PREFIX_PROP = "prefix"; //$NON-NLS-1$
-	private static final String CACHE_INDEX = ".index.properties"; //$NON-NLS-1$
-	private static final String CACHE_DIR = ".eclipse-" + PlatformURLHandler.PROTOCOL + File.separator; //$NON-NLS-1$
-
-	// debug tracing
-	private static final String OPTION_DEBUG = Platform.PI_RUNTIME + "/url/debug"; //$NON-NLS-1$;
-	private static final String OPTION_DEBUG_CONNECT = OPTION_DEBUG + "/connect"; //$NON-NLS-1$;
-	private static final String OPTION_DEBUG_CACHE_LOOKUP = OPTION_DEBUG + "/cachelookup"; //$NON-NLS-1$;
-	private static final String OPTION_DEBUG_CACHE_COPY = OPTION_DEBUG + "/cachecopy"; //$NON-NLS-1$;
-
-	public final static boolean DEBUG;
-	public final static boolean DEBUG_CONNECT;
-	public final static boolean DEBUG_CACHE_LOOKUP;
-	public final static boolean DEBUG_CACHE_COPY;
-
-	static {
-		if (InternalPlatform.DEBUG) {
-			DEBUG = InternalPlatform.getDefault().getBooleanOption(OPTION_DEBUG, false);
-			DEBUG_CONNECT = InternalPlatform.getDefault().getBooleanOption(OPTION_DEBUG_CONNECT, true);
-			DEBUG_CACHE_LOOKUP = InternalPlatform.getDefault().getBooleanOption(OPTION_DEBUG_CACHE_LOOKUP, true);
-			DEBUG_CACHE_COPY = InternalPlatform.getDefault().getBooleanOption(OPTION_DEBUG_CACHE_COPY, true);
-		} else
-			DEBUG = DEBUG_CONNECT = DEBUG_CACHE_LOOKUP = DEBUG_CACHE_COPY = false;
-	}
-
-	protected PlatformURLConnection(URL url) {
-		super(url);
-	}
-
-	protected boolean allowCaching() {
-		return false;
-	}
-
-	public void connect() throws IOException {
-		connect(false);
-	}
-
-	private synchronized void connect(boolean asLocal) throws IOException {
-		if (connected)
-			return;
-
-		if (shouldCache(asLocal)) {
-			try {
-				URL inCache = getURLInCache();
-				if (inCache != null)
-					connection = inCache.openConnection();
-			} catch (IOException e) {
-				// failed to cache ... will use resolved URL instead
-			}
-		}
-
-		// use resolved URL
-		if (connection == null)
-			connection = resolvedURL.openConnection();
-		connected = true;
-		if (DEBUG && DEBUG_CONNECT)
-			debug("Connected as " + connection.getURL()); //$NON-NLS-1$
-	}
-
-	//TODO consider refactoring this method... it is too long
-	//TODO avoid cryptic identifiers such as ix, tgt, tmp, srcis, tgtos...
-	private void copyToCache() throws IOException {
-
-		if (isInCache | cachedURL == null)
-			return;
-		String tmp;
-		int ix;
-
-		// cache entry key
-		String key;
-		if (isJar) {
-			tmp = url.getFile();
-			ix = tmp.lastIndexOf(PlatformURLHandler.JAR_SEPARATOR);
-			if (ix != -1)
-				tmp = tmp.substring(0, ix);
-			key = tmp;
-		} else
-			key = url.getFile();
-
-		// source url
-		URL src;
-		if (isJar) {
-			tmp = resolvedURL.getFile();
-			ix = tmp.lastIndexOf(PlatformURLHandler.JAR_SEPARATOR);
-			if (ix != -1)
-				tmp = tmp.substring(0, ix);
-			src = new URL(tmp);
-		} else
-			src = resolvedURL;
-		InputStream srcis = null;
-
-		// cache target
-		String tgt;
-		if (isJar) {
-			tmp = cachedURL.getFile();
-			ix = tmp.indexOf(PlatformURLHandler.PROTOCOL_SEPARATOR);
-			if (ix != -1)
-				tmp = tmp.substring(ix + 1);
-			ix = tmp.lastIndexOf(PlatformURLHandler.JAR_SEPARATOR);
-			if (ix != -1)
-				tmp = tmp.substring(0, ix);
-			tgt = tmp;
-		} else
-			tgt = cachedURL.getFile();
-		File tgtFile = null;
-		FileOutputStream tgtos = null;
-
-		boolean error = false;
-		long total = 0;
-
-		try {
-			if (DEBUG && DEBUG_CACHE_COPY) {
-				if (isJar)
-					debug("Caching jar as " + tgt); //$NON-NLS-1$
-				else
-					debug("Caching as " + tgt); //$NON-NLS-1$
-			}
-
-			srcis = src.openStream();
-			byte[] buf = new byte[BUF_SIZE];
-			int count = srcis.read(buf);
-
-			tgtFile = new File(tgt);
-			tgtos = new FileOutputStream(tgtFile);
-
-			while (count != -1) {
-				total += count;
-				tgtos.write(buf, 0, count);
-				count = srcis.read(buf);
-			}
-
-			srcis.close();
-			srcis = null;
-			tgtos.flush();
-			tgtos.getFD().sync();
-			tgtos.close();
-			tgtos = null;
-
-			// add cache entry
-			cacheIndex.put(key, tgt);
-			isInCache = true;
-		} catch (IOException e) {
-			error = true;
-			cacheIndex.put(key, NOT_FOUND);
-			// mark cache entry for this execution
-			if (DEBUG && DEBUG_CACHE_COPY)
-				debug("Failed to cache due to " + e); //$NON-NLS-1$
-			throw e;
-		} finally {
-			if (!error && DEBUG && DEBUG_CACHE_COPY)
-				debug(total + " bytes copied"); //$NON-NLS-1$
-			if (srcis != null)
-				srcis.close();
-			if (tgtos != null)
-				tgtos.close();
-		}
-	}
-
-	protected void debug(String s) {
-		System.out.println("URL " + getURL().toString() + "^" + Integer.toHexString(Thread.currentThread().hashCode()) + " " + s); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	private static void debugStartup(String s) {
-		System.out.println("URL " + s); //$NON-NLS-1$
-	}
-
-	public URL[] getAuxillaryURLs() throws IOException {
-		return null;
-	}
-
-	public synchronized InputStream getInputStream() throws IOException {
-		if (!connected)
-			connect();
-		return connection.getInputStream();
-	}
-
-	public URL getResolvedURL() {
-		return resolvedURL;
-	}
-
-	public URL getURLAsLocal() throws IOException {
-		connect(true); // connect and force caching if necessary
-		URL u = connection.getURL();
-		String up = u.getProtocol();
-		if (!up.equals(PlatformURLHandler.FILE) && !up.equals(PlatformURLHandler.JAR) && !up.startsWith(PlatformURLHandler.BUNDLE))
-			throw new IOException(NLS.bind(Messages.url_noaccess, up));
-		return u;
-	}
-
-	//TODO consider refactoring this method... it is too long
-	private URL getURLInCache() throws IOException {
-
-		if (!allowCaching())
-			return null; // target should not be cached
-
-		if (isInCache)
-			return cachedURL;
-
-		if (cacheLocation == null | cacheIndex == null)
-			return null; // not caching
-
-		// check if we are dealing with a .jar/ .zip
-		String file = ""; //$NON-NLS-1$
-		String jarEntry = null;
-		if (isJar) {
-			file = url.getFile();
-			int ix = file.lastIndexOf(PlatformURLHandler.JAR_SEPARATOR);
-			if (ix != -1) {
-				jarEntry = file.substring(ix + PlatformURLHandler.JAR_SEPARATOR.length());
-				file = file.substring(0, ix);
-			}
-		} else {
-			file = url.getFile();
-			jarEntry = null;
-		}
-
-		// check for cached entry
-		String tmp = (String) cacheIndex.get(file);
-
-		// check for "not found" marker
-		if (tmp != null && tmp == NOT_FOUND)
-			throw new IOException();
-
-		// validate cache entry
-		if (tmp != null && !(new File(tmp)).exists()) {
-			tmp = null;
-			cacheIndex.remove(url.getFile());
-		}
-
-		// found in cache
-		if (tmp != null) {
-			if (isJar) {
-				if (DEBUG && DEBUG_CACHE_LOOKUP)
-					debug("Jar located in cache as " + tmp); //$NON-NLS-1$
-				tmp = PlatformURLHandler.FILE + PlatformURLHandler.PROTOCOL_SEPARATOR + tmp + PlatformURLHandler.JAR_SEPARATOR + jarEntry;
-				cachedURL = new URL(PlatformURLHandler.JAR, null, -1, tmp);
-			} else {
-				if (DEBUG && DEBUG_CACHE_LOOKUP)
-					debug("Located in cache as " + tmp); //$NON-NLS-1$
-				cachedURL = new URL(PlatformURLHandler.FILE, null, -1, tmp);
-			}
-			isInCache = true;
-		} else {
-			// attemp to cache
-			int ix = file.lastIndexOf("/"); //$NON-NLS-1$
-			tmp = file.substring(ix + 1);
-			tmp = cacheLocation + filePrefix + Long.toString((new java.util.Date()).getTime()) + "_" + tmp; //$NON-NLS-1$
-			tmp = tmp.replace(File.separatorChar, '/');
-			if (isJar) {
-				tmp = PlatformURLHandler.FILE + PlatformURLHandler.PROTOCOL_SEPARATOR + tmp + PlatformURLHandler.JAR_SEPARATOR + jarEntry;
-				cachedURL = new URL(PlatformURLHandler.JAR, null, -1, tmp);
-			} else
-				cachedURL = new URL(PlatformURLHandler.FILE, null, -1, tmp);
-			copyToCache();
-		}
-
-		return cachedURL;
-	}
-
-	/*
-	 * to be implemented by subclass
-	 * @return URL resolved URL
-	 */
-	protected URL resolve() throws IOException {
-		// TODO throw UnsupportedOperationException instead - this is a bug in subclass, not an actual failure
-		throw new IOException();
-	}
-
-	protected String getId(String spec) {
-		int i = spec.lastIndexOf('_');
-		return i >= 0 ? spec.substring(0, i) : spec;
-	}
-
-	protected String getVersion(String spec) {
-		int i = spec.lastIndexOf('_');
-		return i >= 0 ? spec.substring(i + 1, spec.length()) : ""; //$NON-NLS-1$
-	}
-
-	void setResolvedURL(URL url) throws IOException {
-		if (url == null)
-			throw new IOException();
-		if (resolvedURL != null)
-			return;
-		int ix = url.getFile().lastIndexOf(PlatformURLHandler.JAR_SEPARATOR);
-		isJar = -1 != ix;
-		// Resolved URLs containing !/ separator are assumed to be jar URLs.
-		// If the resolved protocol is not jar, new jar URL is created.
-		if (isJar && !url.getProtocol().equals(PlatformURLHandler.JAR))
-			url = new URL(PlatformURLHandler.JAR, "", -1, url.toExternalForm()); //$NON-NLS-1$
-		resolvedURL = url;
-	}
-
-	private boolean shouldCache(boolean asLocal) {
-
-		// don't cache files that are known to be local
-		String rp = resolvedURL.getProtocol();
-		String rf = resolvedURL.getFile();
-		if (rp.equals(PlatformURLHandler.FILE))
-			return false;
-		if (rp.equals(PlatformURLHandler.JAR) && (rf.startsWith(PlatformURLHandler.FILE)))
-			return false;
-
-		// for other files force caching if local connection was requested
-		if (asLocal)
-			return true;
-
-		// for now cache all files
-		// XXX: add cache policy support
-		return true;
-	}
-
-	static void shutdown() {
-		if (indexName != null && cacheLocation != null) {
-			// weed out "not found" entries
-			Enumeration keys = cacheIndex.keys();
-			String key;
-			Object value;
-			while (keys.hasMoreElements()) {
-				key = (String) keys.nextElement();
-				value = cacheIndex.get(key);
-				if (value == NOT_FOUND)
-					cacheIndex.remove(key);
-			}
-			//if the cache index is empty we don't need to save it
-			if (cacheIndex.size() == 0)
-				return;
-			try {
-				// try to save cache index
-				FileOutputStream fos = null;
-				fos = new FileOutputStream(cacheLocation + indexName);
-				try {
-					cacheIndex.store(fos, null);
-					fos.flush();
-					fos.getFD().sync();
-				} finally {
-					fos.close();
-				}
-			} catch (IOException e) {
-				// failed to store cache index ... ignore
-			}
-		}
-	}
-
-	//TODO consider splitting this method into two or more steps - it is too long 
-	static void startup(String location, String os, String ws, String nl) {
-
-		PlatformURLConnection.os = os;
-		PlatformURLConnection.ws = ws;
-		PlatformURLConnection.nl = nl;
-
-		verifyLocation(location); // check for platform location, ignore errors
-		String cacheProps = location.trim();
-		if (!cacheProps.endsWith(File.separator))
-			cacheProps += File.separator;
-		cacheProps += CACHE_PROP;
-		File cachePropFile = new File(cacheProps);
-		Properties props = null;
-		FileInputStream fis;
-
-		if (cachePropFile.exists()) {
-			// load existing properties	
-			try {
-				props = new Properties();
-				fis = new FileInputStream(cachePropFile);
-				try {
-					props.load(fis);
-				} finally {
-					fis.close();
-				}
-			} catch (IOException e) {
-				props = null;
-			}
-		}
-
-		if (props == null) {
-			// first time up, or failed to load previous settings
-			props = new Properties();
-
-			String tmp = System.getProperty("user.home"); //$NON-NLS-1$
-			if (!tmp.endsWith(File.separator))
-				tmp += File.separator;
-			tmp += CACHE_DIR;
-			props.put(CACHE_LOCATION_PROP, tmp);
-
-			tmp = Long.toString((new java.util.Date()).getTime());
-			props.put(CACHE_PREFIX_PROP, tmp);
-
-			tmp += CACHE_INDEX;
-			props.put(CACHE_INDEX_PROP, tmp);
-
-			// save for next time around
-			FileOutputStream fos = null;
-			try {
-				fos = new FileOutputStream(cachePropFile);
-				try {
-					props.store(fos, null);
-					fos.flush();
-					fos.getFD().sync();
-				} finally {
-					fos.close();
-				}
-			} catch (IOException e) {
-				// failed to store cache location metadata ... ignore
-			}
-		}
-
-		// remember settings for shutdown processing
-		filePrefix = (String) props.get(CACHE_PREFIX_PROP);
-		indexName = (String) props.get(CACHE_INDEX_PROP);
-		cacheLocation = (String) props.get(CACHE_LOCATION_PROP);
-
-		if (DEBUG) {
-			debugStartup("Cache location: " + cacheLocation); //$NON-NLS-1$
-			debugStartup("Cache index: " + indexName); //$NON-NLS-1$
-			debugStartup("Cache file prefix: " + filePrefix); //$NON-NLS-1$
-		}
-
-		// create cache directory structure if needed
-		if (!verifyLocation(cacheLocation)) {
-			indexName = null;
-			cacheLocation = null;
-			if (DEBUG)
-				debugStartup("Failed to create cache directory structure. Caching suspended"); //$NON-NLS-1$
-			return;
-		}
-
-		// attempt to initialize cache index
-		if (cacheLocation != null && indexName != null) {
-			try {
-				fis = new FileInputStream(cacheLocation + indexName);
-				try {
-					cacheIndex.load(fis);
-				} finally {
-					fis.close();
-				}
-			} catch (IOException e) {
-				if (DEBUG)
-					debugStartup("Failed to initialize cache"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private static boolean verifyLocation(String location) {
-		// verify cache directory exists. Create if needed
-		File cacheDir = new File(location);
-		if (cacheDir.exists())
-			return true;
-		return cacheDir.mkdirs();
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/boot/PlatformURLHandler.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/boot/PlatformURLHandler.java
deleted file mode 100644
index 4c7a3ab..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/boot/PlatformURLHandler.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.core.internal.boot;
-
-import java.io.IOException;
-import java.lang.reflect.Constructor;
-import java.net.*;
-import java.util.Hashtable;
-import org.eclipse.core.internal.runtime.Messages;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.service.url.AbstractURLStreamHandlerService;
-
-/**
- * URL handler for the "platform" protocol
- */
-public class PlatformURLHandler extends AbstractURLStreamHandlerService {
-
-	private static Hashtable connectionType = new Hashtable();
-
-	// URL protocol designations
-	public static final String PROTOCOL = "platform"; //$NON-NLS-1$
-	public static final String FILE = "file"; //$NON-NLS-1$
-	public static final String JAR = "jar"; //$NON-NLS-1$
-	public static final String BUNDLE = "bundle"; //$NON-NLS-1$
-	public static final String JAR_SEPARATOR = "!/"; //$NON-NLS-1$
-	public static final String PROTOCOL_SEPARATOR = ":"; //$NON-NLS-1$
-
-	public PlatformURLHandler() {
-		super();
-	}
-
-	public URLConnection openConnection(URL url) throws IOException {
-		// Note: openConnection() method is made public (rather than protected)
-		//       to enable request delegation from proxy handlers
-		String spec = url.getFile().trim();
-		if (spec.startsWith("/")) //$NON-NLS-1$
-			spec = spec.substring(1);
-		int ix = spec.indexOf("/"); //$NON-NLS-1$
-		if (ix == -1)
-			throw new MalformedURLException(NLS.bind(Messages.url_invalidURL, url.toExternalForm()));
-
-		String type = spec.substring(0, ix);
-		Constructor construct = (Constructor) connectionType.get(type);
-		if (construct == null)
-			throw new MalformedURLException(NLS.bind(Messages.url_badVariant, type));
-
-		PlatformURLConnection connection = null;
-		try {
-			connection = (PlatformURLConnection) construct.newInstance(new Object[] {url});
-		} catch (Exception e) {
-			throw new IOException(NLS.bind(Messages.url_createConnection, e.getMessage()));
-		}
-		connection.setResolvedURL(connection.resolve());
-		return connection;
-	}
-
-	public static void register(String type, Class connectionClass) {
-		try {
-			Constructor c = connectionClass.getConstructor(new Class[] {URL.class});
-			connectionType.put(type, c);
-		} catch (NoSuchMethodException e) {
-			//don't register connection classes that don't conform to the spec
-		}
-	}
-	
-	public static void unregister(String type) {
-		connectionType.remove(type);
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/InitLegacyPreferences.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/InitLegacyPreferences.java
deleted file mode 100644
index d43beae..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/InitLegacyPreferences.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.preferences;
-
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-
-/**
- * Provides initialization of the legacy preferences as described in
- * the Plugin class.
- */
-public class InitLegacyPreferences implements ILegacyPreferences {
-	/**
-	 * The method tries to initialize the preferences using the legacy Plugin method.
-	 * 
-	 * @param object - plugin to initialize
-	 * @param name - ID of the plugin to be initialized
-	 * 
-	 * @see Plugin#initializeDefaultPluginPreferences
-	 * 
-	 * @deprecated
-	 */
-	public Object init(Object object, String name) {
-		Plugin plugin = null;
-		if (object instanceof Plugin)
-			plugin = (Plugin) object;
-		// No extension exists. Get the plug-in object and call #initializeDefaultPluginPreferences().
-		// We can only call this if the runtime compatibility layer is installed.
-		if (plugin == null && InternalPlatform.getDefault().getBundle(org.eclipse.core.internal.runtime.CompatibilityHelper.PI_RUNTIME_COMPATIBILITY) != null)
-			plugin = Platform.getPlugin(name);
-		if (plugin == null) {
-			if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-				InternalPlatform.message("No plug-in object available to set plug-in default preference overrides for:" + name); //$NON-NLS-1$
-			return null;
-		}
-		if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-			InternalPlatform.message("Applying plug-in default preference overrides for plug-in: " + plugin.getDescriptor().getUniqueIdentifier()); //$NON-NLS-1$
-
-		plugin.internalInitializeDefaultPluginPreferences();
-		return plugin;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/PreferenceForwarder.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/PreferenceForwarder.java
deleted file mode 100644
index 8d27ba3..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/PreferenceForwarder.java
+++ /dev/null
@@ -1,877 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.preferences;
-
-import java.io.*;
-import java.util.Iterator;
-import java.util.Properties;
-import org.eclipse.core.internal.runtime.RuntimeLog;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * This class represents a convenience layer between the Eclipse 3.0
- * preferences and pre-3.0 preferences. It acts as a bridge between the 
- * org.eclipse.core.runtime.Preferences object associated with a particular plug-in
- * object, and its corresponding preference node in the 3.0 preference node
- * hierarchy.
- * 
- * @since 3.0
- */
-public class PreferenceForwarder extends Preferences implements IEclipsePreferences.IPreferenceChangeListener, IEclipsePreferences.INodeChangeListener {
-
-	private static final byte[] BYTE_ARRAY_DEFAULT_DEFAULT = new byte[0];
-
-	PreferencesService a;
-
-	private IEclipsePreferences pluginRoot = (IEclipsePreferences) PreferencesService.getDefault().getRootNode().node(InstanceScope.SCOPE);
-	private DefaultPreferences defaultsRoot = (DefaultPreferences) PreferencesService.getDefault().getRootNode().node(DefaultScope.SCOPE);
-	private String pluginID;
-	private Object plugin;
-	// boolean to check to see if we should re-wrap and forward change
-	// events coming from the new runtime APIs.
-	private boolean notify = true;
-
-	/*
-	 * Used for test suites only.
-	 */
-	public PreferenceForwarder(String pluginID) {
-		this(null, pluginID);
-	}
-
-	public PreferenceForwarder(Object plugin, String pluginID) {
-		super();
-		this.plugin = plugin;
-		this.pluginID = pluginID;
-	}
-
-	/*
-	 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener#added(org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent)
-	 */
-	public synchronized void added(IEclipsePreferences.NodeChangeEvent event) {
-		if (listeners.size() > 0 && pluginID.equals(event.getChild().name())) {
-			try {
-				EclipsePreferences prefs = (EclipsePreferences) event.getChild();
-				prefs.addPreferenceChangeListener(this);
-			} catch (ClassCastException e) {
-				throw new RuntimeException("Plug-in preferences must be instances of EclipsePreferences: " + e.getMessage()); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/*
-	 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener#removed(org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent)
-	 */
-	public synchronized void removed(IEclipsePreferences.NodeChangeEvent event) {
-		if (listeners.size() > 0 && pluginID.equals(event.getChild().name())) {
-			try {
-				EclipsePreferences prefs = (EclipsePreferences) event.getChild();
-				prefs.removePreferenceChangeListener(this);
-			} catch (ClassCastException e) {
-				throw new RuntimeException("Plug-in preferences must be instances of EclipsePreferences: " + e.getMessage()); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * Adds a property change listener to this preference object.
-	 * Has no affect if the identical listener is already registered.
-	 *
-	 * @param listener a property change listener
-	 */
-	public synchronized void addPropertyChangeListener(IPropertyChangeListener listener) {
-		if (listeners.size() == 0) {
-			EclipsePreferences prefs = getPluginPreferences(false);
-			if (prefs != null) {
-				prefs.addPreferenceChangeListener(this);
-			}
-			pluginRoot.addNodeChangeListener(this);
-		}
-		listeners.add(listener);
-	}
-
-
-	/*
-	 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent)
-	 */
-	public void preferenceChange(IEclipsePreferences.PreferenceChangeEvent event) {
-		// if we are the ones making this change, then don't broadcast
-		if (!notify)
-			return;
-		Object oldValue = event.getOldValue();
-		Object newValue = event.getNewValue();
-		String key = event.getKey();
-		if (newValue == null)
-			newValue = getDefault(key, oldValue);
-		else if (oldValue == null)
-			oldValue = getDefault(key, newValue);
-		firePropertyChangeEvent(key, oldValue, newValue);
-	}
-
-	private EclipsePreferences getPluginPreferences(boolean create) {
-		try {
-			if (!create && !pluginRoot.nodeExists(pluginID))
-				return null;
-		} catch (BackingStoreException e) {
-			return null;
-		}
-		try {
-			return (EclipsePreferences) pluginRoot.node(pluginID);
-		} catch (ClassCastException e) {
-			throw new RuntimeException("Plug-in preferences must be instances of EclipsePreferences: " + e.getMessage()); //$NON-NLS-1$
-		}
-	}
-
-	private IEclipsePreferences getDefaultPreferences() {
-		return defaultsRoot.node(pluginID, plugin);
-	}
-
-	/**
-	 * Removes the given listener from this preference object.
-	 * Has no affect if the listener is not registered.
-	 *
-	 * @param listener a property change listener
-	 */
-	public synchronized void removePropertyChangeListener(IPropertyChangeListener listener) {
-		listeners.remove(listener);
-		if (listeners.size() == 0) {
-			EclipsePreferences prefs = getPluginPreferences(false);
-			if (prefs != null) {
-				prefs.removePreferenceChangeListener(this);
-			}
-			pluginRoot.removeNodeChangeListener(this);
-		}
-	}
-
-
-	/**
-	 * Does its best at determining the default value for the given key. Checks the
-	 * given object's type and then looks in the list of defaults to see if a value
-	 * exists. If not or if there is a problem converting the value, the default default 
-	 * value for that type is returned.
-	 */
-	private Object getDefault(String key, Object obj) {
-		IEclipsePreferences defaults = getDefaultPreferences();
-		if (obj instanceof String)
-			return defaults.get(key, STRING_DEFAULT_DEFAULT);
-		else if (obj instanceof Integer)
-			return new Integer(defaults.getInt(key, INT_DEFAULT_DEFAULT));
-		else if (obj instanceof Double)
-			return new Double(defaults.getDouble(key, DOUBLE_DEFAULT_DEFAULT));
-		else if (obj instanceof Float)
-			return new Float(defaults.getFloat(key, FLOAT_DEFAULT_DEFAULT));
-		else if (obj instanceof Long)
-			return new Long(defaults.getLong(key, LONG_DEFAULT_DEFAULT));
-		else if (obj instanceof byte[])
-			return defaults.getByteArray(key, BYTE_ARRAY_DEFAULT_DEFAULT);
-		else if (obj instanceof Boolean)
-			return defaults.getBoolean(key, BOOLEAN_DEFAULT_DEFAULT) ? Boolean.TRUE : Boolean.FALSE;
-		else
-			return null;
-	}
-
-	/**
-	 * Returns whether the given property is known to this preference object,
-	 * either by having an explicit setting or by having a default
-	 * setting.
-	 *
-	 * @param name the name of the property
-	 * @return <code>true</code> if either a current value or a default
-	 *  value is known for the named property, and <code>false</code>otherwise
-	 */
-	public boolean contains(String name) {
-		if (name == null)
-			return false;
-		String value = getPluginPreferences(true).get(name, null);
-		if (value != null)
-			return true;
-		return getDefaultPreferences().get(name, null) != null;
-	}
-
-	/**
-	 * Returns the current value of the boolean-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>false</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as a boolean.
-	 *
-	 * @param name the name of the property
-	 * @return the boolean-valued property
-	 */
-	public boolean getBoolean(String name) {
-		return getPluginPreferences(true).getBoolean(name, getDefaultPreferences().getBoolean(name, BOOLEAN_DEFAULT_DEFAULT));
-	}
-
-	/**
-	 * Sets the current value of the boolean-valued property with the
-	 * given name.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property
-	 */
-	public void setValue(String name, boolean value) {
-		Boolean oldValue = getBoolean(name) ? Boolean.TRUE : Boolean.FALSE;
-		Boolean newValue = value ? Boolean.TRUE : Boolean.FALSE;
-		if (newValue == oldValue)
-			return;
-		try {
-			notify = false;
-			if (getDefaultBoolean(name) == value)
-				getPluginPreferences(true).remove(name);
-			else
-				getPluginPreferences(true).putBoolean(name, value);
-			firePropertyChangeEvent(name, oldValue, newValue);
-		} finally {
-			notify = true;
-		}
-	}
-
-	/**
-	 * Returns the default value for the boolean-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>false</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a boolean.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public boolean getDefaultBoolean(String name) {
-		return getDefaultPreferences().getBoolean(name, BOOLEAN_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the boolean-valued property with the
-	 * given name. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property
-	 */
-	public void setDefault(String name, boolean value) {
-		getDefaultPreferences().putBoolean(name, value);
-	}
-
-	/**
-	 * Returns the current value of the double-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>0.0</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as a double.
-	 *
-	 * @param name the name of the property
-	 * @return the double-valued property
-	 */
-	public double getDouble(String name) {
-		return getPluginPreferences(true).getDouble(name, getDefaultPreferences().getDouble(name, DOUBLE_DEFAULT_DEFAULT));
-	}
-
-	/**
-	 * Sets the current value of the double-valued property with the
-	 * given name.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property; must be 
-	 *   a number (not a NaN)
-	 */
-	public void setValue(String name, double value) {
-		if (Double.isNaN(value))
-			throw new IllegalArgumentException();
-		final double doubleValue = getDouble(name);
-		if (value == doubleValue)
-			return;
-		Double oldValue = new Double(doubleValue);
-		Double newValue = new Double(value);
-		try {
-			notify = false;
-			if (getDefaultDouble(name) == value)
-				getPluginPreferences(true).remove(name);
-			else
-				getPluginPreferences(true).putDouble(name, value);
-			firePropertyChangeEvent(name, oldValue, newValue);
-		} finally {
-			notify = true;
-		}
-	}
-
-	/**
-	 * Returns the default value for the double-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>0.0</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a double.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public double getDefaultDouble(String name) {
-		return getDefaultPreferences().getDouble(name, DOUBLE_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the double-valued property with the
-	 * given name. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property; must be 
-	 *   a number (not a NaN)
-	 */
-	public void setDefault(String name, double value) {
-		if (Double.isNaN(value))
-			throw new IllegalArgumentException();
-		getDefaultPreferences().putDouble(name, value);
-	}
-
-	/**
-	 * Returns the current value of the float-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>0.0f</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as a float.
-	 *
-	 * @param name the name of the property
-	 * @return the float-valued property
-	 */
-	public float getFloat(String name) {
-		return getPluginPreferences(true).getFloat(name, getDefaultPreferences().getFloat(name, FLOAT_DEFAULT_DEFAULT));
-	}
-
-	/**
-	 * Sets the current value of the float-valued property with the
-	 * given name.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property; must be 
-	 *   a number (not a NaN)
-	 */
-	public void setValue(String name, float value) {
-		if (Float.isNaN(value))
-			throw new IllegalArgumentException();
-		final float floatValue = getFloat(name);
-		if (value == floatValue)
-			return;
-		Float oldValue = new Float(floatValue);
-		Float newValue = new Float(value);
-		try {
-			notify = false;
-			if (getDefaultFloat(name) == value)
-				getPluginPreferences(true).remove(name);
-			else
-				getPluginPreferences(true).putFloat(name, value);
-			firePropertyChangeEvent(name, oldValue, newValue);
-		} finally {
-			notify = true;
-		}
-	}
-
-	/**
-	 * Returns the default value for the float-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>0.0f</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a float.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public float getDefaultFloat(String name) {
-		return getDefaultPreferences().getFloat(name, FLOAT_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the float-valued property with the
-	 * given name. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property; must be 
-	 *   a number (not a NaN)
-	 */
-	public void setDefault(String name, float value) {
-		if (Float.isNaN(value))
-			throw new IllegalArgumentException();
-		getDefaultPreferences().putFloat(name, value);
-	}
-
-	/**
-	 * Returns the current value of the integer-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>0</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as an integter.
-	 *
-	 * @param name the name of the property
-	 * @return the int-valued property
-	 */
-	public int getInt(String name) {
-		return getPluginPreferences(true).getInt(name, getDefaultPreferences().getInt(name, INT_DEFAULT_DEFAULT));
-	}
-
-	/**
-	 * Sets the current value of the integer-valued property with the
-	 * given name.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property
-	 */
-	public void setValue(String name, int value) {
-		final int intValue = getInt(name);
-		if (value == intValue)
-			return;
-		Integer oldValue = new Integer(intValue);
-		Integer newValue = new Integer(value);
-		try {
-			notify = false;
-			if (getDefaultInt(name) == value)
-				getPluginPreferences(true).remove(name);
-			else
-				getPluginPreferences(true).putInt(name, value);
-			firePropertyChangeEvent(name, oldValue, newValue);
-		} finally {
-			notify = true;
-		}
-	}
-
-	/**
-	 * Returns the default value for the integer-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>0</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as an integer.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public int getDefaultInt(String name) {
-		return getDefaultPreferences().getInt(name, INT_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the integer-valued property with the
-	 * given name. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property
-	 */
-	public void setDefault(String name, int value) {
-		getDefaultPreferences().putInt(name, value);
-	}
-
-	/**
-	 * Returns the current value of the long-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>0L</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as a long.
-	 *
-	 * @param name the name of the property
-	 * @return the long-valued property
-	 */
-	public long getLong(String name) {
-		return getPluginPreferences(true).getLong(name, getDefaultPreferences().getLong(name, LONG_DEFAULT_DEFAULT));
-	}
-
-	/**
-	 * Sets the current value of the long-valued property with the
-	 * given name.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property
-	 */
-	public void setValue(String name, long value) {
-		final long longValue = getLong(name);
-		if (value == longValue)
-			return;
-		Long oldValue = new Long(longValue);
-		Long newValue = new Long(value);
-		try {
-			notify = false;
-			if (getDefaultLong(name) == value)
-				getPluginPreferences(true).remove(name);
-			else
-				getPluginPreferences(true).putLong(name, value);
-			firePropertyChangeEvent(name, oldValue, newValue);
-		} finally {
-			notify = true;
-		}
-	}
-
-	/**
-	 * Returns the default value for the long-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>0L</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a long.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public long getDefaultLong(String name) {
-		return getDefaultPreferences().getLong(name, LONG_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the long-valued property with the
-	 * given name. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property
-	 */
-	public void setDefault(String name, long value) {
-		getDefaultPreferences().putLong(name, value);
-	}
-
-	/**
-	 * Returns the current value of the string-valued property with the
-	 * given name.
-	 * Returns the default-default value (the empty string <code>""</code>)
-	 * if there is no property with the given name.
-	 *
-	 * @param name the name of the property
-	 * @return the string-valued property
-	 */
-	public String getString(String name) {
-		return getPluginPreferences(true).get(name, getDefaultPreferences().get(name, STRING_DEFAULT_DEFAULT));
-	}
-
-	/**
-	 * Sets the current value of the string-valued property with the
-	 * given name.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property
-	 */
-	public void setValue(String name, String value) {
-		if (value == null)
-			throw new IllegalArgumentException();
-		String oldValue = getString(name);
-		if (value.equals(oldValue))
-			return;
-		try {
-			notify = false;
-			if (getDefaultString(name).equals(value))
-				getPluginPreferences(true).remove(name);
-			else
-				getPluginPreferences(true).put(name, value);
-			firePropertyChangeEvent(name, oldValue, value);
-		} finally {
-			notify = true;
-		}
-	}
-
-	/**
-	 * Returns the default value for the string-valued property
-	 * with the given name.
-	 * Returns the default-default value (the empty string <code>""</code>) 
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a string.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public String getDefaultString(String name) {
-		return getDefaultPreferences().get(name, STRING_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the string-valued property with the
-	 * given name. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property
-	 */
-	public void setDefault(String name, String value) {
-		if (value == null)
-			throw new IllegalArgumentException();
-		getDefaultPreferences().put(name, value);
-	}
-
-	/**
-	 * Returns whether the property with the given name has the default value in
-	 * virtue of having no explicitly set value.
-	 *
-	 * @param name the name of the property
-	 * @return <code>true</code> if the property has no explicitly set value,
-	 * and <code>false</code> otherwise (including the case where the property
-	 * is unknown to this object)
-	 */
-	public boolean isDefault(String name) {
-		if (name == null)
-			return false;
-		return getPluginPreferences(true).get(name, null) == null;
-	}
-
-	/**
-	 * Sets the current value of the property with the given name back
-	 * to its default value. Has no effect if the property does not have
-	 * its own current value.
-	 * <p>
-	 * Note that the recommended way of re-initializing a property to the
-	 * appropriate default value is to call <code>setToDefault</code>.
-	 * This is implemented by removing the named value from the object, 
-	 * thereby exposing the default value.
-	 * </p>
-	 * <p>
-	 * A property change event is always reported. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are either strings, or <code>null</code> 
-	 * indicating the default-default value.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 */
-	public void setToDefault(String name) {
-		IEclipsePreferences preferences = getPluginPreferences(true);
-		Object oldValue = preferences.get(name, null);
-		if (oldValue != null)
-			preferences.remove(name);
-	}
-
-	/**
-	 * Returns a list of all properties known to this preference object which
-	 * have current values other than their default value.
-	 *
-	 * @return an array of property names 
-	 */
-	public String[] propertyNames() {
-		return getPluginPreferences(true).keys();
-	}
-
-	/**
-	 * Returns a list of all properties known to this preference object which
-	 * have default values other than their default-default value.
-	 *
-	 * @return an array of property names 
-	 */
-	public String[] defaultPropertyNames() {
-		try {
-			return getDefaultPreferences().keys();
-		} catch (BackingStoreException e) {
-			logError(e.getMessage(), e);
-			return new String[0];
-		}
-	}
-
-	/**
-	 * Returns whether the current values in this preference object
-	 * require saving.
-	 *
-	 * @return <code>true</code> if at least one of the properties
-	 *  known to this preference object has a current value different from its
-	 *  default value, and <code>false</code> otherwise
-	 */
-	public boolean needsSaving() {
-		return getPluginPreferences(true).isDirty();
-	}
-
-	/**
-	 * Flush the values of these plug-in preferences to disk.
-	 * 
-	 * @throws BackingStoreException
-	 */
-	public void flush() throws BackingStoreException {
-		IEclipsePreferences node = getPluginPreferences(false);
-		if (node != null)
-			node.flush();
-	}
-
-	/*
-	 * Something bad happened so log it. 
-	 */
-	private void logError(String message, Exception e) {
-		IStatus status = new Status(IStatus.ERROR, PrefsMessages.OWNER_NAME, IStatus.ERROR, message, e);
-		RuntimeLog.log(status);
-	}
-
-	/*
-	 * @see org.eclipse.core.runtime.Preferences#load(java.io.InputStream)
-	 */
-	public void load(InputStream in) throws IOException {
-		Properties result = new Properties();
-		result.load(in);
-		convertFromProperties(result);
-		// We loaded the prefs from a non-default location so now
-		// store them to disk. This also clears the dirty flag
-		// and therefore sets the #needsSaving() state correctly.
-		try {
-			flush();
-		} catch (BackingStoreException e) {
-			throw new IOException(e.getMessage());
-		}
-	}
-
-	/*
-	 * @see org.eclipse.core.runtime.Preferences#store(java.io.OutputStream, java.lang.String)
-	 */
-	public void store(OutputStream out, String header) throws IOException {
-		Properties result = convertToProperties();
-		result.store(out, header);
-		// We stored the prefs to a non-default location but the spec
-		// says that the dirty state is cleared so we want to store
-		// them to disk at the default location as well.
-		try {
-			flush();
-		} catch (BackingStoreException e) {
-			throw new IOException(e.getMessage());
-		}
-	}
-
-	private void convertFromProperties(Properties props) {
-		IEclipsePreferences preferences = getPluginPreferences(true);
-		for (Iterator i = props.keySet().iterator(); i.hasNext();) {
-			String key = (String) i.next();
-			String value = props.getProperty(key);
-			if (value != null)
-				preferences.put(key, value);
-		}
-	}
-
-	public String toString() {
-		return "PreferenceForwarder(" + pluginID + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/*
-	 * Convert the preferences in this node to a properties file
-	 * suitable for persistence.
-	 */
-	private Properties convertToProperties() {
-		Properties result = new Properties();
-		String[] keys = propertyNames();
-		for (int i = 0; i < keys.length; i++) {
-			String key = keys[i];
-			String value = getString(key);
-			if (!Preferences.STRING_DEFAULT_DEFAULT.equals(value))
-				result.put(key, value);
-		}
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/ProductPreferencesService.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/ProductPreferencesService.java
deleted file mode 100644
index 67bb827..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/preferences/ProductPreferencesService.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.preferences;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Properties;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.preferences.IProductPreferencesService;
-import org.osgi.framework.Bundle;
-
-public class ProductPreferencesService implements IProductPreferencesService {
-
-	private static final IPath NL_DIR = new Path("$nl$"); //$NON-NLS-1$
-
-	// declared in org.eclipse.ui.branding.IProductConstants
-	public static final String PRODUCT_KEY = "preferenceCustomization"; //$NON-NLS-1$
-	private static final String LEGACY_PRODUCT_CUSTOMIZATION_FILENAME = "plugin_customization.ini"; //$NON-NLS-1$
-	private static final String PROPERTIES_FILE_EXTENSION = "properties"; //$NON-NLS-1$
-
-	private boolean initialized = false;
-	private String customizationValue = null; // it won't change during the product run time
-	private Bundle customizationBundle = null;
-	private String productID = null;
-
-	private void initValues() {
-		if (initialized)
-			return;
-		initialized = true;
-
-		IProduct product = Platform.getProduct();
-		if (product == null) {
-			if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-				InternalPlatform.message("Product not available to set product default preference overrides."); //$NON-NLS-1$
-			return;
-		}
-		productID = product.getId();
-		if (productID == null) {
-			if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-				InternalPlatform.message("Product ID not available to apply product-level preference defaults."); //$NON-NLS-1$
-			return;
-		}
-		customizationBundle = product.getDefiningBundle();
-		if (customizationBundle == null) {
-			if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-				InternalPlatform.message("Bundle not available to apply product-level preference defaults for product id: " + productID); //$NON-NLS-1$
-			return;
-		}
-		customizationValue = product.getProperty(PRODUCT_KEY);
-		if (customizationValue == null) {
-			if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-				InternalPlatform.message("Product : " + productID + " does not define preference customization file. Using legacy file: plugin_customization.ini"); //$NON-NLS-1$//$NON-NLS-2$
-			customizationValue = LEGACY_PRODUCT_CUSTOMIZATION_FILENAME;
-		}
-	}
-
-	public Properties getProductCustomization() {
-		initValues();
-		URL url = null;
-		if (customizationValue != null) {
-			// try to convert the key to a URL
-			try {
-				url = new URL(customizationValue);
-			} catch (MalformedURLException e) {
-				// didn't work so treat it as a filename
-				url = FileLocator.find(customizationBundle, new Path(customizationValue), null);
-			}
-		}
-
-		if (url == null) {
-			if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-				InternalPlatform.message("Product preference customization file: " + customizationValue + " not found for bundle: " + productID); //$NON-NLS-1$//$NON-NLS-2$
-		}
-
-		return loadProperties(url);
-	}
-
-	public Properties getProductTranslation() {
-		initValues();
-		URL transURL = null;
-
-		if (customizationValue != null)
-			transURL = FileLocator.find(customizationBundle, NL_DIR.append(customizationValue).removeFileExtension().addFileExtension(PROPERTIES_FILE_EXTENSION), null);
-
-		if (transURL == null && InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-			InternalPlatform.message("No preference translations found for product/file: " + customizationBundle.getSymbolicName() + '/' + customizationValue); //$NON-NLS-1$
-
-		return loadProperties(transURL);
-	}
-
-	private Properties loadProperties(URL url) {
-		Properties result = new Properties();
-		if (url == null)
-			return result;
-		InputStream input = null;
-		try {
-			input = url.openStream();
-			result.load(input);
-		} catch (IOException e) {
-			if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES) {
-				InternalPlatform.message("Problem opening stream to preference customization file: " + url); //$NON-NLS-1$
-				e.printStackTrace();
-			}
-		} finally {
-			if (input != null)
-				try {
-					input.close();
-				} catch (IOException e) {
-					// ignore
-				}
-		}
-		return result;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AdapterFactoryProxy.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AdapterFactoryProxy.java
deleted file mode 100644
index e506d1b..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AdapterFactoryProxy.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.util.ArrayList;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * Instances of this class represent adapter factories that have been
- * contributed via the adapters extension point. The concrete factory is not
- * loaded until the factory's plugin is loaded, AND until the factory is
- * requested to supply an adapter.
- */
-class AdapterFactoryProxy implements IAdapterFactory, IAdapterFactoryExt {
-	private IConfigurationElement element;
-	/**
-	 * Store Id of the declaring extension. We might need it in case 
-	 * the owner goes away (in this case element becomes invalid).
-	 */
-	private String ownerId;
-	/**
-	 * The real factory. Null until the factory is loaded.
-	 */
-	private IAdapterFactory factory;
-	private boolean factoryLoaded = false;
-
-	/**
-	 * Creates a new factory proxy based on the given configuration element.
-	 * Returns the new proxy, or null if the element could not be created.
-	 */
-	public static AdapterFactoryProxy createProxy(IConfigurationElement element) {
-		AdapterFactoryProxy result = new AdapterFactoryProxy();
-		result.element = element;
-		result.ownerId = element.getDeclaringExtension().getUniqueIdentifier();
-		if ("factory".equals(element.getName())) //$NON-NLS-1$
-			return result;
-		result.logError();
-		return null;
-	}
-
-	String getAdaptableType() {
-		//cannot return null because it can cause startup failure
-		String result = element.getAttribute("adaptableType"); //$NON-NLS-1$
-		if (result != null)
-			return result;
-		logError();
-		return ""; //$NON-NLS-1$
-	}
-
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (!factoryLoaded)
-			loadFactory(false);
-		return factory == null ? null : factory.getAdapter(adaptableObject, adapterType);
-	}
-
-	public Class[] getAdapterList() {
-		if (!factoryLoaded)
-			loadFactory(false);
-		return factory == null ? null : factory.getAdapterList();
-	}
-
-	public String[] getAdapterNames() {
-		IConfigurationElement[] children = element.getChildren();
-		ArrayList adapters = new ArrayList(children.length);
-		for (int i = 0; i < children.length; i++) {
-			//ignore unknown children for forward compatibility
-			if ("adapter".equals(children[i].getName())) { //$NON-NLS-1$
-				String type = children[i].getAttribute("type"); //$NON-NLS-1$
-				if (type != null)
-					adapters.add(type);
-			}
-		}
-		if (adapters.isEmpty())
-			logError();
-		return (String[]) adapters.toArray(new String[adapters.size()]);
-	}
-
-	IExtension getExtension() {
-		return element.getDeclaringExtension();
-	}
-
-	String getOwnerId() {
-		return ownerId;
-	}
-
-	/**
-	 * Loads the real adapter factory, but only if its associated plug-in is
-	 * already loaded. Returns the real factory if it was successfully loaded.
-	 * @param force if <code>true</code> the plugin providing the 
-	 * factory will be loaded if necessary, otherwise no plugin activations
-	 * will occur.
-	 */
-	public IAdapterFactory loadFactory(boolean force) {
-		synchronized (this) {
-			if (factory != null || factoryLoaded)
-				return factory;
-			String bundleId = element.getContributor().getName();
-			if (!force && Platform.getBundle(bundleId).getState() != Bundle.ACTIVE)
-				return null;
-			//set to true to prevent repeated attempts to load a broken factory
-			factoryLoaded = true;
-		}
-		try {
-			factory = (IAdapterFactory) element.createExecutableExtension("class"); //$NON-NLS-1$
-		} catch (CoreException e) {
-			InternalPlatform.getDefault().log(e.getStatus());
-		}
-		return factory;
-	}
-
-	/**
-	 * The factory extension was malformed. Log an appropriate exception
-	 */
-	private void logError() {
-		String msg = NLS.bind(Messages.adapters_badAdapterFactory, element.getContributor().getName());
-		InternalPlatform.getDefault().log(new Status(IStatus.ERROR, Platform.PI_RUNTIME, 1, msg, null));
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AdapterManagerListener.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AdapterManagerListener.java
deleted file mode 100644
index 36c773b..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AdapterManagerListener.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.runtime;
-
-import java.util.*;
-import org.eclipse.core.runtime.*;
-
-/**
- * Portions of the AdapterManager that deal with the Eclipse extension registry
- * were moved into this class.
- * 
- * @since org.eclipse.core.runtime 3.2
- */
-public final class AdapterManagerListener implements IRegistryChangeListener {
-
-	private AdapterManager theAdapterManager;
-
-	/**
-	 * Constructs a new adapter manager.
-	 */
-	public AdapterManagerListener() {
-		theAdapterManager = AdapterManager.getDefault();
-		registerFactoryProxies();
-		Platform.getExtensionRegistry().addRegistryChangeListener(this);
-	}
-
-	/**
-	 * Loads adapters registered with the adapters extension point from
-	 * the plug-in registry.  Note that the actual factory implementations
-	 * are loaded lazily as they are needed.
-	 */
-	private void registerFactoryProxies() {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint point = registry.getExtensionPoint(Platform.PI_RUNTIME, Platform.PT_ADAPTERS);
-		if (point == null)
-			return;
-		IExtension[] extensions = point.getExtensions();
-		for (int i = 0; i < extensions.length; i++)
-			registerExtension(extensions[i]);
-	}
-
-	private void registerExtension(IExtension extension) {
-		IConfigurationElement[] elements = extension.getConfigurationElements();
-		for (int j = 0; j < elements.length; j++) {
-			AdapterFactoryProxy proxy = AdapterFactoryProxy.createProxy(elements[j]);
-			if (proxy != null)
-				theAdapterManager.registerFactory(proxy, proxy.getAdaptableType());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IRegistryChangeListener#registryChanged(org.eclipse.core.runtime.IRegistryChangeEvent)
-	 */
-	public synchronized void registryChanged(IRegistryChangeEvent event) {
-		//find the set of changed adapter extensions
-		HashSet toRemove = null;
-		IExtensionDelta[] deltas = event.getExtensionDeltas();
-		String adapterId = Platform.PI_RUNTIME + '.' + Platform.PT_ADAPTERS;
-		boolean found = false;
-		for (int i = 0; i < deltas.length; i++) {
-			//we only care about extensions to the adapters extension point
-			if (!adapterId.equals(deltas[i].getExtensionPoint().getUniqueIdentifier()))
-				continue;
-			found = true;
-			if (deltas[i].getKind() == IExtensionDelta.ADDED)
-				registerExtension(deltas[i].getExtension());
-			else {
-				//create the hash set lazily
-				if (toRemove == null)
-					toRemove = new HashSet();
-				toRemove.add(deltas[i].getExtension().getUniqueIdentifier());
-			}
-		}
-		//need to discard cached state for the changed extensions
-		if (found)
-			theAdapterManager.flushLookup();
-		if (toRemove == null)
-			return;
-		//remove any factories belonging to extensions that are going away
-		for (Iterator it = theAdapterManager.getFactories().values().iterator(); it.hasNext();) {
-			for (Iterator it2 = ((List) it.next()).iterator(); it2.hasNext();) {
-				IAdapterFactory factory = (IAdapterFactory) it2.next();
-				if (factory instanceof AdapterFactoryProxy) {
-					String ext = ((AdapterFactoryProxy) factory).getOwnerId();
-					if (toRemove.contains(ext))
-						it2.remove();
-				}
-			}
-		}
-	}
-
-	/*
-	 * Shuts down the listener by removing the registry change listener. Should only be
-	 * invoked during platform shutdown.
-	 */
-	public synchronized void stop() {
-		Platform.getExtensionRegistry().removeRegistryChangeListener(this);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AuthorizationDatabase.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AuthorizationDatabase.java
deleted file mode 100644
index 4884bec..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AuthorizationDatabase.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.runtime;
-
-import java.io.*;
-import java.net.URL;
-import java.util.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * A database that remembers information, such as usernames and
- * passwords.  The information is stored in memory and can be saved
- * to disk in an encrypted format.  While the API is phrased in terms of
- * URLs, realms and authentication schemes, not all of these must have
- * significant values.  For example, if "realm" is not relevant to a
- * particular application, it can be left blank (though not
- * <code>null</code>).
- */
-public class AuthorizationDatabase {
-	/**
-	 * Version number for the format of the keyring file.
-	 */
-	private static final int KEYRING_FILE_VERSION = 1;
-	/**
-	 * A nested hashtable that stores authorization information. The
-	 * table maps server URLs to realms to authentication schemes to
-	 * authorization information.
-	 */
-	private Hashtable authorizationInfo = new Hashtable(5);
-
-	/**
-	 * A hashtable mapping resource URLs to realms.
-	 */
-	private Hashtable protectionSpace = new Hashtable(5);
-
-	private File file = null;
-	private String password = null;
-	private boolean needsSaving = true;
-
-	/**
-	 * Creates a new authorization database whose data cannot be saved to
-	 * disk.
-	 */
-	public AuthorizationDatabase() {
-		super();
-	}
-
-	/**
-	 * Creates a new authorization database, or opens an existing one, whose
-	 * data is, or can be, saved to a file with the given filename. A
-	 * password must be given to create a new database and an existing
-	 * database is opened by supplying the password that was given to create
-	 * it.
-	 *
-	 * @param filename the location of the database on disk. For example,
-	 *		"c:/temp/database"
-	 * @param password the password to access the database. For example,
-	 *		"secret"
-	 * @exception CoreException if there are problems creating the database.
-	 *		Reasons include:
-	 * <ul>
-	 * <li>The database could not be opened because the wrong password was given.
-	 * <li>The database could not be opened because the specified file is corrupt.
-	 * </ul>
-	 */
-	public AuthorizationDatabase(String filename, String password) throws CoreException {
-		Assert.isNotNull(filename);
-		Assert.isNotNull(password);
-		this.password = password;
-		file = new File(filename);
-		load();
-	}
-
-	/**
-	 * Adds the given authorization information to the database. The
-	 * information is relevant for the specified protection space and the
-	 * given authorization scheme. The protection space is defined by the
-	 * combination of the given server URL and realm. The authorization 
-	 * scheme determines what the authorization information contains and how 
-	 * it should be used. The authorization information is a <code>Map</code> 
-	 * of <code>String</code> to <code>String</code> and typically
-	 * contain information such as usernames and passwords.
-	 *
-	 * @param serverUrl the URL identifying the server for this authorization
-	 *		information. For example, "http://www.hostname.com/".
-	 * @param realm the subsection of the given server to which this
-	 *		authorization information applies.  For example,
-	 *		"realm1@hostname.com" or "" for no realm.
-	 * @param authScheme the scheme for which this authorization information
-	 *		applies. For example, "Basic" or "" for no authorization scheme
-	 * @param info a <code>Map</code> containing authorization information 
-	 *		such as usernames and passwords
-	 */
-	public void addAuthorizationInfo(URL serverUrl, String realm, String authScheme, Map info) {
-		Assert.isNotNull(serverUrl);
-		Assert.isNotNull(realm);
-		Assert.isNotNull(authScheme);
-		Assert.isNotNull(info);
-
-		String url = serverUrl.toString();
-		Hashtable realmToAuthScheme = (Hashtable) authorizationInfo.get(url);
-		if (realmToAuthScheme == null) {
-			realmToAuthScheme = new Hashtable(5);
-			authorizationInfo.put(url, realmToAuthScheme);
-		}
-
-		Hashtable authSchemeToInfo = (Hashtable) realmToAuthScheme.get(realm);
-		if (authSchemeToInfo == null) {
-			authSchemeToInfo = new Hashtable(5);
-			realmToAuthScheme.put(realm, authSchemeToInfo);
-		}
-
-		authSchemeToInfo.put(authScheme.toLowerCase(), info);
-		needsSaving = true;
-	}
-
-	/**
-	 * Adds the specified resource to the protection space specified by the
-	 * given realm. All resources at or deeper than the depth of the last
-	 * symbolic element in the path of the given resource URL are assumed to
-	 * be in the same protection space.
-	 *
-	 * @param resourceUrl the URL identifying the resources to be added to
-	 *		the specified protection space. For example,
-	 *		"http://www.hostname.com/folder/".
-	 * @param realm the name of the protection space. For example,
-	 *		"realm1@hostname.com"
-	 */
-	public void addProtectionSpace(URL resourceUrl, String realm) {
-		Assert.isNotNull(resourceUrl);
-		Assert.isNotNull(realm);
-
-		if (!resourceUrl.getFile().endsWith("/")) { //$NON-NLS-1$
-			resourceUrl = URLTool.getParent(resourceUrl);
-		}
-
-		String oldRealm = getProtectionSpace(resourceUrl);
-		if (oldRealm != null && oldRealm.equals(realm)) {
-			return;
-		}
-
-		String url1 = resourceUrl.toString();
-		Enumeration urls = protectionSpace.keys();
-		while (urls.hasMoreElements()) {
-			String url2 = (String) urls.nextElement();
-			if (url1.startsWith(url2) || url2.startsWith(url1)) {
-				protectionSpace.remove(url2);
-				break;
-			}
-		}
-
-		protectionSpace.put(url1, realm);
-		needsSaving = true;
-	}
-
-	/**
-	 * Removes the authorization information for the specified protection
-	 * space and given authorization scheme. The protection space is defined
-	 * by the given server URL and realm.
-	 *
-	 * @param serverUrl the URL identifying the server to remove the
-	 *		authorization information for. For example,
-	 *		"http://www.hostname.com/".
-	 * @param realm the subsection of the given server to remove the
-	 *		authorization information for. For example,
-	 *		"realm1@hostname.com" or "" for no realm.
-	 * @param authScheme the scheme for which the authorization information
-	 *		to remove applies. For example, "Basic" or "" for no
-	 *		authorization scheme.
-	 */
-	public void flushAuthorizationInfo(URL serverUrl, String realm, String authScheme) {
-		Hashtable realmToAuthScheme = (Hashtable) authorizationInfo.get(serverUrl.toString());
-
-		if (realmToAuthScheme == null) {
-			return;
-		}
-
-		Hashtable authSchemeToInfo = (Hashtable) realmToAuthScheme.get(realm);
-
-		if (authSchemeToInfo == null) {
-			return;
-		}
-
-		authSchemeToInfo.remove(authScheme.toLowerCase());
-
-		needsSaving = true;
-	}
-
-	/**
-	 * Returns the authorization information for the specified protection
-	 * space and given authorization scheme. The protection space is defined
-	 * by the given server URL and realm. Returns <code>null</code> if no
-	 * such information exists.
-	 *
-	 * @param serverUrl the URL identifying the server for the authorization
-	 *		information. For example, "http://www.hostname.com/".
-	 * @param realm the subsection of the given server to which the
-	 *		authorization information applies.  For example,
-	 *		"realm1@hostname.com" or "" for no realm.
-	 * @param authScheme the scheme for which the authorization information
-	 *		applies. For example, "Basic" or "" for no authorization scheme
-	 * @return the authorization information for the specified protection
-	 *		space and given authorization scheme, or <code>null</code> if no
-	 *		such information exists
-	 */
-	public Map getAuthorizationInfo(URL serverUrl, String realm, String authScheme) {
-		Hashtable realmToAuthScheme = (Hashtable) authorizationInfo.get(serverUrl.toString());
-		if (realmToAuthScheme == null) {
-			return null;
-		}
-
-		Hashtable authSchemeToInfo = (Hashtable) realmToAuthScheme.get(realm);
-		if (authSchemeToInfo == null) {
-			return null;
-		}
-
-		return (Map) authSchemeToInfo.get(authScheme.toLowerCase());
-	}
-
-	/**
-	 * Returns the protection space (realm) for the specified resource, or
-	 * <code>null</code> if the realm is unknown.
-	 *
-	 * @param resourceUrl the URL of the resource whose protection space is
-	 *		returned. For example, "http://www.hostname.com/folder/".
-	 * @return the protection space (realm) for the specified resource, or
-	 *		<code>null</code> if the realm is unknown
-	 */
-	public String getProtectionSpace(URL resourceUrl) {
-		while (resourceUrl != null) {
-			String realm = (String) protectionSpace.get(resourceUrl.toString());
-			if (realm != null) {
-				return realm;
-			}
-			resourceUrl = URLTool.getParent(resourceUrl);
-		}
-
-		return null;
-	}
-
-	private void load() throws CoreException {
-		if (file == null)
-			return;
-		if (!file.exists()) {
-			save();
-			return;
-		}
-		try {
-			InputStream input = new FileInputStream(file);
-			try {
-				load(input);
-			} finally {
-				input.close();
-			}
-		} catch (IOException e) {
-			throw new CoreException(new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.FAILED_READ_METADATA, NLS.bind(Messages.meta_unableToReadAuthorization, file), e));
-		} catch (ClassNotFoundException e) {
-			throw new CoreException(new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.FAILED_READ_METADATA, NLS.bind(Messages.meta_unableToReadAuthorization, file), e));
-		}
-	}
-
-	private void load(InputStream is) throws IOException, ClassNotFoundException, CoreException {
-		//try to read the file version number. Pre 2.0 versions had no number
-		int version = is.read();
-		if (version == KEYRING_FILE_VERSION) {
-			//read the authorization data
-			CipherInputStream cis = new CipherInputStream(is, password);
-			ObjectInputStream ois = new ObjectInputStream(cis);
-			try {
-				authorizationInfo = (Hashtable) ois.readObject();
-				protectionSpace = (Hashtable) ois.readObject();
-			} finally {
-				ois.close();
-			}
-		} else {
-			//the format has changed, just log a warning
-			InternalPlatform.getDefault().log(new Status(IStatus.WARNING, Platform.PI_RUNTIME, Platform.FAILED_READ_METADATA, Messages.meta_authFormatChanged, null));
-			//close the stream and save a new file in the correct format
-			try {
-				is.close();
-			} catch (IOException e) {
-				//ignore failure to close
-			}
-			needsSaving = true;
-			save();
-		}
-	}
-
-	/**
-	 * Saves the authorization database to disk.
-	 */
-	public void save() throws CoreException {
-		if (!needsSaving || file == null)
-			return;
-		try {
-			file.delete();
-			if ((!file.getParentFile().exists() && !file.getParentFile().mkdirs()) || !canWrite(file.getParentFile()))
-				throw new CoreException(new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.FAILED_WRITE_METADATA, NLS.bind(Messages.meta_unableToWriteAuthorization, file), null));
-			file.createNewFile();
-			FileOutputStream out = new FileOutputStream(file);
-			try {
-				save(out);
-			} finally {
-				out.close();
-			}
-		} catch (IOException e) {
-			throw new CoreException(new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.FAILED_WRITE_METADATA, NLS.bind(Messages.meta_unableToWriteAuthorization, file), e));
-		}
-		needsSaving = false;
-	}
-
-	private static boolean canWrite(File installDir) {
-		if (!installDir.canWrite())
-			return false;
-
-		if (!installDir.isDirectory())
-			return false;
-
-		File fileTest = null;
-		try {
-			fileTest = File.createTempFile("writtableArea", null, installDir); //$NON-NLS-1$
-		} catch (IOException e) {
-			//If an exception occured while trying to create the file, it means that it is not writtable
-			return false;
-		} finally {
-			if (fileTest != null)
-				fileTest.delete();
-		}
-		return true;
-	}
-
-	private void save(FileOutputStream os) throws IOException {
-		//write the version number
-		os.write(KEYRING_FILE_VERSION);
-
-		CipherOutputStream cos = new CipherOutputStream(os, password);
-		ObjectOutputStream oos = new ObjectOutputStream(cos);
-		//write the data
-		try {
-			oos.writeObject(authorizationInfo);
-			oos.writeObject(protectionSpace);
-			os.flush();
-			os.getFD().sync();
-		} finally {
-			oos.close();
-		}
-	}
-
-	/**
-	 * Sets the password to use for accessing this database.  If the database
-	 * is subsequently saved, this new password is used.
-	 */
-	public boolean setPassword(String oldValue, String newValue) {
-		if (!oldValue.equals(password))
-			return false;
-		password = newValue;
-		needsSaving = true;
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AuthorizationHandler.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AuthorizationHandler.java
deleted file mode 100644
index d0bac9e..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/AuthorizationHandler.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.io.File;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.osgi.util.NLS;
-
-// This class factors out the management of the .keyring location
-public class AuthorizationHandler {
-	/* package */static final String F_KEYRING = ".keyring"; //$NON-NLS-1$
-
-	//Authorization related informations
-	private static AuthorizationDatabase keyring = null;
-	private static long keyringTimeStamp;
-	private static String keyringFile = null;
-	private static String password = ""; //$NON-NLS-1$
-
-	/**
-	 * Opens the password database (if any) initally provided to the platform at startup.
-	 */
-	private static void loadKeyring() throws CoreException {
-		if (keyring != null && new File(keyringFile).lastModified() == keyringTimeStamp)
-			return;
-		if (keyringFile == null) {
-			File file = new File(InternalPlatform.getDefault().getConfigurationLocation().getURL().getPath() + '/' + Platform.PI_RUNTIME);
-			file = new File(file, F_KEYRING);
-			keyringFile = file.getAbsolutePath();
-		}
-		try {
-			keyring = new AuthorizationDatabase(keyringFile, password);
-		} catch (CoreException e) {
-			InternalPlatform.getDefault().log(e.getStatus());
-		}
-		if (keyring == null) {
-			//try deleting the file and loading again - format may have changed
-			new java.io.File(keyringFile).delete();
-			keyring = new AuthorizationDatabase(keyringFile, password);
-			//don't bother logging a second failure and let it flows to the callers
-		}
-		keyringTimeStamp = new File(keyringFile).lastModified();
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.Platform
-	 */
-	public static void addAuthorizationInfo(URL serverUrl, String realm, String authScheme, Map info) throws CoreException {
-		loadKeyring();
-		keyring.addAuthorizationInfo(serverUrl, realm, authScheme, new HashMap(info));
-		keyring.save();
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.Platform
-	 */
-	public static void addProtectionSpace(URL resourceUrl, String realm) throws CoreException {
-		loadKeyring();
-		keyring.addProtectionSpace(resourceUrl, realm);
-		keyring.save();
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.Platform
-	 */
-	public static void flushAuthorizationInfo(URL serverUrl, String realm, String authScheme) throws CoreException {
-		loadKeyring();
-		keyring.flushAuthorizationInfo(serverUrl, realm, authScheme);
-		keyring.save();
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.Platform
-	 */
-	public static Map getAuthorizationInfo(URL serverUrl, String realm, String authScheme) {
-		Map info = null;
-		try {
-			loadKeyring();
-			info = keyring.getAuthorizationInfo(serverUrl, realm, authScheme);
-		} catch (CoreException e) {
-			// The error has already been logged in loadKeyring()
-		}
-		return info == null ? null : new HashMap(info);
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.Platform
-	 */
-	public static String getProtectionSpace(URL resourceUrl) {
-		try {
-			loadKeyring();
-		} catch (CoreException e) {
-			// The error has already been logged in loadKeyring()
-			return null;
-		}
-		return keyring.getProtectionSpace(resourceUrl);
-	}
-
-	public static void setKeyringFile(String file) {
-		if (keyringFile != null)
-			throw new IllegalStateException(NLS.bind(Messages.meta_keyringFileAlreadySpecified, keyringFile));
-		keyringFile = file;
-	}
-
-	public static void setPassword(String keyringPassword) {
-		password = keyringPassword;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Cipher.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Cipher.java
deleted file mode 100644
index 51eaa3c..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Cipher.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.util.Random;
-
-/**
- * <P>Encrypts or decrypts a sequence of bytes. The bytes are decrypted
- * by supplying the same password that was given when the bytes were
- * encrypted.
- * <P>Here is an example showing how to encrypt and then decrypt the
- * string "Hello, world!" using the password "music":
- * <pre>
- *     String password = "music";
- *     byte[] data = "Hello, world!".getBytes("UTF8");
- *
- *     // Encrypt
- *     Cipher cipher = new Cipher(ENCRYPT_MODE, password);
- *     byte[] encrypted = cipher.cipher(data);
- *
- *     // Decrypt
- *     cipher = new Cipher(DECRYPT_MODE, password);
- *     byte[] decrypted = cipher.cipher(encrypted);
- * </pre>
- */
-public class Cipher {
-	public static final int DECRYPT_MODE = -1;
-	public static final int ENCRYPT_MODE = 1;
-	private static final int RANDOM_SIZE = 16;
-
-	private int mode = 0;
-	private byte[] password = null;
-
-	//the following fields are used for generating a secure byte stream
-	//used by the decryption algorithm
-	private byte[] byteStream;
-	private int byteStreamOffset;
-	private MessageDigest digest;
-	private Random random;
-	private final byte[] toDigest;
-
-	/**
-	 * Initializes the cipher with the given mode and password. This method
-	 * must be called first (before any encryption of decryption takes
-	 * place) to specify whether the cipher should be in encrypt or decrypt
-	 * mode and to set the password.
-	 *
-	 * @param mode
-	 * @param passwordString
-	 */
-	public Cipher(int mode, String passwordString) {
-		this.mode = mode;
-		try {
-			this.password = passwordString.getBytes("UTF8"); //$NON-NLS-1$
-		} catch (UnsupportedEncodingException e) {
-			this.password = passwordString.getBytes();
-		}
-		toDigest = new byte[password.length + RANDOM_SIZE];
-	}
-
-	/**
-	 * Encrypts or decrypts (depending on which mode the cipher is in) the
-	 * given data and returns the result.
-	 *
-	 * @param data
-	 * @return     the result of encrypting or decrypting the given data
-	 */
-	public byte[] cipher(byte[] data) throws Exception {
-		return transform(data, 0, data.length, mode);
-	}
-
-	/**
-	 * Encrypts or decrypts (depending on which mode the cipher is in) the
-	 * given data and returns the result.
-	 *
-	 * @param data the byte array containg the given data
-	 * @param off  the index of the first byte in the given byte array
-	 *   to be transformed
-	 * @param len  the number of bytes to be transformed
-	 * @return the result of encrypting or decrypting the given data
-	 */
-	public byte[] cipher(byte[] data, int off, int len) throws Exception {
-		return transform(data, off, len, mode);
-	}
-
-	/**
-	 * Encrypts or decrypts (depending on which mode the cipher is in) the
-	 * given byte and returns the result.
-	 *
-	 * @param datum the given byte
-	 * @return      the result of encrypting or decrypting the given byte
-	 */
-	public byte cipher(byte datum) throws Exception {
-		byte[] data = {datum};
-		return cipher(data)[0];
-	}
-
-	/**
-	 * Generates a secure stream of bytes based on the input seed.
-	 * This routine works by combining the input seed with random bytes
-	 * generated by a random number generator, and then computing the 
-	 * SHA-1 hash of those bytes.
-	 */
-	private byte[] generateBytes() throws Exception {
-		if (digest == null) {
-			digest = MessageDigest.getInstance("SHA"); //$NON-NLS-1$
-			//also seed random number generator based on password
-			long seed = 0;
-			for (int i = 0; i < password.length; i++)
-				//this function is known to give good hash distribution for character data
-				seed = (seed * 37) + password[i];
-			random = new Random(seed);
-		}
-		//add random bytes to digest array
-		random.nextBytes(toDigest);
-
-		//overlay password onto digest array
-		System.arraycopy(password, 0, toDigest, 0, password.length);
-
-		//compute and return SHA-1 hash of digest array
-		return digest.digest(toDigest);
-	}
-
-	/**
-	 * Returns a stream of cryptographically secure bytes of the given length.
-	 * The result is deterministically based on the input seed (password).
-	 */
-	private byte[] nextRandom(int length) throws Exception {
-		byte[] nextRandom = new byte[length];
-		int nextRandomOffset = 0;
-		while (nextRandomOffset < length) {
-			if (byteStream == null || byteStreamOffset >= byteStream.length) {
-				byteStream = generateBytes();
-				byteStreamOffset = 0;
-			}
-			nextRandom[nextRandomOffset++] = byteStream[byteStreamOffset++];
-		}
-		return nextRandom;
-	}
-
-	private byte[] transform(byte[] data, int off, int len, int mod) throws Exception {
-		byte[] result = nextRandom(len);
-		for (int i = 0; i < len; ++i) {
-			result[i] = (byte) (data[i + off] + mod * result[i]);
-		}
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/CipherInputStream.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/CipherInputStream.java
deleted file mode 100644
index 0bb17c7..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/CipherInputStream.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.io.*;
-
-/**
- * Decrypts a stream of data that was encrypted using the
- * <code>Cipher</code> or <code>CipherOutputStream</code>.
- *
- * @see Cipher
- * @see CipherOutputStream
- */
-public class CipherInputStream extends FilterInputStream {
-	private static final int SKIP_BUFFER_SIZE = 2048;
-	private Cipher cipher;
-
-	/**
-	 * Constructs a new <code>CipherInputStream</code> that decrypts the
-	 * data in the given <code>InputStream</code>.  The data can only be
-	 * decrypted if the given password is the same as that which was used
-	 * to encrypt it.
-	 *
-	 * @param is
-	 * @param password
-	 */
-	public CipherInputStream(InputStream is, String password) {
-		super(is);
-		cipher = new Cipher(Cipher.DECRYPT_MODE, password);
-	}
-
-	/**
-	 * @see InputStream#markSupported()
-	 */
-	public boolean markSupported() {
-		return false;
-	}
-
-	/**
-	 * @see InputStream#read()
-	 */
-	public int read() throws IOException {
-		int b = super.read();
-		if (b == -1)
-			return -1;
-		try {
-			return (cipher.cipher((byte) b)) & 0x00ff;
-		} catch (Exception e) {
-			throw new IOException(e.getMessage());
-		}
-	}
-
-	/**
-	 * @see InputStream#read(byte[], int, int)
-	 */
-	public int read(byte b[], int off, int len) throws IOException {
-		int bytesRead = in.read(b, off, len);
-		if (bytesRead == -1)
-			return -1;
-		try {
-			byte[] result = cipher.cipher(b, off, bytesRead);
-			for (int i = 0; i < result.length; ++i)
-				b[i + off] = result[i];
-			return bytesRead;
-		} catch (Exception e) {
-			throw new IOException(e.getMessage());
-		}
-	}
-
-	/**
-	 * @see InputStream#skip(long)
-	 */
-	public long skip(long n) throws IOException {
-		byte[] buffer = new byte[SKIP_BUFFER_SIZE];
-
-		int bytesRead = 0;
-		long bytesRemaining = n;
-
-		while (bytesRead != -1 && bytesRemaining > 0) {
-			bytesRead = read(buffer, 0, (int) Math.min(SKIP_BUFFER_SIZE, bytesRemaining));
-			if (bytesRead > 0) {
-				bytesRemaining -= bytesRead;
-			}
-		}
-
-		return n - bytesRemaining;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/CipherOutputStream.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/CipherOutputStream.java
deleted file mode 100644
index 600a560..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/CipherOutputStream.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.io.*;
-
-/**
- * Encrypts a stream of data that can be decrypted using the
- * <code>Cipher</code> or <code>CipherInputStream</code>.
- *
- * @see Cipher
- * @see CipherInputStream
- */
-public class CipherOutputStream extends FilterOutputStream {
-	private Cipher cipher;
-
-	/**
-	 * Constructs a new <code>CipherOutputStream</code> that encrypts the
-	 * data in the given <code>OutputStream</code>.  Once the data is
-	 * encrypted it can be decrypted by suppying the encrupted data and
-	 * given password to a <code>Cipher</code> or
-	 * <code>CipherInputStream</code>.
-	 *
-	 * @param os
-	 * @param password
-	 */
-	public CipherOutputStream(OutputStream os, String password) {
-		super(os);
-		cipher = new Cipher(Cipher.ENCRYPT_MODE, password);
-	}
-
-	/**
-	 * @see OutputStream#write(int)
-	 */
-	public void write(int b) throws IOException {
-		try {
-			out.write(cipher.cipher((byte) b));
-		} catch (Exception e) {
-			throw new IOException(e.getMessage());
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/CompatibilityHelper.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/CompatibilityHelper.java
deleted file mode 100644
index ae6c6ed..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/CompatibilityHelper.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.lang.reflect.Method;
-import org.eclipse.core.runtime.*;
-import org.osgi.framework.Bundle;
-
-/**
- * This class isolates calls to the backward compatibility layer.
- * It uses reflection so it can be loaded with success even in the absence of
- * the compatibility plugin.
- * 
- * @deprecated Marked as deprecated to suppress deprecation warnings.
- */
-public class CompatibilityHelper {
-	private static final String OPTION_DEBUG_COMPATIBILITY = Platform.PI_RUNTIME + "/compatibility/debug"; //$NON-NLS-1$
-	public static final boolean DEBUG = Boolean.TRUE.toString().equalsIgnoreCase(InternalPlatform.getDefault().getOption(OPTION_DEBUG_COMPATIBILITY));
-	public static final String PI_RUNTIME_COMPATIBILITY = "org.eclipse.core.runtime.compatibility"; //$NON-NLS-1$
-	private static Bundle compatibility = null;
-
-	public synchronized static void nullCompatibility() {
-		compatibility = null;
-	}
-	
-	public synchronized static Bundle initializeCompatibility() {
-		// if compatibility is stale (has been uninstalled or unresolved) 
-		// then we try to get a new resolved compatibility bundle
-		if (compatibility == null || (compatibility.getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED | Bundle.STOPPING)) != 0)
-			compatibility = org.eclipse.core.internal.runtime.InternalPlatform.getDefault().getBundle(PI_RUNTIME_COMPATIBILITY);
-		return compatibility;
-	}
-
-	public static void setPlugin(IPluginDescriptor descriptor, Plugin plugin) {
-		//Here we use reflection so the runtime code can run without the compatibility plugin
-		if (initializeCompatibility() == null)
-			throw new IllegalStateException();
-
-		try {
-			Method setPlugin = descriptor.getClass().getMethod("setPlugin", new Class[] {Plugin.class}); //$NON-NLS-1$
-			setPlugin.invoke(descriptor, new Object[] {plugin});
-		} catch (Exception e) {
-			//Ignore the exceptions
-		}
-	}
-
-	public synchronized static IPluginDescriptor getPluginDescriptor(String pluginId) {
-		//Here we use reflection so the runtime code can run without the compatibility
-		initializeCompatibility();
-		if (compatibility == null)
-			throw new IllegalStateException();
-
-		Class oldInternalPlatform = null;
-		try {
-			oldInternalPlatform = compatibility.loadClass("org.eclipse.core.internal.plugins.InternalPlatform"); //$NON-NLS-1$
-			Method getPluginDescriptor = oldInternalPlatform.getMethod("getPluginDescriptor", new Class[] {String.class}); //$NON-NLS-1$
-			return (IPluginDescriptor) getPluginDescriptor.invoke(oldInternalPlatform, new Object[] {pluginId});
-		} catch (Exception e) {
-			if (DEBUG) {
-				String msg = "Error running compatibility code"; //$NON-NLS-1$
-				IStatus error = new Status(IStatus.ERROR, Platform.PI_RUNTIME, 1, msg, e);
-				InternalPlatform.getDefault().log(error);
-			}
-			//Ignore the exceptions, return null			
-		}
-		return null;
-	}
-
-	public synchronized static void setActive(IPluginDescriptor descriptor) {
-		initializeCompatibility();
-		if (compatibility == null)
-			throw new IllegalStateException();
-
-		try {
-			Method setPlugin = descriptor.getClass().getMethod("setActive", null); //$NON-NLS-1$
-			setPlugin.invoke(descriptor, null);
-		} catch (Exception e) {
-			//Ignore the exceptions
-		}
-	}
-
-	public synchronized static boolean hasPluginObject(IPluginDescriptor descriptor) {
-		initializeCompatibility();
-		if (compatibility == null)
-			throw new IllegalStateException();
-
-		Boolean result = Boolean.FALSE;
-		try {
-			Method setPlugin = descriptor.getClass().getMethod("hasPluginObject", null); //$NON-NLS-1$
-			result = (Boolean) setPlugin.invoke(descriptor, null);
-		} catch (Exception e) {
-			//Ignore the exceptions			
-		}
-		return result.booleanValue();
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java
deleted file mode 100644
index 792234d..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java
+++ /dev/null
@@ -1,1115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Julian Chen - fix for bug #92572, jclRM
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.io.*;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.*;
-import org.eclipse.core.internal.boot.PlatformURLBaseConnection;
-import org.eclipse.core.internal.preferences.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.core.runtime.preferences.IPreferencesService;
-import org.eclipse.core.runtime.preferences.IProductPreferencesService;
-import org.eclipse.osgi.framework.log.FrameworkLog;
-import org.eclipse.osgi.framework.log.FrameworkLogEntry;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.osgi.service.debug.DebugOptions;
-import org.eclipse.osgi.service.environment.EnvironmentInfo;
-import org.eclipse.osgi.service.resolver.PlatformAdmin;
-import org.eclipse.osgi.service.urlconversion.URLConverter;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.*;
-import org.osgi.service.packageadmin.PackageAdmin;
-import org.osgi.util.tracker.ServiceTracker;
-
-/**
- * Bootstrap class for the platform. It is responsible for setting up the
- * platform class loader and passing control to the actual application class
- */
-public final class InternalPlatform {
-
-	// Command line args as seen by the Eclipse runtime. allArgs does NOT
-	// include args consumed by the underlying framework (e.g., OSGi)
-	private static String[] allArgs = new String[0];
-	private static String[] appArgs = new String[0];
-	private static final String APPLICATION = "-application"; //$NON-NLS-1$	
-
-	private static final String[] ARCH_LIST = {Platform.ARCH_PA_RISC, //
-			Platform.ARCH_PPC, //
-			Platform.ARCH_SPARC, //
-			Platform.ARCH_X86, //
-			Platform.ARCH_AMD64, // 
-			Platform.ARCH_IA64, //
-			Platform.ARCH_IA64_32};
-	private static final String BOOT = "-boot"; //$NON-NLS-1$
-	private static final String CLASSLOADER_PROPERTIES = "-classloaderProperties"; //$NON-NLS-1$	
-
-	// debug support:  set in loadOptions()
-	public static boolean DEBUG = false;
-	public static boolean DEBUG_PLUGIN_PREFERENCES = false;
-
-	private static Runnable splashHandler = null;
-	private static final String FEATURE = "-feature"; //$NON-NLS-1$
-	private static final String FIRST_USE = "-firstUse"; //$NON-NLS-1$
-	private static String[] frameworkArgs = new String[0];
-
-	private static boolean initialized;
-	private static final String KEY_DOUBLE_PREFIX = "%%"; //$NON-NLS-1$
-
-	private static final String KEY_PREFIX = "%"; //$NON-NLS-1$
-	private static final String KEYRING = "-keyring"; //$NON-NLS-1$
-	private static String keyringFile;
-
-	//XXX This is not synchronized
-	private static Map logs = new HashMap(5);
-	private static final String NEW_UPDATES = "-newUpdates"; //$NON-NLS-1$
-
-	// obsolete command line args
-	private static final String NO_PACKAGE_PREFIXES = "-noPackagePrefixes"; //$NON-NLS-1$
-	private static final String NO_UPDATE = "-noUpdate"; //$NON-NLS-1$
-
-	private static final String[] OS_LIST = {Platform.OS_AIX, Platform.OS_HPUX, Platform.OS_LINUX, Platform.OS_MACOSX, Platform.OS_QNX, Platform.OS_SOLARIS, Platform.OS_WIN32};
-	private static String password = ""; //$NON-NLS-1$
-	private static final String PASSWORD = "-password"; //$NON-NLS-1$
-	private static PlatformLogWriter platformLog = null;
-
-	private static final String PLUGIN_PATH = ".plugin-path"; //$NON-NLS-1$
-	private static final String PLUGINS = "-plugins"; //$NON-NLS-1$
-
-	// command line options
-	private static final String PRODUCT = "-product"; //$NON-NLS-1$	
-	public static final String PROP_ADAPTOR = "osgi.adaptor"; //$NON-NLS-1$
-	public static final String PROP_APPLICATION = "eclipse.application"; //$NON-NLS-1$
-	public static final String PROP_ARCH = "osgi.arch"; //$NON-NLS-1$
-	public static final String PROP_CONFIG_AREA = "osgi.configuration.area"; //$NON-NLS-1$
-	public static final String PROP_CONSOLE = "osgi.console"; //$NON-NLS-1$
-	public static final String PROP_CONSOLE_CLASS = "osgi.consoleClass"; //$NON-NLS-1$
-	public static final String PROP_CONSOLE_LOG = "eclipse.consoleLog"; //$NON-NLS-1$
-	public static final String PROP_DEBUG = "osgi.debug"; //$NON-NLS-1$
-	public static final String PROP_DEV = "osgi.dev"; //$NON-NLS-1$
-	public static final String PROP_EXITCODE = "eclipse.exitcode"; //$NON-NLS-1$
-
-	// OSGI system properties.  Copied from EclipseStarter
-	public static final String PROP_INSTALL_AREA = "osgi.install.area"; //$NON-NLS-1$
-	public static final String PROP_INSTANCE_AREA = "osgi.instance.area"; //$NON-NLS-1$
-	public static final String PROP_MANIFEST_CACHE = "osgi.manifest.cache"; //$NON-NLS-1$
-	public static final String PROP_NL = "osgi.nl"; //$NON-NLS-1$
-	public static final String PROP_OS = "osgi.os"; //$NON-NLS-1$
-
-	// Eclipse System Properties
-	public static final String PROP_PRODUCT = "eclipse.product"; //$NON-NLS-1$
-	public static final String PROP_SYSPATH = "osgi.syspath"; //$NON-NLS-1$
-	public static final String PROP_USER_AREA = "osgi.user.area"; //$NON-NLS-1$
-	public static final String PROP_WS = "osgi.ws"; //$NON-NLS-1$
-	private static final InternalPlatform singleton = new InternalPlatform();
-
-	private static final String UPDATE = "-update"; //$NON-NLS-1$
-	private static final String[] WS_LIST = {Platform.WS_CARBON, Platform.WS_GTK, Platform.WS_MOTIF, Platform.WS_PHOTON, Platform.WS_WIN32};
-	private Path cachedInstanceLocation; // Cache the path of the instance location
-	private ServiceTracker configurationLocation = null;
-	private BundleContext context;
-
-	private Map groupProviders = new IdentityHashMap(3);
-	private ServiceTracker installLocation = null;
-	private ServiceTracker instanceLocation = null;
-	private boolean missingProductReported = false;
-	private IProduct product;
-	private AdapterManagerListener adapterManagerListener = null;
-	private String applicationId;
-	private Properties commandLineProperties = new Properties();
-
-	private Plugin runtimeInstance; // Keep track of the plugin object for runtime in case the backward compatibility is run.
-
-	private ServiceRegistration legacyPreferencesService = null;
-	private ServiceRegistration customPreferencesService = null;
-	private ServiceRegistration platformURLConverterService = null;
-
-	private ServiceTracker environmentTracker = null;
-	private ServiceTracker logTracker = null;
-	private ServiceTracker bundleTracker = null;
-	private ServiceTracker debugTracker = null;
-	private ServiceTracker contentTracker = null;
-	private ServiceTracker preferencesTracker = null;
-	private ServiceTracker productTracker = null;
-	private ServiceTracker userLocation = null;
-	private ServiceTracker groupProviderTracker = null;
-
-	public static InternalPlatform getDefault() {
-		return singleton;
-	}
-
-	/**
-	 * Private constructor to block instance creation.
-	 */
-	private InternalPlatform() {
-		super();
-	}
-
-	public void addAuthorizationInfo(URL serverUrl, String realm, String authScheme, Map info) throws CoreException {
-		AuthorizationHandler.addAuthorizationInfo(serverUrl, realm, authScheme, info);
-	}
-
-	/**
-	 * @see Platform#addLogListener(ILogListener)
-	 */
-	public void addLogListener(ILogListener listener) {
-		assertInitialized();
-		RuntimeLog.addLogListener(listener);
-	}
-
-	public void addProtectionSpace(URL resourceUrl, String realm) throws CoreException {
-		AuthorizationHandler.addProtectionSpace(resourceUrl, realm);
-	}
-
-	private void assertInitialized() {
-		//avoid the Policy.bind if assertion is true
-		if (!initialized)
-			Assert.isTrue(false, Messages.meta_appNotInit);
-	}
-
-	/**
-	 * @see Platform#endSplash()
-	 */
-	public void endSplash() {
-		final Runnable handler = splashHandler;
-		if (handler == null)
-			return;
-		//clear reference to handler to avoid calling it again and to avoid object leak
-		splashHandler = null;
-		SafeRunner.run(new ISafeRunnable() {
-			public void handleException(Throwable e) {
-				// just continue ... the exception has already been logged by
-				// handleException(ISafeRunnable)
-			}
-
-			public void run() throws Exception {
-				handler.run();
-			}
-		});
-	}
-
-	public void flushAuthorizationInfo(URL serverUrl, String realm, String authScheme) throws CoreException {
-		AuthorizationHandler.flushAuthorizationInfo(serverUrl, realm, authScheme);
-	}
-
-	/**
-	 * @see Platform#getAdapterManager()
-	 */
-	public IAdapterManager getAdapterManager() {
-		assertInitialized();
-		return AdapterManager.getDefault();
-	}
-
-	public String[] getApplicationArgs() {
-		return appArgs;
-	}
-
-	public String getApplicationId() {
-		if (applicationId != null)
-			return applicationId;
-
-		// try commandLineProperties
-		applicationId = commandLineProperties.getProperty(PROP_APPLICATION);
-		if (applicationId != null)
-			return applicationId;
-
-		// try bundleContext properties
-		applicationId = context.getProperty(PROP_APPLICATION);
-		if (applicationId != null)
-			return applicationId;
-
-		//Derive the application from the product information
-		IProduct eclipseProduct = getProduct();
-		if (eclipseProduct != null) {
-			applicationId = eclipseProduct.getApplication();
-		}
-		return applicationId;
-	}
-
-	public Map getAuthorizationInfo(URL serverUrl, String realm, String authScheme) {
-		return AuthorizationHandler.getAuthorizationInfo(serverUrl, realm, authScheme);
-	}
-
-	public boolean getBooleanOption(String option, boolean defaultValue) {
-		String value = getOption(option);
-		if (value == null)
-			return defaultValue;
-		return value.equalsIgnoreCase("true"); //$NON-NLS-1$
-	}
-
-	public Bundle getBundle(String symbolicName) {
-		PackageAdmin packageAdmin = getBundleAdmin();
-		if (packageAdmin == null)
-			return null;
-		Bundle[] bundles = packageAdmin.getBundles(symbolicName, null);
-		if (bundles == null)
-			return null;
-		//Return the first bundle that is not installed or uninstalled
-		for (int i = 0; i < bundles.length; i++) {
-			if ((bundles[i].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) {
-				return bundles[i];
-			}
-		}
-		return null;
-	}
-
-	public BundleContext getBundleContext() {
-		return context;
-	}
-
-	/**
-	 * Returns the bundle id of the bundle that contains the provided object, or
-	 * <code>null</code> if the bundle could not be determined.
-	 */
-	public String getBundleId(Object object) {
-		if (object == null)
-			return null;
-		PackageAdmin packageAdmin = getBundleAdmin();
-		if (packageAdmin == null)
-			return null;
-		Bundle source = packageAdmin.getBundle(object.getClass());
-		if (source != null && source.getSymbolicName() != null)
-			return source.getSymbolicName();
-		return null;
-	}
-
-	public IBundleGroupProvider[] getBundleGroupProviders() {
-		if (groupProviderTracker == null) {
-			// acquire the service and get the list of services
-			Filter filter = null;
-			try {
-				filter = getBundleContext().createFilter("(objectClass=" + IBundleGroupProvider.class.getName() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-			} catch (InvalidSyntaxException e) {
-				// ignore this, it should never happen
-			}
-			groupProviderTracker = new ServiceTracker(getBundleContext(), filter, null);
-			groupProviderTracker.open();
-		}
-		Object[] objectArray = groupProviderTracker.getServices();
-		if (objectArray == null) // getServices may return null; but we can not.
-			return new IBundleGroupProvider[0];
-		IBundleGroupProvider[] result = new IBundleGroupProvider[objectArray.length];
-		System.arraycopy(objectArray, 0, result, 0, objectArray.length);
-		return result;
-	}
-
-	public void registerBundleGroupProvider(IBundleGroupProvider provider) {
-		// get the bundle context and register the provider as a service
-		ServiceRegistration registration = getBundleContext().registerService(IBundleGroupProvider.class.getName(), provider, null);
-		// store the service registration (map provider -> registration)
-		synchronized (groupProviders) {
-			groupProviders.put(provider, registration);
-		}
-	}
-
-	public void unregisterBundleGroupProvider(IBundleGroupProvider provider) {
-		// get the service reference (map provider -> reference)
-		ServiceRegistration registration;
-		synchronized (groupProviders) {
-			registration = (ServiceRegistration) groupProviders.remove(provider);
-		}
-		if (registration == null)
-			return;
-		// unregister the provider
-		registration.unregister();
-	}
-
-	public Bundle[] getBundles(String symbolicName, String version) {
-		PackageAdmin packageAdmin = getBundleAdmin();
-		if (packageAdmin == null)
-			return null;
-		Bundle[] bundles = packageAdmin.getBundles(symbolicName, version);
-		if (bundles == null)
-			return null;
-		// optimize for common case; length==1
-		if (bundles.length == 1 && (bundles[0].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0)
-			return bundles;
-		//Remove all the bundes that are installed or uninstalled
-		Bundle[] selectedBundles = new Bundle[bundles.length];
-		int added = 0;
-		for (int i = 0; i < bundles.length; i++) {
-			if ((bundles[i].getState() & (Bundle.INSTALLED | Bundle.UNINSTALLED)) == 0) {
-				selectedBundles[added++] = bundles[i];
-			}
-		}
-		if (added == 0)
-			return null;
-
-		//return an array of the correct size
-		Bundle[] results = new Bundle[added];
-		System.arraycopy(selectedBundles, 0, results, 0, added);
-		return results;
-	}
-
-	public String[] getCommandLineArgs() {
-		return allArgs;
-	}
-
-	public Location getConfigurationLocation() {
-		assertInitialized();
-		return (Location) configurationLocation.getService();
-	}
-
-	/**
-	 * Lazy initialise ContentTypeManager - it can only be used after the registry is up and running
-	 */
-	public IContentTypeManager getContentTypeManager() {
-		if (contentTracker == null) {
-			contentTracker = new ServiceTracker(context, IContentTypeManager.class.getName(), null);
-			contentTracker.open();
-		}
-		return (IContentTypeManager) contentTracker.getService();
-	}
-
-	public EnvironmentInfo getEnvironmentInfoService() {
-		if (environmentTracker == null) {
-			environmentTracker = new ServiceTracker(context, EnvironmentInfo.class.getName(), null);
-			environmentTracker.open();
-		}
-		return (EnvironmentInfo) environmentTracker.getService();
-	}
-
-	public Bundle[] getFragments(Bundle bundle) {
-		PackageAdmin packageAdmin = getBundleAdmin();
-		if (packageAdmin == null)
-			return null;
-		return packageAdmin.getFragments(bundle);
-	}
-
-	public FrameworkLog getFrameworkLog() {
-		if (logTracker == null) {
-			logTracker = new ServiceTracker(context, FrameworkLog.class.getName(), null);
-			logTracker.open();
-		}
-		return (FrameworkLog) logTracker.getService();
-	}
-
-	public Bundle[] getHosts(Bundle bundle) {
-		PackageAdmin packageAdmin = getBundleAdmin();
-		if (packageAdmin == null)
-			return null;
-		return packageAdmin.getHosts(bundle);
-	}
-
-	public Location getInstallLocation() {
-		assertInitialized();
-		return (Location) installLocation.getService();
-	}
-
-	public URL getInstallURL() {
-		Location location = getInstallLocation();
-		// it is pretty much impossible for the install location to be null.  If it is, the
-		// system is in a bad way so throw and exception and get the heck outta here.
-		if (location == null)
-			throw new IllegalStateException("The installation location must not be null"); //$NON-NLS-1$
-		return location.getURL();
-	}
-
-	public Location getInstanceLocation() {
-		assertInitialized();
-		return (Location) instanceLocation.getService();
-	}
-
-	public int getIntegerOption(String option, int defaultValue) {
-		String value = getOption(option);
-		if (value == null)
-			return defaultValue;
-		try {
-			return Integer.parseInt(value);
-		} catch (NumberFormatException e) {
-			return defaultValue;
-		}
-	}
-
-	/**
-	 * @see Platform#getLocation()
-	 */
-	public IPath getLocation() throws IllegalStateException {
-		if (cachedInstanceLocation == null) {
-			Location location = getInstanceLocation();
-			if (location == null)
-				return null;
-			//	This makes the assumption that the instance location is a file: URL
-			File file = new File(location.getURL().getFile());
-			cachedInstanceLocation = new Path(file.toString());
-		}
-		return cachedInstanceLocation;
-	}
-
-	/**
-	 * Returns a log for the given plugin. Creates a new one if needed.
-	 */
-	public ILog getLog(Bundle bundle) {
-		ILog result = (ILog) logs.get(bundle);
-		if (result != null)
-			return result;
-		result = new Log(bundle);
-		logs.put(bundle, result);
-		return result;
-	}
-
-	public IPath getLogFileLocation() {
-		return getMetaArea().getLogLocation();
-	}
-
-	/**
-	 * Returns the object which defines the location and organization
-	 * of the platform's meta area.
-	 */
-	public DataArea getMetaArea() {
-		// TODO: derecate?
-		return MetaDataKeeper.getMetaArea();
-	}
-
-	public String getNL() {
-		return getBundleContext().getProperty(PROP_NL);
-	}
-
-	/**
-	 * @see Platform
-	 */
-	public String getOption(String option) {
-		DebugOptions options = getDebugOptions();
-		if (options != null)
-			return options.getOption(option);
-		return null;
-	}
-
-	public String getOS() {
-		return getBundleContext().getProperty(PROP_OS);
-	}
-
-	public String getOSArch() {
-		return getBundleContext().getProperty(PROP_ARCH);
-	}
-
-	public PlatformAdmin getPlatformAdmin() {
-		ServiceReference platformAdminReference = context.getServiceReference(PlatformAdmin.class.getName());
-		if (platformAdminReference == null)
-			return null;
-		return (PlatformAdmin) context.getService(platformAdminReference);
-	}
-
-	//TODO I guess it is now time to get rid of that
-	/*
-	 * This method is retained for R1.0 compatibility because it is defined as API.
-	 * It's function matches the API description (returns <code>null</code> when
-	 * argument URL is <code>null</code> or cannot be read).
-	 */
-	public URL[] getPluginPath(URL pluginPathLocation /*R1.0 compatibility*/
-	) {
-		InputStream input = null;
-		// first try and see if the given plugin path location exists.
-		if (pluginPathLocation == null)
-			return null;
-		try {
-			input = pluginPathLocation.openStream();
-		} catch (IOException e) {
-			//fall through
-		}
-
-		// if the given path was null or did not exist, look for a plugin path
-		// definition in the install location.
-		if (input == null)
-			try {
-				URL url = new URL(PlatformURLBaseConnection.PLATFORM_URL_STRING + PLUGIN_PATH);
-				input = url.openStream();
-			} catch (MalformedURLException e) {
-				//fall through
-			} catch (IOException e) {
-				//fall through
-			}
-
-		// nothing was found at the supplied location or in the install location
-		if (input == null)
-			return null;
-		// if we found a plugin path definition somewhere so read it and close the location.
-		URL[] result = null;
-		try {
-			try {
-				result = readPluginPath(input);
-			} finally {
-				input.close();
-			}
-		} catch (IOException e) {
-			//let it return null on failure to read
-		}
-		return result;
-	}
-
-	/**
-	 * 
-	 */
-	public IPreferencesService getPreferencesService() {
-		if (preferencesTracker == null) {
-			preferencesTracker = new ServiceTracker(context, IPreferencesService.class.getName(), null);
-			preferencesTracker.open();
-		}
-		return (IPreferencesService) preferencesTracker.getService();
-	}
-
-	/**
-	 * Look for the companion preference translation file for a group
-	 * of preferences.  This method will attempt to find a companion 
-	 * ".properties" file first.  This companion file can be in an
-	 * nl-specific directory for this plugin or any of its fragments or 
-	 * it can be in the root of this plugin or the root of any of the
-	 * plugin's fragments. This properties file can be used to translate
-	 * preference values.
-	 * 
-	 * TODO fix these comments
-	 * @param uniqueIdentifier the descriptor of the plugin
-	 *   who has the preferences
-	 * @param basePrefFileName the base name of the preference file
-	 *   This base will be used to construct the name of the 
-	 *   companion translation file.
-	 *   Example: If basePrefFileName is "plugin_customization",
-	 *   the preferences are in "plugin_customization.ini" and
-	 *   the translations are found in
-	 *   "plugin_customization.properties".
-	 * @return the properties file
-	 * 
-	 * @since 2.0
-	 */
-	public Properties getPreferenceTranslator(String uniqueIdentifier, String basePrefFileName) {
-		return new Properties();
-	}
-
-	public IProduct getProduct() {
-		if (product != null)
-			return product;
-
-		// try commandLineProperties
-		String productId = commandLineProperties.getProperty(PROP_PRODUCT);
-
-		if (productId == null) {
-			// try bundleContext properties
-			productId = context.getProperty(InternalPlatform.PROP_PRODUCT);
-			if (productId == null)
-				return null;
-		}
-		IConfigurationElement[] entries = InternalPlatform.getDefault().getRegistry().getConfigurationElementsFor(Platform.PI_RUNTIME, Platform.PT_PRODUCT, productId);
-		if (entries.length > 0) {
-			// There should only be one product with the given id so just take the first element
-			product = new Product(productId, entries[0]);
-			return product;
-		}
-		IConfigurationElement[] elements = InternalPlatform.getDefault().getRegistry().getConfigurationElementsFor(Platform.PI_RUNTIME, Platform.PT_PRODUCT);
-		List logEntries = null;
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
-			if (element.getName().equalsIgnoreCase("provider")) { //$NON-NLS-1$
-				try {
-					IProductProvider provider = (IProductProvider) element.createExecutableExtension("run"); //$NON-NLS-1$
-					IProduct[] products = provider.getProducts();
-					for (int j = 0; j < products.length; j++) {
-						IProduct provided = products[j];
-						if (provided.getId().equalsIgnoreCase(productId)) {
-							product = provided;
-							return product;
-						}
-					}
-				} catch (CoreException e) {
-					if (logEntries == null)
-						logEntries = new ArrayList(3);
-					logEntries.add(new FrameworkLogEntry(Platform.PI_RUNTIME, NLS.bind(Messages.provider_invalid, element.getParent().toString()), 0, e, null));
-				}
-			}
-		}
-		if (logEntries != null)
-			InternalPlatform.getDefault().getFrameworkLog().log(new FrameworkLogEntry(Platform.PI_RUNTIME, Messages.provider_invalid_general, 0, null, (FrameworkLogEntry[]) logEntries.toArray()));
-
-		if (!missingProductReported) {
-			InternalPlatform.getDefault().getFrameworkLog().log(new FrameworkLogEntry(Platform.PI_RUNTIME, NLS.bind(Messages.product_notFound, productId), 0, null, null));
-			missingProductReported = true;
-		}
-		return null;
-	}
-
-	public String getProtectionSpace(URL resourceUrl) {
-		return AuthorizationHandler.getProtectionSpace(resourceUrl);
-	}
-
-	public IExtensionRegistry getRegistry() {
-		return RegistryFactory.getRegistry(); 
-	}
-
-	public ResourceBundle getResourceBundle(Bundle bundle) {
-		return ResourceTranslator.getResourceBundle(bundle);
-	}
-
-	public String getResourceString(Bundle bundle, String value) {
-		return ResourceTranslator.getResourceString(bundle, value);
-	}
-
-	public String getResourceString(Bundle bundle, String value, ResourceBundle resourceBundle) {
-		return ResourceTranslator.getResourceString(bundle, value, resourceBundle);
-	}
-
-	public Plugin getRuntimeInstance() {
-		return runtimeInstance;
-	}
-
-	private Runnable getSplashHandler() {
-		ServiceReference[] ref;
-		try {
-			ref = context.getServiceReferences(Runnable.class.getName(), null);
-		} catch (InvalidSyntaxException e) {
-			return null;
-		}
-		// assumes the endInitializationHandler is available as a service
-		// see EclipseStarter.publishSplashScreen
-		for (int i = 0; i < ref.length; i++) {
-			String name = (String) ref[i].getProperty("name"); //$NON-NLS-1$
-			if (name != null && name.equals("splashscreen")) { //$NON-NLS-1$
-				Runnable result = (Runnable) context.getService(ref[i]);
-				context.ungetService(ref[i]);
-				return result;
-			}
-		}
-		return null;
-	}
-
-	public IPath getStateLocation(Bundle bundle) {
-		return getStateLocation(bundle, true);
-	}
-
-	public IPath getStateLocation(Bundle bundle, boolean create) throws IllegalStateException {
-		assertInitialized();
-		IPath result = getMetaArea().getStateLocation(bundle);
-		if (create)
-			result.toFile().mkdirs();
-		return result;
-	}
-
-	public long getStateTimeStamp() {
-		PlatformAdmin admin = getPlatformAdmin();
-		return admin == null ? -1 : admin.getState(false).getTimeStamp();
-	}
-
-	public Location getUserLocation() {
-		assertInitialized();
-		return (Location) userLocation.getService();
-	}
-
-	public String getWS() {
-		return getBundleContext().getProperty(PROP_WS);
-	}
-
-	/**
-	 * @return whether platform log writer has already been registered
-	 */
-	public boolean hasLogWriter() {
-		return platformLog != null && RuntimeLog.contains(platformLog);
-	}
-
-	private void initializeAuthorizationHandler() {
-		AuthorizationHandler.setKeyringFile(keyringFile);
-		AuthorizationHandler.setPassword(password);
-	}
-
-	/*
-	 * Finds and loads the options file 
-	 */
-	void initializeDebugFlags() {
-		// load runtime options
-		DEBUG = getBooleanOption(Platform.PI_RUNTIME + "/debug", false); //$NON-NLS-1$
-		if (DEBUG) {
-			DEBUG_PLUGIN_PREFERENCES = getBooleanOption(Platform.PI_RUNTIME + "/preferences/plugin", false); //$NON-NLS-1$
-		}
-	}
-
-	private void initializeLocationTrackers() {
-		Filter filter = null;
-		try {
-			filter = context.createFilter(Location.CONFIGURATION_FILTER);
-		} catch (InvalidSyntaxException e) {
-			// ignore this.  It should never happen as we have tested the above format.
-		}
-		configurationLocation = new ServiceTracker(context, filter, null);
-		configurationLocation.open();
-
-		try {
-			filter = context.createFilter(Location.USER_FILTER);
-		} catch (InvalidSyntaxException e) {
-			// ignore this.  It should never happen as we have tested the above format.
-		}
-		userLocation = new ServiceTracker(context, filter, null);
-		userLocation.open();
-
-		try {
-			filter = context.createFilter(Location.INSTANCE_FILTER);
-		} catch (InvalidSyntaxException e) {
-			// ignore this.  It should never happen as we have tested the above format.
-		}
-		instanceLocation = new ServiceTracker(context, filter, null);
-		instanceLocation.open();
-
-		try {
-			filter = context.createFilter(Location.INSTALL_FILTER);
-		} catch (InvalidSyntaxException e) {
-			// ignore this.  It should never happen as we have tested the above format.
-		}
-		installLocation = new ServiceTracker(context, filter, null);
-		installLocation.open();
-	}
-
-	public boolean isFragment(Bundle bundle) {
-		PackageAdmin packageAdmin = getBundleAdmin();
-		if (packageAdmin == null)
-			return false;
-		return (packageAdmin.getBundleType(bundle) & PackageAdmin.BUNDLE_TYPE_FRAGMENT) > 0;
-	}
-
-	public boolean isRunning() {
-		try {
-			return initialized && context.getBundle().getState() == Bundle.ACTIVE;
-		} catch (IllegalStateException e) {
-			return false;
-		}
-	}
-
-	/**
-	 * Returns a list of known system architectures.
-	 * 
-	 * @return the list of system architectures known to the system
-	 */
-	public String[] knownOSArchValues() {
-		return ARCH_LIST;
-	}
-
-	/**
-	 * Returns a list of known operating system names.
-	 * 
-	 * @return the list of operating systems known to the system
-	 */
-	public String[] knownOSValues() {
-		return OS_LIST;
-	}
-
-	/**
-	 * Returns a list of known windowing system names.
-	 * 
-	 * @return the list of window systems known to the system
-	 */
-	public String[] knownWSValues() {
-		return WS_LIST;
-	}
-
-	/**
-	 * Notifies all listeners of the platform log.  This includes the console log, if 
-	 * used, and the platform log file.  All Plugin log messages get funnelled
-	 * through here as well.
-	 */
-	public void log(final IStatus status) {
-		// TODO: derecate?
-		RuntimeLog.log(status);
-	}
-
-	private String[] processCommandLine(String[] args) {
-		if (args == null)
-			return args;
-		allArgs = args;
-		if (args.length == 0)
-			return args;
-
-		int[] configArgs = new int[args.length];
-		//need to initialize the first element to something that could not be an index.
-		configArgs[0] = -1;
-		int configArgIndex = 0;
-		for (int i = 0; i < args.length; i++) {
-			boolean found = false;
-			// check for args without parameters (i.e., a flag arg)
-
-			// consume obsolete args
-			if (args[i].equalsIgnoreCase(CLASSLOADER_PROPERTIES))
-				found = true; // ignored
-			if (args[i].equalsIgnoreCase(NO_PACKAGE_PREFIXES))
-				found = true; // ignored
-			if (args[i].equalsIgnoreCase(PLUGINS))
-				found = true; // ignored
-			if (args[i].equalsIgnoreCase(FIRST_USE))
-				found = true; // ignored
-			if (args[i].equalsIgnoreCase(NO_UPDATE))
-				found = true; // ignored
-			if (args[i].equalsIgnoreCase(NEW_UPDATES))
-				found = true; // ignored
-			if (args[i].equalsIgnoreCase(UPDATE))
-				found = true; // ignored
-
-			// done checking for args.  Remember where an arg was found 
-			if (found) {
-				configArgs[configArgIndex++] = i;
-				continue;
-			}
-			// check for args with parameters
-			if (i == args.length - 1 || args[i + 1].startsWith("-")) //$NON-NLS-1$
-				continue;
-			String arg = args[++i];
-
-			// look for the keyring file
-			if (args[i - 1].equalsIgnoreCase(KEYRING)) {
-				keyringFile = arg;
-				found = true;
-			}
-
-			// look for the user password.  
-			if (args[i - 1].equalsIgnoreCase(PASSWORD)) {
-				password = arg;
-				found = true;
-			}
-
-			// look for the product to run
-			// treat -feature as a synonym for -product for compatibility.
-			if (args[i - 1].equalsIgnoreCase(PRODUCT) || args[i - 1].equalsIgnoreCase(FEATURE)) {
-				// use the long way to set the property to compile against eeminimum
-				commandLineProperties.setProperty(PROP_PRODUCT, arg);
-				found = true;
-			}
-
-			// look for the application to run.  
-			if (args[i - 1].equalsIgnoreCase(APPLICATION)) {
-				// use the long way to set the property to compile against eeminimum
-				commandLineProperties.setProperty(PROP_APPLICATION, arg);
-				found = true;
-			}
-
-			// consume obsolete args for compatibilty
-			if (args[i - 1].equalsIgnoreCase(CLASSLOADER_PROPERTIES))
-				found = true; // ignore
-			if (args[i - 1].equalsIgnoreCase(BOOT))
-				found = true; // ignore
-
-			// done checking for args.  Remember where an arg was found 
-			if (found) {
-				configArgs[configArgIndex++] = i - 1;
-				configArgs[configArgIndex++] = i;
-			}
-		}
-
-		// remove all the arguments consumed by this argument parsing
-		if (configArgIndex == 0) {
-			appArgs = args;
-			return args;
-		}
-		appArgs = new String[args.length - configArgIndex];
-		frameworkArgs = new String[configArgIndex];
-		configArgIndex = 0;
-		int j = 0;
-		int k = 0;
-		for (int i = 0; i < args.length; i++) {
-			if (i == configArgs[configArgIndex]) {
-				frameworkArgs[k++] = args[i];
-				configArgIndex++;
-			} else
-				appArgs[j++] = args[i];
-		}
-		return appArgs;
-	}
-
-	private URL[] readPluginPath(InputStream input) {
-		Properties ini = new Properties();
-		try {
-			ini.load(input);
-		} catch (IOException e) {
-			return null;
-		}
-		Vector result = new Vector(5);
-		for (Enumeration groups = ini.propertyNames(); groups.hasMoreElements();) {
-			String group = (String) groups.nextElement();
-			for (StringTokenizer entries = new StringTokenizer(ini.getProperty(group), ";"); entries.hasMoreElements();) { //$NON-NLS-1$
-				String entry = (String) entries.nextElement();
-				if (!entry.equals("")) //$NON-NLS-1$
-					try {
-						result.addElement(new URL(entry));
-					} catch (MalformedURLException e) {
-						//intentionally ignore bad URLs
-						System.err.println("Ignoring plugin: " + entry); //$NON-NLS-1$
-					}
-			}
-		}
-		return (URL[]) result.toArray(new URL[result.size()]);
-	}
-
-	/**
-	 * @see Platform#removeLogListener(ILogListener)
-	 */
-	public void removeLogListener(ILogListener listener) {
-		assertInitialized();
-		RuntimeLog.removeLogListener(listener);
-	}
-
-	public void setOption(String option, String value) {
-		DebugOptions options = getDebugOptions();
-		if (options != null)
-			options.setOption(option, value);
-	}
-
-	//Those two methods are only used to register runtime once compatibility has been started.
-	public void setRuntimeInstance(Plugin runtime) {
-		runtimeInstance = runtime;
-	}
-
-	/**
-	 * Internal method for starting up the platform.  The platform is not started with any location
-	 * and should not try to access the instance data area.
-	 * 
-	 * Note: the content type manager must be initialized only after the registry has been created
-	 */
-	public void start(BundleContext runtimeContext) {
-		this.context = runtimeContext;
-		initializeLocationTrackers();
-		splashHandler = getSplashHandler();
-		processCommandLine(getEnvironmentInfoService().getNonFrameworkArgs());
-		initializeDebugFlags();
-		initialized = true;
-		getMetaArea();
-		initializeAuthorizationHandler();
-		platformLog = new PlatformLogWriter(getFrameworkLog());
-		addLogListener(platformLog);
-		adapterManagerListener = new AdapterManagerListener(); // after extension registry
-		startServices();
-	}
-
-	/**
-	 * Shutdown runtime pieces in this order:
-	 * Content[auto shutdown] -> Preferences[auto shutdown] -> Registry -> Jobs
-	 * The "auto" shutdown takes place before this code is executed
-	 */
-	public void stop(BundleContext bundleContext) {
-		assertInitialized();
-		stopServices(); // should be done after preferences shutdown
-		if (adapterManagerListener != null)
-			adapterManagerListener.stop(); // before extension registry
-		RuntimeLog.removeLogListener(platformLog); // effectively turns the platform logging off
-		initialized = false;
-		closeOSGITrackers();
-		context = null;
-	}
-
-	/**
-	 * Takes a preference value and a related resource bundle and
-	 * returns the translated version of this value (if one exists).
-	 * 
-	 * TODO: fix these comments
-	 * @param value the preference value for potential translation
-	 * @param props the properties containing the translated values
-	 * 
-	 * @since 2.0
-	 */
-	public String translatePreference(String value, Properties props) {
-		value = value.trim();
-		if (props == null || value.startsWith(KEY_DOUBLE_PREFIX))
-			return value;
-		if (value.startsWith(KEY_PREFIX)) {
-
-			int ix = value.indexOf(" "); //$NON-NLS-1$
-			String key = ix == -1 ? value : value.substring(0, ix);
-			String dflt = ix == -1 ? value : value.substring(ix + 1);
-			return props.getProperty(key.substring(1), dflt);
-		}
-		return value;
-	}
-
-	private void startServices() {
-		customPreferencesService = getBundleContext().registerService(IProductPreferencesService.class.getName(), new ProductPreferencesService(), new Hashtable());
-		legacyPreferencesService = getBundleContext().registerService(ILegacyPreferences.class.getName(), new InitLegacyPreferences(), new Hashtable());
-
-		Dictionary urlProperties = new Hashtable();
-		urlProperties.put("protocol", "platform"); //$NON-NLS-1$ //$NON-NLS-2$
-		platformURLConverterService = context.registerService(URLConverter.class.getName(), new PlatformURLConverter(), urlProperties);
-	}
-
-	private void stopServices() {
-		if (legacyPreferencesService != null) {
-			legacyPreferencesService.unregister();
-			legacyPreferencesService = null;
-		}
-		if (customPreferencesService != null) {
-			customPreferencesService.unregister();
-			customPreferencesService = null;
-		}
-		if (platformURLConverterService != null) {
-			platformURLConverterService.unregister();
-			platformURLConverterService = null;
-		}
-	}
-
-	private PackageAdmin getBundleAdmin() {
-		if (bundleTracker == null) {
-			bundleTracker = new ServiceTracker(context, PackageAdmin.class.getName(), null);
-			bundleTracker.open();
-		}
-		return (PackageAdmin) bundleTracker.getService();
-	}
-
-	private DebugOptions getDebugOptions() {
-		if (debugTracker == null) {
-			if (context == null)
-				return null;
-			debugTracker = new ServiceTracker(context, DebugOptions.class.getName(), null);
-			debugTracker.open();
-		}
-		return (DebugOptions) debugTracker.getService();
-	}
-
-	private void closeOSGITrackers() {
-		if (productTracker != null) {
-			productTracker.close();
-			productTracker = null;
-		}
-		if (preferencesTracker != null) {
-			preferencesTracker.close();
-			preferencesTracker = null;
-		}
-		if (contentTracker != null) {
-			contentTracker.close();
-			contentTracker = null;
-		}
-		if (debugTracker != null) {
-			debugTracker.close();
-			debugTracker = null;
-		}
-		if (bundleTracker != null) {
-			bundleTracker.close();
-			bundleTracker = null;
-		}
-		if (logTracker != null) {
-			logTracker.close();
-			logTracker = null;
-		}
-		if (groupProviderTracker != null) {
-			groupProviderTracker.close();
-			groupProviderTracker = null;
-		}
-		if (environmentTracker != null) {
-			environmentTracker.close();
-			environmentTracker = null;
-		}
-	}
-
-	/**
-	 * Print a debug message to the console. 
-	 * Pre-pend the message with the current date and the name of the current thread.
-	 */
-	public static void message(String message) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(new Date(System.currentTimeMillis()));
-		buffer.append(" - ["); //$NON-NLS-1$
-		buffer.append(Thread.currentThread().getName());
-		buffer.append("] "); //$NON-NLS-1$
-		buffer.append(message);
-		System.out.println(buffer.toString());
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Log.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Log.java
deleted file mode 100644
index c804679..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Log.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.core.runtime.*;
-import org.osgi.framework.Bundle;
-
-/**
- * 
- */
-public class Log implements ILog {
-	Bundle bundle;
-	Set logListeners = new HashSet(5);
-
-	public Log(Bundle plugin) {
-		this.bundle = plugin;
-	}
-
-	/**
-	 * Adds the given log listener to this log.  Subsequently the log listener will
-	 * receive notification of all log events passing through this log.
-	 *
-	 * @see Platform#addLogListener(ILogListener)
-	 */
-	public void addLogListener(ILogListener listener) {
-		synchronized (logListeners) {
-			logListeners.add(listener);
-		}
-	}
-
-	/**
-	 * Returns the plug-in with which this log is associated.
-	 */
-	public Bundle getBundle() {
-		return bundle;
-	}
-
-	/**
-	 * Logs the given status.  The status is distributed to the log listeners
-	 * installed on this log and then to the log listeners installed on the platform.
-	 *
-	 * @see Plugin#getLog()
-	 */
-	public void log(final IStatus status) {
-		// Log to the platform log first in case a listener throws an error.
-		InternalPlatform.getDefault().log(status);
-		// create array to avoid concurrent access
-		ILogListener[] listeners;
-		synchronized (logListeners) {
-			listeners = (ILogListener[]) logListeners.toArray(new ILogListener[logListeners.size()]);
-		}
-		for (int i = 0; i < listeners.length; i++) {
-			final ILogListener listener = listeners[i];
-			ISafeRunnable code = new ISafeRunnable() {
-				public void run() throws Exception {
-					listener.logging(status, bundle.getSymbolicName());
-				}
-
-				public void handleException(Throwable e) {
-					//Ignore
-				}
-			};
-			SafeRunner.run(code);
-		}
-	}
-
-	/**
-	 * Removes the given log listener to this log.  Subsequently the log listener will
-	 * no longer receive notification of log events passing through this log.
-	 *
-	 * @see Platform#removeLogListener(ILogListener)
-	 */
-	public void removeLogListener(ILogListener listener) {
-		synchronized (logListeners) {
-			logListeners.remove(listener);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Messages.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Messages.java
deleted file mode 100644
index e777254..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Messages.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import org.eclipse.osgi.util.NLS;
-
-// Runtime plugin message catalog
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.core.internal.runtime.messages"; //$NON-NLS-1$
-
-	// Adapter manager
-	public static String adapters_badAdapterFactory;
-
-	// application
-	public static String application_invalidExtension;
-	public static String application_noIdFound;
-	public static String application_notFound;
-	public static String application_returned;
-
-	// line separator platforms
-	public static String line_separator_platform_mac_os_9;
-	public static String line_separator_platform_unix;
-	public static String line_separator_platform_windows;
-
-	// metadata
-	public static String meta_appNotInit;
-	public static String meta_authFormatChanged;
-	public static String meta_exceptionParsingLog;
-	public static String meta_keyringFileAlreadySpecified;
-
-	// Extension Registry
-	public static String meta_unableToReadAuthorization;
-	public static String meta_unableToWriteAuthorization;
-
-	// parsing/resolve
-	public static String plugin_deactivatedLoad;
-
-	// plugins
-	public static String plugin_shutdownProblems;
-	public static String plugin_startupProblems;
-
-	// Preferences
-	public static String preferences_saveProblems;
-
-	// Product
-	public static String product_notFound;
-	public static String provider_invalid;
-	public static String provider_invalid_general;
-
-	// URL
-	public static String url_badVariant;
-	public static String url_createConnection;
-	public static String url_invalidURL;
-	public static String url_noaccess;
-	public static String url_noOutput;
-	public static String url_resolveFragment;
-	public static String url_resolvePlugin;
-
-	// Compatibility - parsing/resolve
-	public static String parse_badPrereqOnFrag;
-	public static String parse_duplicateFragment;
-	public static String parse_duplicateLib;
-	public static String parse_internalStack;
-	public static String parse_unknownElement;
-	public static String parse_unknownTopElement;
-	public static String parse_unknownAttribute;
-	public static String parse_error;
-	public static String parse_errorProcessing;
-	public static String parse_errorNameLineColumn;
-	public static String parse_validExport;
-	public static String parse_validMatch;
-	public static String parse_unknownLibraryType;
-	public static String parse_nullFragmentIdentifier;
-	public static String parse_nullPluginIdentifier;
-	public static String parse_duplicatePlugin;
-	public static String parse_unknownEntry;
-	public static String parse_missingPluginId;
-	public static String parse_missingPluginName;
-	public static String parse_missingFPName;
-	public static String parse_missingFPVersion;
-	public static String parse_missingPluginVersion;
-	public static String parse_fragmentMissingAttr;
-	public static String parse_pluginMissingAttr;
-	public static String parse_pluginMissingIdName;
-	public static String parse_fragmentMissingIdName;
-	public static String parse_missingFragmentPd;
-	public static String parse_extPointDisabled;
-	public static String parse_extPointUnknown;
-	public static String parse_unsatisfiedOptPrereq;
-	public static String parse_unsatisfiedPrereq;
-	public static String parse_prereqDisabled;
-	public static String parse_prereqLoop;
-	public static String parse_prereqOptLoop;
-
-	// Compatibility - plugins
-	public static String plugin_notPluginClass;
-	public static String plugin_unableToResolve;
-	public static String plugin_pluginDisabled;
-	public static String plugin_instantiateClassError;
-	public static String plugin_loadClassError;
-
-	static {
-		// load message values from bundle file
-		reloadMessages();
-	}
-
-	public static void reloadMessages() {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PerformanceStatsProcessor.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PerformanceStatsProcessor.java
deleted file mode 100644
index 3d0c1ea..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PerformanceStatsProcessor.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of 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.runtime;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.PerformanceStats.PerformanceListener;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.osgi.framework.log.FrameworkLog;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Processes, records, and performs notification of performance events
- * that occur in the system.
- */
-public class PerformanceStatsProcessor extends Job {
-	private static final PerformanceStatsProcessor instance = new PerformanceStatsProcessor();
-
-	private static final long SCHEDULE_DELAY = 2000;
-
-	/**
-	 * Events that have occurred but have not yet been broadcast.
-	 */
-	private final ArrayList changes = new ArrayList();
-
-	/**
-	 * Event failures that have occurred but have not yet been broadcast.
-	 * Maps (PerformanceStats -> Long).
-	 */
-	private final HashMap failures = new HashMap();
-
-	/**
-	 * Event listeners.
-	 */
-	private final org.eclipse.core.runtime.ListenerList listeners = new org.eclipse.core.runtime.ListenerList();
-
-	private PlatformLogWriter log;
-
-	/*
-	 * @see PerformanceStats#addListener
-	 */
-	public static void addListener(PerformanceListener listener) {
-		instance.listeners.add(listener);
-	}
-
-	/**
-	 * Records the fact that an event occurred.
-	 * 
-	 * @param stats The event that occurred
-	 */
-	public static void changed(PerformanceStats stats) {
-		synchronized (instance) {
-			instance.changes.add(stats);
-		}
-		instance.schedule(SCHEDULE_DELAY);
-	}
-
-	/**
-	 * Records the fact that an event failed.
-	 * 
-	 * @param stats The event that occurred
-	 * @param pluginId The id of the plugin that declared the blame object, or
-	 * <code>null</code>
-	 * @param elapsed The elapsed time for this failure
-	 */
-	public static void failed(PerformanceStats stats, String pluginId, long elapsed) {
-		synchronized (instance) {
-			instance.failures.put(stats, new Long(elapsed));
-		}
-		instance.schedule(SCHEDULE_DELAY);
-		instance.logFailure(stats, pluginId, elapsed);
-	}
-
-	/*
-	 * @see PerformanceStats#printStats(PrintWriter)
-	 */
-	public static void printStats(PrintWriter out) {
-		/* gather totals */
-		long totalTime = 0;
-		int totalCount = 0;
-		PerformanceStats[] allStats = PerformanceStats.getAllStats();
-		for (int i = 0; i < allStats.length; i++) {
-			PerformanceStats stats = allStats[i];
-			totalTime += stats.getRunningTime();
-			totalCount += stats.getRunCount();
-		}
-		//dump stats
-		out.println("---------------------------------------------------------------"); //$NON-NLS-1$
-		for (int i = 0; i < allStats.length; i++) {
-			PerformanceStats stats = allStats[i];
-			out.print("Event: "); //$NON-NLS-1$
-			out.print(stats.getEvent());
-			out.print(" Blame: "); //$NON-NLS-1$
-			out.print(stats.getBlameString());
-			if (stats.getContext() != null) {
-				out.print(" Context: "); //$NON-NLS-1$
-				out.print(stats.getContext());
-			}
-			out.println();
-
-			int runCount = stats.getRunCount();
-			if (runCount > 0) {
-				out.print("Run count: "); //$NON-NLS-1$
-				out.print(Integer.toString(runCount));
-				out.print(" ("); //$NON-NLS-1$
-				out.print(Integer.toString((int) (runCount * 100.0 / totalCount)));
-				out.println(" % of total)"); //$NON-NLS-1$
-			}
-
-			long runTime = stats.getRunningTime();
-			if (runTime > 0) {
-				out.print("Duration (ms): "); //$NON-NLS-1$
-				out.print(Long.toString(runTime));
-				out.print(" ("); //$NON-NLS-1$
-				out.print(Integer.toString((int) (runTime * 100.0 / totalTime)));
-				out.println(" % of total)"); //$NON-NLS-1$
-			}
-			out.println(""); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * @see PerformanceStats#removeListener
-	 */
-	public static void removeListener(PerformanceListener listener) {
-		instance.listeners.remove(listener);
-	}
-
-	/**
-	 * Private constructor to enforce singleton usage.
-	 */
-	private PerformanceStatsProcessor() {
-		super("Performance Stats"); //$NON-NLS-1$
-		setSystem(true);
-		setPriority(DECORATE);
-		BundleContext context = PlatformActivator.getContext();
-		String filter = '(' + FrameworkLog.SERVICE_PERFORMANCE + '=' + Boolean.TRUE.toString() + ')';
-		ServiceReference[] references;
-		FrameworkLog perfLog = null;
-		try {
-			references = context.getServiceReferences(FrameworkLog.class.getName(), filter);
-			if (references != null && references.length > 0) {
-				//just take the first matching service
-				perfLog = (FrameworkLog) context.getService(references[0]);
-				//make sure correct location is set
-				IPath logLocation = Platform.getLogFileLocation();
-				logLocation = logLocation.removeLastSegments(1).append("performance.log"); //$NON-NLS-1$
-				perfLog.setFile(logLocation.toFile(), false);
-			}
-		} catch (Exception e) {
-			IStatus error = new Status(IStatus.ERROR, Platform.PI_RUNTIME, 1, "Error loading performance log", e); //$NON-NLS-1$
-			InternalPlatform.getDefault().log(error);
-		}
-		//use the platform log if we couldn't create the performance log
-		if (perfLog == null)
-			perfLog = InternalPlatform.getDefault().getFrameworkLog();
-		log = new PlatformLogWriter(perfLog);
-	}
-
-	/**
-	 * Logs performance event failures to the platform's performance log
-	 */
-	private void logFailure(PerformanceStats stats, String pluginId, long elapsed) {
-		//may have failed to get the performance log service
-		if (log == null)
-			return;
-		if (pluginId == null)
-			pluginId = Platform.PI_RUNTIME;
-		String msg = "Performance failure: " + stats.getEvent() + " blame: " + stats.getBlameString() + " context: " + stats.getContext() + " duration: " + elapsed; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		log.logging(new Status(IStatus.WARNING, pluginId, 1, msg, new RuntimeException()), pluginId);
-	}
-
-	/*
-	 * @see Job#run(IProgressMonitor)
-	 */
-	protected IStatus run(IProgressMonitor monitor) {
-		PerformanceStats[] events;
-		PerformanceStats[] failedEvents;
-		Long[] failedTimes;
-		synchronized (this) {
-			events = (PerformanceStats[]) changes.toArray(new PerformanceStats[changes.size()]);
-			changes.clear();
-			failedEvents = (PerformanceStats[]) failures.keySet().toArray(new PerformanceStats[failures.size()]);
-			failedTimes = (Long[]) failures.values().toArray(new Long[failures.size()]);
-			failures.clear();
-		}
-
-		//notify performance listeners
-		Object[] toNotify = listeners.getListeners();
-		for (int i = 0; i < toNotify.length; i++) {
-			final PerformanceStats.PerformanceListener listener = ((PerformanceStats.PerformanceListener) toNotify[i]);
-			if (events.length > 0)
-				listener.eventsOccurred(events);
-			for (int j = 0; j < failedEvents.length; j++)
-				listener.eventFailed(failedEvents[j], failedTimes[j].longValue());
-		}
-		schedule(SCHEDULE_DELAY);
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * @see Job#shouldRun()
-	 */
-	public boolean shouldRun() {
-		return !changes.isEmpty() || !failures.isEmpty();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformActivator.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformActivator.java
deleted file mode 100644
index 1f773ff..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformActivator.java
+++ /dev/null
@@ -1,119 +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
- *     Julian Chen - fix for bug #92572, jclRM
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.util.Hashtable;
-import org.eclipse.core.internal.boot.PlatformURLBaseConnection;
-import org.eclipse.core.internal.boot.PlatformURLHandler;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.service.runnable.ParameterizedRunnable;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.*;
-import org.osgi.service.url.URLConstants;
-import org.osgi.service.url.URLStreamHandlerService;
-
-/**
- * Activator for the Eclipse runtime.
- */
-public class PlatformActivator extends Plugin implements BundleActivator {
-	private static final String PROP_ECLIPSE_EXITCODE = "eclipse.exitcode"; //$NON-NLS-1$
-	private static final String PROP_ECLIPSE_APPLICATION = "eclipse.application"; //$NON-NLS-1$
-
-	private static BundleContext context;
-	private ServiceRegistration entryLocatorRegistration;
-
-	public static BundleContext getContext() {
-		return context;
-	}
-
-	public void start(BundleContext runtimeContext) throws Exception {
-		PlatformActivator.context = runtimeContext;
-		InternalPlatform.getDefault().start(runtimeContext);
-		installPlatformURLSupport();
-		registerApplicationService();
-		InternalPlatform.getDefault().setRuntimeInstance(this);
-		super.start(runtimeContext);
-	}
-
-	/**
-	 * Register the platform URL support as a service to the URLHandler service
-	 */
-	private void installPlatformURLSupport() {
-		PlatformURLPluginConnection.startup();
-		PlatformURLFragmentConnection.startup();
-		PlatformURLMetaConnection.startup();
-		PlatformURLConfigConnection.startup();
-
-		PlatformURLBaseConnection.startup(InternalPlatform.getDefault().getInstallURL());
-
-		Hashtable properties = new Hashtable(1);
-		properties.put(URLConstants.URL_HANDLER_PROTOCOL, new String[] {PlatformURLHandler.PROTOCOL});
-		context.registerService(URLStreamHandlerService.class.getName(), new PlatformURLHandler(), properties);
-	}
-
-	public void stop(BundleContext runtimeContext) {
-		// unregister the EntryLocator to prevent the Framework from calling it
-		unregisterEntryLocator();
-		// Stop the platform orderly.		
-		InternalPlatform.getDefault().stop(runtimeContext);
-		InternalPlatform.getDefault().setRuntimeInstance(null);
-	}
-
-	private void registerApplicationService() {
-		ParameterizedRunnable work = new ParameterizedRunnable() {
-			public Object run(Object arg) throws Exception {
-				IPlatformRunnable application = null;
-				String applicationId = InternalPlatform.getDefault().getApplicationId();
-				if (applicationId == null)
-					throw new RuntimeException(Messages.application_noIdFound);
-				IExtensionRegistry registry = InternalPlatform.getDefault().getRegistry();
-				IExtension applicationExtension = registry.getExtension(Platform.PI_RUNTIME, Platform.PT_APPLICATIONS, applicationId);
-				if (applicationExtension == null) {
-					IExtension[] availableApps = registry.getExtensionPoint(Platform.PI_RUNTIME + '.' + Platform.PT_APPLICATIONS).getExtensions();
-					String availableAppsString = "<NONE>"; //$NON-NLS-1$
-					if (availableApps.length != 0) {
-						availableAppsString = availableApps[0].getUniqueIdentifier();
-						for (int i = 1; i < availableApps.length; i++) {
-							availableAppsString = availableAppsString + ", " + availableApps[i].getUniqueIdentifier(); //$NON-NLS-1$
-						}
-					}
-					throw new RuntimeException(NLS.bind(Messages.application_notFound, applicationId, availableAppsString));
-				}
-				IConfigurationElement[] configs = applicationExtension.getConfigurationElements();
-				if (configs.length == 0)
-					throw new RuntimeException(NLS.bind(Messages.application_invalidExtension, applicationId));
-				IConfigurationElement config = configs[0];
-				application = (IPlatformRunnable) config.createExecutableExtension("run"); //$NON-NLS-1$
-				// if the given arg is null the pass in the left over command line args.
-				if (arg == null)
-					arg = InternalPlatform.getDefault().getApplicationArgs();
-				Object result = application.run(arg);
-				int exitCode = result instanceof Integer ? ((Integer) result).intValue() : 0;
-				// use the long way to set the property to compile against eeminimum
-				System.getProperties().setProperty(PROP_ECLIPSE_EXITCODE, Integer.toString(exitCode));
-				if (InternalPlatform.DEBUG)
-					System.out.println(NLS.bind(Messages.application_returned, (new String[] {applicationId, result == null ? "null" : result.toString()}))); //$NON-NLS-1$
-				return result;
-			}
-		};
-		Hashtable properties = new Hashtable(1);
-		properties.put(PROP_ECLIPSE_APPLICATION, "default"); //$NON-NLS-1$ 
-		context.registerService(ParameterizedRunnable.class.getName(), work, properties);
-	}
-
-	private void unregisterEntryLocator() {
-		if (entryLocatorRegistration != null) {
-			entryLocatorRegistration.unregister();
-			entryLocatorRegistration = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformLogWriter.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformLogWriter.java
deleted file mode 100644
index 7f65458..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformLogWriter.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.core.internal.runtime;
-
-import java.util.ArrayList;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.framework.log.FrameworkLog;
-import org.eclipse.osgi.framework.log.FrameworkLogEntry;
-
-/**
- * A log writer that writes log entries.  
- * See PlatformLogReader for reading logs back into memory.
- * <p>
- * Note that this class just provides a bridge from the old ILog interface
- * to the OSGi FrameworkLog interface.
- */
-public class PlatformLogWriter implements ILogListener {
-	private final FrameworkLog frameworkLog;
-
-	public PlatformLogWriter(FrameworkLog frameworkLog) {
-		this.frameworkLog = frameworkLog;
-	}
-
-	/**
-	 * @see ILogListener#logging(IStatus, String)
-	 */
-	public synchronized void logging(IStatus status, String plugin) {
-		frameworkLog.log(getLog(status));
-	}
-
-	protected FrameworkLogEntry getLog(IStatus status) {
-		Throwable t = status.getException();
-		ArrayList childlist = new ArrayList();
-
-		int stackCode = t instanceof CoreException ? 1 : 0;
-		// ensure a substatus inside a CoreException is properly logged 
-		if (stackCode == 1) {
-			IStatus coreStatus = ((CoreException) t).getStatus();
-			if (coreStatus != null) {
-				childlist.add(getLog(coreStatus));
-			}
-		}
-
-		if (status.isMultiStatus()) {
-			IStatus[] children = status.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				childlist.add(getLog(children[i]));
-			}
-		}
-
-		FrameworkLogEntry[] children = (FrameworkLogEntry[]) (childlist.size() == 0 ? null : childlist.toArray(new FrameworkLogEntry[childlist.size()]));
-
-		return new FrameworkLogEntry(status.getPlugin(), status.getSeverity(), status.getCode(), status.getMessage(), stackCode, t, children);
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLConfigConnection.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLConfigConnection.java
deleted file mode 100644
index 143c264..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLConfigConnection.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.core.internal.runtime;
-
-import java.io.*;
-import java.net.URL;
-import java.net.UnknownServiceException;
-import org.eclipse.core.internal.boot.PlatformURLConnection;
-import org.eclipse.core.internal.boot.PlatformURLHandler;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.osgi.util.NLS;
-
-public class PlatformURLConfigConnection extends PlatformURLConnection {
-	private static final String FILE_PROTOCOL = "file"; //$NON-NLS-1$
-	private static boolean isRegistered = false;
-	public static final String CONFIG = "config"; //$NON-NLS-1$
-
-	private boolean parentConfiguration = false;
-
-	/**
-	 * @param url
-	 */
-	public PlatformURLConfigConnection(URL url) {
-		super(url);
-	}
-
-	protected URL resolve() throws IOException {
-		String spec = url.getFile().trim();
-		if (spec.startsWith("/")) //$NON-NLS-1$
-			spec = spec.substring(1);
-		if (!spec.startsWith(CONFIG))
-			throw new IOException(NLS.bind(Messages.url_badVariant, url.toString()));
-		String path = spec.substring(CONFIG.length() + 1);
-		// resolution takes parent configuration into account (if it exists)
-		Location localConfig = Platform.getConfigurationLocation();
-		Location parentConfig = localConfig.getParentLocation();
-		// assume we will find the file locally
-		URL localURL = new URL(localConfig.getURL(), path);
-		if (!FILE_PROTOCOL.equals(localURL.getProtocol()) || parentConfig == null)
-			// we only support cascaded file: URLs
-			return localURL;
-		File localFile = new File(localURL.getPath());
-		if (localFile.exists())
-			// file exists in local configuration
-			return localURL;
-		// try to find in the parent configuration
-		URL parentURL = new URL(parentConfig.getURL(), path);
-		if (FILE_PROTOCOL.equals(parentURL.getProtocol())) {
-			// we only support cascaded file: URLs			
-			File parentFile = new File(parentURL.getPath());
-			if (parentFile.exists()) {
-				// parent has the location
-				parentConfiguration = true;
-				return parentURL;
-			}
-		}
-		return localURL;
-	}
-
-	public static void startup() {
-		// register connection type for platform:/config handling
-		if (isRegistered)
-			return;
-		PlatformURLHandler.register(CONFIG, PlatformURLConfigConnection.class);
-		isRegistered = true;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.net.URLConnection#getOutputStream()
-	 */
-	public OutputStream getOutputStream() throws IOException {
-		if (parentConfiguration || Platform.getConfigurationLocation().isReadOnly())
-			throw new UnknownServiceException(NLS.bind(Messages.url_noOutput, url));
-		//This is not optimal but connection is a private ivar in super.
-		URL resolved = getResolvedURL();
-		if (resolved != null) {
-			String fileString = resolved.getFile();
-			if (fileString != null) {
-				File file = new File(fileString);
-				String parent = file.getParent();
-				if (parent != null)
-					new File(parent).mkdirs();
-				return new FileOutputStream(file);
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLConverter.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLConverter.java
deleted file mode 100644
index 4b7d5c9..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLConverter.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.core.internal.runtime;
-
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLConnection;
-import org.eclipse.core.internal.boot.PlatformURLConnection;
-import org.eclipse.core.internal.boot.PlatformURLHandler;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.osgi.service.urlconversion.URLConverter;
-
-/**
- * Class which implements the URLConverter service. Manages conversion of a 
- * platform: URL to one with a more well known protocol.
- * 
- * @since 3.2
- */
-public class PlatformURLConverter implements URLConverter {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.osgi.service.urlconversion.URLConverter#toFileURL(java.net.URL)
-	 */
-	public URL toFileURL(URL url) throws IOException {
-		URLConnection connection = url.openConnection();
-		if (!(connection instanceof PlatformURLConnection))
-			return url;
-		URL result = ((PlatformURLConnection) connection).getURLAsLocal();
-		// if we have a bundle*: url we should try to convert it
-		if (!result.getProtocol().startsWith(PlatformURLHandler.BUNDLE))
-			return result;
-		return FileLocator.toFileURL(result);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.osgi.service.urlconversion.URLConverter#resolve(java.net.URL)
-	 */
-	public URL resolve(URL url) throws IOException {
-		URLConnection connection = url.openConnection();
-		if (!(connection instanceof PlatformURLConnection))
-			return url;
-		URL result = ((PlatformURLConnection) connection).getResolvedURL();
-		// if we have a bundle*: url we should try to convert it
-		if (!result.getProtocol().startsWith(PlatformURLHandler.BUNDLE))
-			return result;
-		return FileLocator.resolve(result);
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLFragmentConnection.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLFragmentConnection.java
deleted file mode 100644
index 716ad01..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLFragmentConnection.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.runtime;
-
-/**
- * Platform URL support
- * platform:/fragment/fragmentId/		maps to fragmentDescriptor.getInstallURLInternal()
- */
-
-import java.io.IOException;
-import java.net.URL;
-import org.eclipse.core.internal.boot.PlatformURLConnection;
-import org.eclipse.core.internal.boot.PlatformURLHandler;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-public class PlatformURLFragmentConnection extends PlatformURLConnection {
-
-	private Bundle target = null;
-	private static boolean isRegistered = false;
-	public static final String FRAGMENT = "fragment"; //$NON-NLS-1$
-
-	public PlatformURLFragmentConnection(URL url) {
-		super(url);
-	}
-
-	protected boolean allowCaching() {
-		return true;
-	}
-
-	protected URL resolve() throws IOException {
-		String spec = url.getFile().trim();
-		if (spec.startsWith("/")) //$NON-NLS-1$
-			spec = spec.substring(1);
-		if (!spec.startsWith(FRAGMENT))
-			throw new IOException(NLS.bind(Messages.url_badVariant, url));
-		int ix = spec.indexOf("/", FRAGMENT.length() + 1); //$NON-NLS-1$
-		String ref = ix == -1 ? spec.substring(FRAGMENT.length() + 1) : spec.substring(FRAGMENT.length() + 1, ix);
-		String id = getId(ref);
-		target = InternalPlatform.getDefault().getBundle(id);
-		if (target == null)
-			throw new IOException(NLS.bind(Messages.url_resolveFragment, url));
-		URL result = target.getEntry("/"); //$NON-NLS-1$
-		if (ix == -1 || (ix + 1) >= spec.length())
-			return result;
-		else
-			return new URL(result, spec.substring(ix + 1));
-	}
-
-	public static void startup() {
-		// register connection type for platform:/fragment handling
-		if (isRegistered)
-			return;
-		PlatformURLHandler.register(FRAGMENT, PlatformURLFragmentConnection.class);
-		isRegistered = true;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLMetaConnection.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLMetaConnection.java
deleted file mode 100644
index c052085..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLMetaConnection.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.io.*;
-import java.net.URL;
-import org.eclipse.core.internal.boot.PlatformURLConnection;
-import org.eclipse.core.internal.boot.PlatformURLHandler;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-public class PlatformURLMetaConnection extends PlatformURLConnection {
-	private Bundle target = null;
-	private static boolean isRegistered = false;
-	public static final String META = "meta"; //$NON-NLS-1$
-
-	/**
-	 * @param url
-	 */
-	public PlatformURLMetaConnection(URL url) {
-		super(url);
-	}
-
-	protected URL resolve() throws IOException {
-		String spec = url.getFile().trim();
-		if (spec.startsWith("/")) //$NON-NLS-1$
-			spec = spec.substring(1);
-		if (!spec.startsWith(META))
-			throw new IOException(NLS.bind(Messages.url_badVariant, url.toString()));
-		int ix = spec.indexOf("/", META.length() + 1); //$NON-NLS-1$
-		String ref = ix == -1 ? spec.substring(META.length() + 1) : spec.substring(META.length() + 1, ix);
-		String id = getId(ref);
-		target = InternalPlatform.getDefault().getBundle(id);
-		if (target == null)
-			throw new IOException(NLS.bind(Messages.url_resolvePlugin, url.toString()));
-		IPath path = Platform.getStateLocation(target);
-		if (ix != -1 || (ix + 1) <= spec.length())
-			path = path.append(spec.substring(ix + 1));
-		return path.toFile().toURL();
-	}
-
-	public static void startup() {
-		// register connection type for platform:/meta handling
-		if (isRegistered)
-			return;
-		PlatformURLHandler.register(META, PlatformURLMetaConnection.class);
-		isRegistered = true;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.net.URLConnection#getOutputStream()
-	 */
-	public OutputStream getOutputStream() throws IOException {
-		//This is not optimal but connection is a private ivar in super.
-		URL resolved = getResolvedURL();
-		if (resolved != null) {
-			String fileString = resolved.getFile();
-			if (fileString != null) {
-				File file = new File(fileString);
-				String parent = file.getParent();
-				if (parent != null)
-					new File(parent).mkdirs();
-				return new FileOutputStream(file);
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLPluginConnection.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLPluginConnection.java
deleted file mode 100644
index 2c4c42b..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformURLPluginConnection.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.core.internal.runtime;
-
-/**
- * Platform URL support
- * platform:/plugin/pluginId/		maps to pluginDescriptor.getInstallURLInternal()
- */
-
-import java.io.IOException;
-import java.net.URL;
-import org.eclipse.core.internal.boot.PlatformURLConnection;
-import org.eclipse.core.internal.boot.PlatformURLHandler;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-public class PlatformURLPluginConnection extends PlatformURLConnection {
-
-	private Bundle target = null;
-	private static boolean isRegistered = false;
-	public static final String PLUGIN = "plugin"; //$NON-NLS-1$
-
-	public PlatformURLPluginConnection(URL url) {
-		super(url);
-	}
-
-	protected boolean allowCaching() {
-		return true;
-	}
-
-	protected URL resolve() throws IOException {
-		String spec = url.getFile().trim();
-		if (spec.startsWith("/")) //$NON-NLS-1$
-			spec = spec.substring(1);
-		if (!spec.startsWith(PLUGIN))
-			throw new IOException(NLS.bind(Messages.url_badVariant, url));
-		int ix = spec.indexOf("/", PLUGIN.length() + 1); //$NON-NLS-1$
-		String ref = ix == -1 ? spec.substring(PLUGIN.length() + 1) : spec.substring(PLUGIN.length() + 1, ix);
-		String id = getId(ref);
-		target = InternalPlatform.getDefault().getBundle(id);
-		if (target == null)
-			throw new IOException(NLS.bind(Messages.url_resolvePlugin, url));
-		if (ix == -1 || (ix + 1) >= spec.length())
-			return target.getEntry("/"); //$NON-NLS-1$
-		URL result = target.getEntry(spec.substring(ix + 1));
-		if (result != null)
-			return result;
-		// if the result is null then force the creation of a URL that will throw FileNotFoundExceptions
-		return new URL(target.getEntry("/"), spec.substring(ix + 1)); //$NON-NLS-1$
-		
-	}
-
-	public static void startup() {
-		// register connection type for platform:/plugin handling
-		if (isRegistered)
-			return;
-		PlatformURLHandler.register(PLUGIN, PlatformURLPluginConnection.class);
-		isRegistered = true;
-	}
-
-	public URL[] getAuxillaryURLs() throws IOException {
-		if (target == null) {
-			String spec = url.getFile().trim();
-			if (spec.startsWith("/")) //$NON-NLS-1$
-				spec = spec.substring(1);
-			if (!spec.startsWith(PLUGIN))
-				throw new IOException(NLS.bind(Messages.url_badVariant, url));
-			int ix = spec.indexOf("/", PLUGIN.length() + 1); //$NON-NLS-1$
-			String ref = ix == -1 ? spec.substring(PLUGIN.length() + 1) : spec.substring(PLUGIN.length() + 1, ix);
-			String id = getId(ref);
-			target = InternalPlatform.getDefault().getBundle(id);
-			if (target == null)
-				throw new IOException(NLS.bind(Messages.url_resolvePlugin, url));
-		}
-		Bundle[] fragments = InternalPlatform.getDefault().getFragments(target);
-		int fragmentLength = (fragments == null) ? 0 : fragments.length;
-		if (fragmentLength == 0)
-			return null;
-		URL[] result = new URL[fragmentLength];
-		for (int i = 0; i < fragmentLength; i++)
-			result[i] = fragments[i].getEntry("/"); //$NON-NLS-1$
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Product.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Product.java
deleted file mode 100644
index bd7eaec..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Product.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this 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.runtime;
-
-import java.util.HashMap;
-import org.eclipse.core.runtime.*;
-import org.osgi.framework.Bundle;
-
-public class Product implements IProduct {
-	private static final String ATTR_DESCRIPTION = "description"; //$NON-NLS-1$
-	private static final String ATTR_NAME = "name"; //$NON-NLS-1$
-	private static final String ATTR_APPLICATION = "application"; //$NON-NLS-1$
-	private static final String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-	String application = null;
-	String name = null;
-	String id = null;
-	String description = null;
-	HashMap properties;
-	Bundle definingBundle = null;
-
-	public Product(String id, IConfigurationElement element) {
-		this.id = id;
-		if (element == null)
-			return;
-		application = element.getAttribute(ATTR_APPLICATION);
-		name = element.getAttribute(ATTR_NAME);
-		description = element.getAttribute(ATTR_DESCRIPTION);
-		loadProperties(element);
-	}
-
-	private void loadProperties(IConfigurationElement element) {
-		IConfigurationElement[] children = element.getChildren();
-		properties = new HashMap(children.length);
-		for (int i = 0; i < children.length; i++) {
-			IConfigurationElement child = children[i];
-			String key = child.getAttribute(ATTR_NAME);
-			String value = child.getAttribute(ATTR_VALUE);
-			if (key != null && value != null)
-				properties.put(key, value);
-		}
-		definingBundle = Platform.getBundle(element.getContributor().getName());
-	}
-
-	public Bundle getDefiningBundle() {
-		return definingBundle;
-	}
-
-	public String getApplication() {
-		return application;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public String getId() {
-		return id;
-	}
-
-	public String getProperty(String key) {
-		return (String) properties.get(key);
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/URLTool.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/URLTool.java
deleted file mode 100644
index 30db6a9..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/URLTool.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.runtime;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Vector;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A utility for manipulating <code>URL</code>s.
- */
-public class URLTool {
-
-	/**
-	 * Returns the given <code>URL</code> with a trailing slash appended to
-	 * it. If the <code>URL</code> already has a trailing slash the
-	 * <code>URL</code> is returned unchanged.
-	 * <table>
-	 * <caption>Example</caption>
-	 * <tr>
-	 *   <th>Given URL</th>
-	 *   <th>Returned URL</th>
-	 * <tr>
-	 *   <td>"http://hostname/folder"</td>
-	 *   <td>"http://hostname/folder/"</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/</td>
-	 *   <td>"http://hostname/folder/"</td>
-	 * </table>
-	 *
-	 * @param url a URL
-	 * @return    the given URL with a trailing slash
-	 */
-	public static URL appendTrailingSlash(URL url) {
-		String file = url.getFile();
-		if (file.endsWith("/")) //$NON-NLS-1$
-			return url;
-		try {
-			return new URL(url.getProtocol(), url.getHost(), url.getPort(), file + "/"); //$NON-NLS-1$
-		} catch (MalformedURLException e) {
-			Assert.isTrue(false, "internal error"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the child URL formed by joining the given member with the
-	 * given parent URL.
-	 *
-	 * @return a child URL of the given parent
-	 */
-	public static URL getChild(URL parent, String member) {
-		String file = parent.getFile();
-		if (!file.endsWith("/")) //$NON-NLS-1$
-			file = file + "/"; //$NON-NLS-1$
-		try {
-			return new URL(parent.getProtocol(), parent.getHost(), parent.getPort(), file + member);
-		} catch (MalformedURLException e) {
-			Assert.isTrue(false, "internal error"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	/**
-	 * Returns all elements in the given URLs path.
-	 * <table>
-	 * <caption>Example</caption>
-	 * <tr>
-	 *   <th>Given URL</th>
-	 *   <th>Element</th>
-	 * <tr>
-	 *   <td>"http://hostname/"</td>
-	 *   <td>[]</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/</td>
-	 *   <td>[folder]</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/file</td>
-	 *   <td>[folder, file]</td>
-	 * </table>
-	 * @param url a URL
-	 * @return    all elements in the given URLs path
-	 */
-	public static Vector getElements(URL url) {
-		Vector result = new Vector(5);
-		String lastElement = null;
-		while ((lastElement = getLastElement(url)) != null) {
-			result.insertElementAt(lastElement, 0);
-			url = getParent(url);
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the last element in the given URLs path, or <code>null</code>
-	 * if the URL is the root.
-	 * <table>
-	 * <caption>Example</caption>
-	 * <tr>
-	 *   <th>Given URL</th>
-	 *   <th>Last Element</th>
-	 * <tr>
-	 *   <td>"http://hostname/"</td>
-	 *   <td>null</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/</td>
-	 *   <td>folder</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/file</td>
-	 *   <td>file</td>
-	 * </table>
-	 * @param url a URL
-	 * @return    the last element in the given URLs path, or
-	 *            <code>null</code> if the URL is the root
-	 */
-	public static String getLastElement(URL url) {
-		String file = url.getFile();
-		int len = file.length();
-		if (len == 0 || len == 1 && file.charAt(0) == '/')
-			return null;
-
-		int lastSlashIndex = -1;
-		for (int i = len - 2; lastSlashIndex == -1 && i >= 0; --i) {
-			if (file.charAt(i) == '/')
-				lastSlashIndex = i;
-		}
-		boolean isDirectory = file.charAt(len - 1) == '/';
-		if (lastSlashIndex == -1) {
-			if (isDirectory) {
-				return file.substring(0, len - 1);
-			} else {
-				return file;
-			}
-		} else {
-			if (isDirectory) {
-				return file.substring(lastSlashIndex + 1, len - 1);
-			} else {
-				return file.substring(lastSlashIndex + 1, len);
-			}
-		}
-	}
-
-	/**
-	 * Returns the parent URL of the given URL, or <code>null</code> if the
-	 * given URL is the root.
-	 * <table>
-	 * <caption>Example</caption>
-	 * <tr>
-	 *   <th>Given URL</th>
-	 *   <th>Parent URL</th>
-	 * <tr>
-	 *   <td>"http://hostname/"</td>
-	 *   <td>null</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/file</td>
-	 *   <td>"http://hostname/folder/</td>
-	 * </table>
-	 *
-	 * @param url a URL
-	 * @return    the parent of the given URL
-	 */
-	public static URL getParent(URL url) {
-		String file = url.getFile();
-		int len = file.length();
-		if (len == 0 || len == 1 && file.charAt(0) == '/')
-			return null;
-		int lastSlashIndex = -1;
-		for (int i = len - 2; lastSlashIndex == -1 && i >= 0; --i) {
-			if (file.charAt(i) == '/')
-				lastSlashIndex = i;
-		}
-		if (lastSlashIndex == -1)
-			file = ""; //$NON-NLS-1$
-		else
-			file = file.substring(0, lastSlashIndex + 1);
-
-		try {
-			url = new URL(url.getProtocol(), url.getHost(), url.getPort(), file);
-		} catch (MalformedURLException e) {
-			Assert.isTrue(false, e.getMessage());
-		}
-		return url;
-	}
-
-	/**
-	 * Returns the root URL of the given URL.
-	 * <table>
-	 * <caption>Example</caption>
-	 * <tr>
-	 *   <th>Given URL</th>
-	 *   <th>Root URL</th>
-	 * <tr>
-	 *   <td>"http://hostname/"</td>
-	 *   <td>"http://hostname/"</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/file</td>
-	 *   <td>"http://hostname/"</td>
-	 * </table>
-	 *
-	 * @param urlString a URL
-	 * @return          the root url of the given URL
-	 * @throws          MalformedURLException if the given URL is malformed
-	 */
-	public static URL getRoot(String urlString) throws MalformedURLException {
-		return getRoot(new URL(urlString));
-	}
-
-	/**
-	 * Returns the root URL of the given URL.
-	 * <table>
-	 * <caption>Example</caption>
-	 * <tr>
-	 *   <th>Given URL</th>
-	 *   <th>Root URL</th>
-	 * <tr>
-	 *   <td>"http://hostname/"</td>
-	 *   <td>"http://hostname/"</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/file</td>
-	 *   <td>"http://hostname/"</td>
-	 * </table>
-	 *
-	 * @param url a URL
-	 * @return    the root URL of the given URL
-	 */
-	public static URL getRoot(URL url) {
-		try {
-			return new URL(url.getProtocol(), url.getHost(), url.getPort(), "/"); //$NON-NLS-1$
-		} catch (MalformedURLException e) {
-			Assert.isTrue(false, "internal error"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the given URL with its trailing slash removed. If the URL has
-	 * no trailing slash, the URL is returned unchanged.
-	 * <table>
-	 * <caption>Example</caption>
-	 * <tr>
-	 *   <th>Given URL</th>
-	 *   <th>Returned URL</th>
-	 * <tr>
-	 *   <td>"http://hostname/folder"</td>
-	 *   <td>"http://hostname/folder"</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/</td>
-	 *   <td>"http://hostname/folder"</td>
-	 * </table>
-	 *
-	 * @param url a URL
-	 * @return    the given URL with its last slash removed
-	 */
-	public static URL removeTrailingSlash(URL url) {
-		String file = url.getFile();
-
-		if (file.endsWith("/")) { //$NON-NLS-1$
-			file = file.substring(0, file.length() - 1);
-			try {
-				return new URL(url.getProtocol(), url.getHost(), url.getPort(), file);
-			} catch (MalformedURLException e) {
-				Assert.isTrue(false, e.getMessage());
-			}
-		} else {
-			return url;
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns a boolean indicating whether the given URLs overlap.
-	 * <table>
-	 * <caption>Example</caption>
-	 * <tr>
-	 *   <th>First URL</th>
-	 *   <th>Second URL</th>
-	 *   <th>Do they overlap</th>
-	 * <tr>
-	 *   <td>"http://hostname/folder/"</td>
-	 *   <td>"http://hostname/folder/"</td>
-	 *   <td>true</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/"</td>
-	 *   <td>"http://hostname/folder/file"</td>
-	 *   <td>true</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder/file"</td>
-	 *   <td>"http://hostname/folder/"</td>
-	 *   <td>true</td>
-	 * <tr>
-	 *   <td>"http://hostname/folder1/"</td>
-	 *   <td>"http://hostname/folder2/"</td>
-	 *   <td>false</td>
-	 * <tr>
-	 *   <td>"http://hostname1/folder/"</td>
-	 *   <td>"http://hostname2/folder/"</td>
-	 *   <td>false</td>
-	 * </table>
-	 * @param  url1 firt URL
-	 * @param  url2 second URL
-	 * @return a boolean indicating whether the given URLs overlap
-	 */
-	public static boolean urlsOverlap(URL url1, URL url2) {
-		if (!getRoot(url1).equals(getRoot(url2))) {
-			return false;
-		}
-
-		Vector elements1 = URLTool.getElements(url1);
-		Vector elements2 = URLTool.getElements(url2);
-
-		for (int i = 0; i < elements1.size() && i < elements2.size(); ++i) {
-			String element1 = (String) elements1.elementAt(i);
-			String element2 = (String) elements2.elementAt(i);
-			if (!element1.equals(element2)) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/messages.properties b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/messages.properties
deleted file mode 100644
index 3005fa3..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/messages.properties
+++ /dev/null
@@ -1,98 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-### Runtime plugin messages
-
-### Adapter manager
-adapters_badAdapterFactory = Malformed adapter factory extension in plug-in: {0}.
-
-### application
-application_invalidExtension = Invalid (empty) application extension \"{0}\".
-application_noIdFound = No application id has been found.
-application_notFound = Application \"{0}\" could not be found in the registry. The applications available are: {1}.
-application_returned = The application \"{0}\" returned with code: {1}.
-
-### metadata
-meta_appNotInit = The application has not been initialized.
-meta_authFormatChanged = The platform authorization database file format has changed.  Cached authorization information will be lost.
-meta_exceptionParsingLog = An exception occurred while parsing the log file: {0}
-meta_keyringFileAlreadySpecified = The keyring file location has already been specified {0}.
-meta_unableToReadAuthorization = Unable to read authorization database: {0}.
-meta_unableToWriteAuthorization = Unable to write to authorization database: {0}.
-
-### plugins
-plugin_deactivatedLoad = Attempt to load class \"{0}\" from de-activated plug-in \"{1}\".
-plugin_shutdownProblems = Problems encountered shutting down plug-in: \"{0}\".
-plugin_startupProblems = Problems encountered starting up plug-in: \"{0}\".
-
-### Preferences
-preferences_saveProblems = Problems saving preferences.
-
-### Line Separator Platforms
-line_separator_platform_mac_os_9 = Mac OS 9
-line_separator_platform_unix = Unix
-line_separator_platform_windows = Windows
-
-### Product
-provider_invalid_general = Errors while processing the product providers.
-provider_invalid = Problem creating the provider registered by {0}.
-product_notFound = Product {0} could not be found.
-
-### URL
-url_badVariant = Unsupported \"platform:\" protocol variation \"{0}\".
-url_createConnection = Unable to create connection on \"{0}\".
-url_invalidURL = Invalid URL \"{0}\".
-url_noOutput = Output is not supported for \"{0}\", location is read-only.
-url_noaccess = Unhandled URL protocol \"{0}\".
-url_resolveFragment = Unable to resolve fragment \"{0}\".
-url_resolvePlugin = Unable to resolve plug-in \"{0}\".
-
-### Compatibility - parsing/resolving
-parse_badPrereqOnFrag = Fragment \"{0}\" requires non-existent plug-in \"{1}\".  Fragment ignored.
-parse_duplicateFragment = Duplicate fragment found with id \"{0}\" and version \"{1}\".
-parse_duplicateLib = Fragment \"{0}\" for plug-in \"{1}\", has added duplicate library entry \"{2}\" .
-parse_duplicatePlugin = Two plug-ins found with the same id: \"{0}\". Ignoring duplicate at \"{1}\".
-parse_error = Parsing error: \"{0}\".
-parse_errorNameLineColumn = Parsing error in \"{0}\" [line {1}, column {2}]: \"{3}\".
-parse_errorProcessing = Error while processing \"{0}\".
-parse_extPointDisabled = Extension point \"{0}\" specified in plug-in \"{1}\" is disabled.
-parse_extPointUnknown = Unknown extension point \"{0}\" specified in plug-in \"{1}\".
-parse_fragmentMissingAttr = Fragment \"{0}\" ignored due to missing attributes.
-parse_fragmentMissingIdName = Fragment ignored due to missing attributes (including name and id).
-parse_internalStack = Element/end element mismatch for element \"{0}\".
-parse_missingFPName = Plug-in name attribute missing from fragment at \"{0}\".
-parse_missingFPVersion = Plug-in version attribute missing from fragment at \"{0}\".
-parse_missingFragmentPd = Plug-in descriptor \"{0}\" not found for fragment \"{1}\".  Fragment ignored.
-parse_missingPluginId = Id attribute missing from plug-in or fragment at \"{0}\".
-parse_missingPluginName = Name attribute missing from plug-in or fragment at \"{0}\".
-parse_missingPluginVersion = Version attribute missing from plug-in or fragment at \"{0}\".
-parse_nullFragmentIdentifier = Fragment not loaded due to missing id or version number: \"{0}\".
-parse_nullPluginIdentifier = Plug-in not loaded due to missing id or version number: \"{0}\".
-parse_pluginMissingAttr = Plug-in \"{0}\" disabled due to missing attributes.
-parse_pluginMissingIdName = Plug-in disabled due to missing attributes (including name and id).
-parse_prereqDisabled = Plug-in \"{0}\" was disabled due to missing or disabled prerequisite plug-in \"{1}\".
-parse_prereqLoop = Detected prerequisite loop from \"{0}\" to \"{1}\".
-parse_prereqOptLoop = Optional prerequisite from \"{0}\" to \"{1}\" produced loop.  Prerequisite ignored.
-parse_unknownAttribute = Unknown attribute \"{1}\" for element \"{0}\" ignored.
-parse_unknownElement = Unknown element \"{1}\", found within a \"{0}\", ignored.
-parse_unknownEntry = Unknown element parsed by plug-in registry: \"{0}\".
-parse_unknownLibraryType = Unknown library type \"{0}\" for library \"{1}\".
-parse_unknownTopElement = Unknown element \"{0}\", found at the top level, ignored.
-parse_unsatisfiedOptPrereq = Optional prerequisite constraint from \"{0}\" to\" {1}\" ignored.
-parse_unsatisfiedPrereq = Unable to satisfy prerequisite constraint from \"{0}\" to \"{1}\".
-parse_validExport = \"{0}\" is not a valid value for the attribute \"export\".   Use \"true\" or \"false\".
-parse_validMatch = \"{0}\" is not a valid value for the attribute \"match\".   Use \"perfect\", \"equivalent\", \"compatible\" or \"greaterOrEqual\".
-
-### Compatibility - plugins
-plugin_notPluginClass = Supplied runtime class \"{0}\" does not extend class Plugin.
-plugin_unableToResolve = Unable to resolve plug-in registry.
-plugin_pluginDisabled = Attempt to activate a disabled plug-in: \"{0}\".
-plugin_instantiateClassError = Plug-in \"{0}\" was unable to instantiate class \"{1}\".
-plugin_loadClassError = Plug-in {0} was unable to load class {1}.
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/ILibrary.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/ILibrary.java
deleted file mode 100644
index 5f37a89..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/ILibrary.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-import org.eclipse.osgi.util.ManifestElement;
-import org.osgi.framework.Constants;
-
-/**
- * A runtime library declared in a plug-in.  Libraries contribute elements to the search path.
- * These contributions are specified as a path to a directory or Jar file.  This path is always
- * considered to be relative to the containing plug-in.  
- * <p>
- * Libraries are typed.  The type is used to determine to which search path the library's
- * contribution should be added.  The valid types are: <code>CODE</code> and
- * <code>RESOURCE</code>.  
- * </p><p>
- * This interface is not intended to be implemented by clients.
- * </p>
- *
- * @see IPluginDescriptor#getRuntimeLibraries() 
- * @deprecated 
- * In Eclipse 3.0 the plug-in classpath representation was changed.  Clients of 
- * <code>ILibrary</code> are directed to the headers associated with the relevant bundle.
- * In particular, the <code>Bundle-Classpath</code> header contains all available information
- * about the classpath of a plug-in.  Having retrieved the header, the {@link ManifestElement}
- * helper class can be used to parse the value and discover the individual 
- * class path entries.  The various header attributes are defined in {@link Constants}.
- * <p>For example, 
- * <pre>
- *     String header = bundle.getHeaders().get(Constants.BUNDLE_CLASSPATH);
- *     ManifestElement[] elements = ManifestElement.parseHeader(
- *         Constants.BUNDLE_CLASSPATH, header);
- *     if (elements == null) 
- *         return;
- *     elements[0].getValue();   // the jar/dir containing the code
- *     ...
- * </pre>
- * </p><p>
- * Note that this new structure does not include information on 
- * which packages are exported or present in the listed classpath entries. This 
- * information is no longer relevant.
- * </p><p>
- * See {@link IPluginDescriptor} for information on the relationship between plug-in 
- * descriptors and bundles.
- * </p><p>
- * This interface must only be used by plug-ins 
- * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
- * </p>
- */
-public interface ILibrary {
-	/**
-	 * Constant string (value "code") indicating the code library type.
-	 * @deprecated As of Eclipse 3.0 library types are obsolete.
-	 * There is no replacement.
-	 */
-	public static final String CODE = "code"; //$NON-NLS-1$
-
-	/**
-	 * Constant string (value "resource") indicating the resource library type.
-	 * @deprecated As of Eclipse 3.0 library types are obsolete.
-	 * There is no replacement.
-	 */
-	public static final String RESOURCE = "resource"; //$NON-NLS-1$
-
-	/**
-	 * Returns the content filters, or <code>null</code>.
-	 * Each content filter identifies a specific class, or
-	 * a group of classes, using a notation and matching rules
-	 * equivalent to Java <code>import</code> declarations
-	 * (e.g., "java.io.File", or "java.io.*"). Returns <code>null</code>
-	 * if the library is not exported, or it is fully exported
-	 * (no filtering).
-	 *
-	 * @return the content filters, or <code>null</code> if none
-	 * @deprecated As of Eclipse 3.0 content filters are obsolete.  
-	 * There is no replacement.
-	 */
-	public String[] getContentFilters();
-
-	/**
-	 * Returns the path of this runtime library, relative to the
-	 * installation location.
-	 *
-	 * @return the path of the library
-	 * @see IPluginDescriptor#getInstallURL()
-	 * @deprecated 
-	 * Given a manifest element corresponding to a classpath entry, the path
-	 * for the entry can be accessed by getting the value of the manifest element.  
-	 * For example,
-	 * <pre>
-	 *     element.getValue();   // the jar/dir containing the code
-	 * </pre>
-	 */
-	public IPath getPath();
-
-	/**
-	 * Returns this library's type.
-	 *
-	 * @return the type of this library.   The valid types are: <code>CODE</code> and <code>RESOURCE</code>.
-	 * @see #CODE
-	 * @see #RESOURCE
-	 * @deprecated As of Eclipse 3.0 library types are obsolete.
-	 * There is no replacement.
-	 */
-	public String getType();
-
-	/**
-	 * Returns whether the library is exported. The contents of an exported
-	 * library may be visible to other plug-ins that declare a dependency
-	 * on the plug-in containing this library, subject to content filtering.
-	 * Libraries that are not exported are entirely private to the declaring
-	 * plug-in.
-	 *
-	 * @return <code>true</code> if the library is exported, <code>false</code>
-	 *    if it is private
-	 * @deprecated As of Eclipse 3.0 exporting an individual library is obsolete.
-	 * There is no replacement.
-	 */
-	public boolean isExported();
-
-	/**
-	 * Returns whether this library is fully exported. A library is considered
-	 * fully exported iff it is exported and has no content filters.
-	 *
-	 * @return <code>true</code> if the library is fully exported, and
-	 *    <code>false</code> if it is private or has filtered content
-	 * @deprecated As of Eclipse 3.0 exporting an individual library is obsolete.
-	 * There is no replacement.
-	 */
-	public boolean isFullyExported();
-
-	/**
-	 * Returns the array of package prefixes that this library declares. This 
-	 * is used in classloader enhancements and is an optional entry in the plugin.xml.
-	 * 
-	 * @return the array of package prefixes or <code>null</code>
-	 * @since 2.1
-	 * @deprecated As of Eclipse 3.0 package prefix filtering is obsolete.
-	 * There is no replacement.
-	 */
-	public String[] getPackagePrefixes();
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/ILog.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/ILog.java
deleted file mode 100644
index 468c101..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/ILog.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.core.runtime;
-
-import org.osgi.framework.Bundle;
-
-/**
- * A log to which status events can be written.  Logs appear on individual
- * plug-ins and on the platform itself.  Clients can register log listeners which
- * will receive notification of all log events as they come in.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * XXX Need to create a new log interface on common plugin. That interface should be a super interface of this ILog.
- * getBundle() would stay here. In the super interface we would have getName()
- */
-public interface ILog {
-	/**
-	 * Adds the given log listener to this log.  Subsequently the log listener will
-	 * receive notification of all log events passing through this log.
-	 * This method has no affect if the identical listener is already registered on this log.
-	 *
-	 * @param listener the listener to add to this log
-	 * @see Platform#addLogListener(ILogListener)
-	 */
-	public void addLogListener(ILogListener listener);
-
-	/**
-	 * Returns the plug-in with which this log is associated.
-	 *
-	 * @return the plug-in with which this log is associated
-	 * @since 3.0
-	 */
-	public Bundle getBundle();
-
-	/**
-	 * Logs the given status.  The status is distributed to the log listeners
-	 * installed on this log and then to the log listeners installed on the platform.
-	 *
-	 * @param status the status to log
-	 */
-	public void log(IStatus status);
-
-	/**
-	 * Removes the given log listener to this log.  Subsequently the log listener will
-	 * no longer receive notification of log events passing through this log.  
-	 * This method has no affect if the identical listener is not registered on this log.
-	 *
-	 * @param listener the listener to remove
-	 * @see Platform#removeLogListener(ILogListener)
-	 */
-	public void removeLogListener(ILogListener listener);
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPlatformRunnable.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPlatformRunnable.java
deleted file mode 100644
index 10f7002..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPlatformRunnable.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-/**
- * Bootstrap type for the platform. Platform runnables represent executable 
- * entry points into plug-ins.  Runnables can be configured into the Platform's
- * <code>org.eclipse.core.runtime.applications</code> extension-point 
- * or be made available through code or extensions on other plug-in's extension-points.
- *
- * <p>
- * Clients may implement this interface.
- * </p>
- * 
- * @since 3.0
- */
-public interface IPlatformRunnable {
-
-	/**
-	 * Exit object indicating normal termination
-	 */
-	public static final Integer EXIT_OK = new Integer(0);
-
-	/**
-	 * Exit object requesting platform restart
-	 */
-	public static final Integer EXIT_RESTART = new Integer(23);
-
-	/**
-	 * Exit object requesting that the command passed back be executed.  Typically
-	 * this is used to relaunch Eclipse with different command line arguments.
-	 */
-	public static final Integer EXIT_RELAUNCH = new Integer(24);
-
-	/**
-	 * Runs this runnable with the given args and returns a result.
-	 * The content of the args is unchecked and should conform to the expectations of
-	 * the runnable being invoked.  Typically this is a <code>String</code> array.
-	 * Applications can return any object they like.  If an <code>Integer</code> is returned
-	 * it is treated as the program exit code if Eclipse is exiting.
-	 * 
-	 * @param args the argument(s) to pass to the application
-	 * @return the return value of the application
-	 * @exception Exception if there is a problem running this runnable.
-	 * @see #EXIT_OK
-	 * @see #EXIT_RESTART
-	 * @see #EXIT_RELAUNCH
-	 */
-	public Object run(Object args) throws Exception;
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPluginDescriptor.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPluginDescriptor.java
deleted file mode 100644
index bb4b901..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPluginDescriptor.java
+++ /dev/null
@@ -1,524 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-import java.net.URL;
-import java.util.*;
-
-/**
- * A plug-in descriptor contains information about a plug-in
- * obtained from the plug-in's manifest (<code>plugin.xml</code>) file.
- * <p>
- * Plug-in descriptors are platform-defined objects that exist
- * in the plug-in registry independent of whether a plug-in has
- * been started. In contrast, a plug-in's runtime object 
- * (<code>getPlugin</code>) generally runs plug-in-defined code.
- * </p>
- * <p>This interface is not intended to be implemented by clients.
- * </p>
- *
- * @deprecated 
- * <code>IPluginDescriptor</code> was refactored in Eclipse 3.0.
- * Most of the functionality has moved to {@link Platform} and the 
- * plug-in descriptor has been replaced with the OSGi <code>Bundle</code> 
- * object.
- * <p>
- * This interface must only be used by plug-ins 
- * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
- * </p>
- * <p>
- * For most uses the bundle object can be treated as an opaque token
- * representing your plug-in to the system -- It must be supplied to various 
- * <code>Platform</code> methods but need not be interrogated itself.
- * There are a small number of plug-in descriptor method equivalents 
- * supplied by <code>Bundle</code> itself.  The details are spelled out
- * in the comments on each <code>IPluginDescriptor</code> method.
- * </p>
- * <p>
- * Clients of this interface have a reference to an <code>IPluginDescriptor</code> 
- * corresponding to a plug-in.  To adapt to the deprecation, the bundle corresponding
- * to the plug-in generally needs to be acquired. There are several cases:
- * <ul>
- * <li>the descriptor was discovered using methods such as 
- * <code>IPluginRegistry.getPluginDescriptor()</code>.  The code should be 
- * updated to use one of the bundle discovery mechanisms such as 
- * <code>Platform.getBundle()</code>.
- * </li>
- * <li>the descriptor is from the plug-in itself.  The code should be updated to
- * use the plug-in's bundle instead.
- * </li>
- * <li>the descriptor is supplied by a third party.  The plug-in writer must 
- * cooperate with that party to obtain a bundle rather than a descriptor.
- * </li>
- * </ul>
- * </p>
- * <p>
- * The resulting bundle object can be used
- * to carry out the adaptation steps outlined for each of the 
- * <code>IPluginDescriptor</code> methods.
- * </p>
- * 
- * @see #getPlugin()
- */
-public interface IPluginDescriptor {
-	/**
-	 * Returns the extension with the given simple identifier declared in
-	 * this plug-in, or <code>null</code> if there is no such extension.
-	 * Since an extension might not have an identifier, some extensions
-	 * can only be found via the <code>getExtensions</code> method.
-	 *
-	 * @param extensionName the simple identifier of the extension (e.g. <code>"main"</code>).
-	 * @return the extension, or <code>null</code>
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     Platform.getExtensionRegistry().getExtension(id + "." + extensionName) 
-	 * </pre>
-	 * where <code>id</code> is the plug-in id.
-	 */
-	public IExtension getExtension(String extensionName);
-
-	/**
-	 * Returns the extension point with the given simple identifier
-	 * declared in this plug-in, or <code>null</code> if there is no such extension point.
-	 *
-	 * @param extensionPointId the simple identifier of the extension point (e.g. <code>"wizard"</code>).
-	 * @return the extension point, or <code>null</code>
-	 * @deprecated  
-	 * Use 
-	 * <pre>
-	 *     Platform.getExtensionRegistry().getExtensionPoint(id, extensionPointId) 
-	 * </pre>
-	 * where <code>id</code> is the plug-in id.
-	 */
-	public IExtensionPoint getExtensionPoint(String extensionPointId);
-
-	/**
-	 * Returns all extension points declared by this plug-in.
-	 * Returns an empty array if this plug-in does not declare any extension points.
-	 *
-	 * @return the extension points declared by this plug-in
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     Platform.getExtensionRegistry().getExtensionPoints(id) 
-	 * </pre>
-	 * where <code>id</code> is the plug-in id.
-	 */
-	public IExtensionPoint[] getExtensionPoints();
-
-	/**
-	 * Returns all extensions declared by this plug-in.
-	 * Returns an empty array if this plug-in does not declare any extensions.
-	 *
-	 * @return the extensions declared by this plug-in
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     Platform.getExtensionRegistry().getExtensions(id) 
-	 * </pre>
-	 * where <code>id</code> is the plug-in id.
-	 */
-	public IExtension[] getExtensions();
-
-	/**
-	 * Returns the URL of this plug-in's install directory. 
-	 * This is the directory containing
-	 * the plug-in manifest file, resource bundle, runtime libraries,
-	 * and any other files supplied with this plug-in. This directory is usually
-	 * read-only. Plug-in relative information should be written to the location 
-	 * provided by <code>Plugin.getStateLocation</code>.
-	 *
-	 * @return the URL of this plug-in's install directory
-	 * @see #getPlugin()
-	 * @see Plugin#getStateLocation()
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     bundle.getEntry("/");
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in or simply use the <code>getEntry</code> API
-	 * to construct the desired URL.
-	 */
-	public URL getInstallURL();
-
-	/**
-	 * Returns a displayable label for this plug-in.
-	 * Returns the empty string if no label for this plug-in
-	 * is specified in the plug-in manifest file.
-	 * <p> Note that any translation specified in the plug-in manifest
-	 * file is automatically applied.
-	 * </p>
-	 *
-	 * @return a displayable string label for this plug-in,
-	 *    possibly the empty string
-	 * @see #getResourceString(String)
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     bundle.getHeaders().get(org.osgi.framework.Constants.BUNDLE_NAME) 
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public String getLabel();
-
-	/**
-	 * Returns the plug-in runtime object corresponding to this
-	 * plug-in descriptor. Unlike other methods on this object,
-	 * invoking this method may activate the plug-in.
-	 * The returned object is an instance of the plug-in runtime class
-	 * specified in the plug-in's manifest file;
-	 * if a class is not specified there, the returned object
-	 * is an internally-supplied one that does not react to life cycle requests.
-	 *
-	 * @return the plug-in runtime object
-	 * @exception CoreException 
-	 *   if this plug-in's runtime object could not be created.
-	 * @see #isPluginActivated()
-	 * @deprecated 
-	 * In Eclipse 3.0 plug-in runtime objects are not globally managed and
-	 * so are not generically accessible.  Rather, each plug-in is free to declare
-	 * API which exposes the plug-in runtime object (e.g., <code>MyPlugin.getInstance()</code>).
-	 * 
-	 * If this method is being used to activate a plug-in then the following code is
-	 * equivalent:
-	 * <pre>
-	 *     bundle.start()
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public Plugin getPlugin() throws CoreException;
-
-	/**
-	 * Returns the plug-in class loader used to load classes and resources
-	 * for this plug-in. The class loader can be used to directly access
-	 * plug-in resources and classes. Note that accessing a resource will
-	 * <b>not activate</b> the corresponding plug-in. Successfully loading 
-	 * a class will <b>always activate</b> the corresponding plug-in.
-	 * <p> 
-	 * The following examples illustrate the direct use of the plug-in class
-	 * loader and its effect on plug-in activation (example ignores error
-	 * handling).
-	 *
-	 * <pre>
-	 *     ClassLoader loader = descriptor.getPluginClassLoader();
-	 *
-	 *     // Load resource by name. Will not activate the plug-in.
-	 *     URL res = loader.getResource("com/example/Foo/button.gif");
-	 *     InputStream is = loader.getResourceAsStream("splash.jpg");
-	 *
-	 *     // Load resource for class. Will activate the plug-in because
-	 *     // the referenced class is loaded first and triggers activation.
-	 *     URL u = com.example.Foo.class.getResource("button.gif");
-	 *
-	 *     // Load class by name. Will activate the plug-in.
-	 *     Class c = loader.loadClass("com.example.Bar");
-	 *
-	 *     // Load a resource bundle. May, or may not activate the plug-in, depending
-	 *     // on the bundle implementation. If implemented as a class, the plug-in
-	 *     // will be activated. If implemented as a properties file, the plug-in will
-	 *     // not be activated.
-	 *     ResourceBundle b = 
-	 *         ResourceBundle.getBundle("bundle", Locale.getDefault(), loader);
-	 * </pre>
-	 *
-	 * @return the plug-in class loader
-	 * @see IConfigurationElement#createExecutableExtension(String)
-	 * @see #isPluginActivated()
-	 * @see #getResourceBundle()
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     bundle.loadClass(className)
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public ClassLoader getPluginClassLoader();
-
-	/**
-	 * Returns a list of plug-in prerequisites required
-	 * for correct execution of this plug-in.
-	 *
-	 * @return an array of plug-in prerequisites, or an empty array
-	 * if no prerequisites were specified
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     import org.eclipse.osgi.util.ManifestElement;
-	 *     import org.osgi.framework.Constants;
-	 *     ...
-	 *     String requires = bundle.getHeaders().get(Constants.REQUIRE_BUNDLE);
-	 *     ManifestElement[] elements = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, requires);
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.  The resultant elements array contains one
-	 * entry for each required plug-in.
-	 */
-	public IPluginPrerequisite[] getPluginPrerequisites();
-
-	/**
-	 * Returns the name of the provider of this plug-in.
-	 * Returns the empty string if no provider name is specified in 
-	 * the plug-in manifest file.
-	 * <p> Note that any translation specified in the plug-in manifest
-	 * file is automatically applied.
-	 * </p>
-	 * @return the name of the provider, possibly the empty string
-	 * @see #getResourceString(String)
-	 * @deprecated
-	 * Use 
-	 * <pre>
-	 *     bundle.getHeaders().get(org.osgi.framework.Constants.BUNDLE_VENDOR) 
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public String getProviderName();
-
-	/**
-	 * Returns this plug-in's resource bundle for the current locale. 
-	 * <p>
-	 * The bundle is stored as the <code>plugin.properties</code> file 
-	 * in the plug-in install directory, and contains any translatable
-	 * strings used in the plug-in manifest file (<code>plugin.xml</code>)
-	 * along with other resource strings used by the plug-in implementation.
-	 * </p>
-	 *
-	 * @return the resource bundle
-	 * @exception MissingResourceException if the resource bundle was not found
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     Platform.getResourceBundle(bundle)
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public ResourceBundle getResourceBundle() throws MissingResourceException;
-
-	/**
-	 * Returns a resource string corresponding to the given argument value.
-	 * If the argument value specifies a resource key, the string
-	 * is looked up in the default resource bundle. If the argument does not
-	 * specify a valid key, the argument itself is returned as the
-	 * resource string. The key lookup is performed in the
-	 * plugin.properties resource bundle. If a resource string 
-	 * corresponding to the key is not found in the resource bundle
-	 * the key value, or any default text following the key in the
-	 * argument value is returned as the resource string.
-	 * A key is identified as a string beginning with the "%" character.
-	 * Note, that the "%" character is stripped off prior to lookup
-	 * in the resource bundle.
-	 * <p>
-	 * Equivalent to <code>getResourceString(value, getResourceBundle())</code>
-	 * </p>
-	 *
-	 * @param value the value
-	 * @return the resource string
-	 * @see #getResourceBundle()
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     Platform.getResourceString(bundle, value)
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public String getResourceString(String value);
-
-	/**
-	 * Returns a resource string corresponding to the given argument 
-	 * value and bundle.
-	 * If the argument value specifies a resource key, the string
-	 * is looked up in the given resource bundle. If the argument does not
-	 * specify a valid key, the argument itself is returned as the
-	 * resource string. The key lookup is performed against the
-	 * specified resource bundle. If a resource string 
-	 * corresponding to the key is not found in the resource bundle
-	 * the key value, or any default text following the key in the
-	 * argument value is returned as the resource string.
-	 * A key is identified as a string beginning with the "%" character.
-	 * Note that the "%" character is stripped off prior to lookup
-	 * in the resource bundle.
-	 * <p>
-	 * For example, assume resource bundle plugin.properties contains
-	 * name = Project Name
-	 * <pre>
-	 *     getResourceString("Hello World") returns "Hello World"</li>
-	 *     getResourceString("%name") returns "Project Name"</li>
-	 *     getResourceString("%name Hello World") returns "Project Name"</li>
-	 *     getResourceString("%abcd Hello World") returns "Hello World"</li>
-	 *     getResourceString("%abcd") returns "%abcd"</li>
-	 *     getResourceString("%%name") returns "%name"</li>
-	 * </pre>
-	 * </p>
-	 *
-	 * @param value the value
-	 * @param resourceBundle the resource bundle
-	 * @return the resource string
-	 * @see #getResourceBundle()
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     Platform.getResourceString(bundle, value, resourceBundle) 
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public String getResourceString(String value, ResourceBundle resourceBundle);
-
-	/**
-	 * Returns all runtime libraries declared by this plug-in.
-	 * Returns an empty array if this plug-in has no runtime libraries.
-	 *
-	 * @return the runtime libraries declared by this plug-in
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     import org.eclipse.osgi.util.ManifestElement;
-	 *     import org.osgi.framework.Constants;
-	 *     ...
-	 *     String requires = bundle.getHeaders().get(Constants.BUNDLE_CLASSPATH);
-	 *     ManifestElement[] elements = ManifestElement.parseHeader(Constants.BUNDLE_CLASSPATH, requires);
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.  The resultant elements array contains one
-	 * entry for each entry on the bundle's classpath..
-	 */
-	public ILibrary[] getRuntimeLibraries();
-
-	/**
-	 * Returns the unique identifier of this plug-in.
-	 * This identifier is a non-empty string and is unique 
-	 * within the plug-in registry.
-	 *
-	 * @return the unique identifier of the plug-in (e.g. <code>"org.eclipse.core.runtime"</code>)
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     bundle.getSymbolicName() 
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public String getUniqueIdentifier();
-
-	/**
-	 * Returns the version identifier of this plug-in.
-	 *
-	 * @return the plug-in version identifier
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     String version = (String) bundle.getHeaders().get(org.osgi.framework.Constants.BUNDLE_VERSION);
-	 *     new PluginVersionIdentifier(version); 
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public PluginVersionIdentifier getVersionIdentifier();
-
-	/**
-	 * Returns whether the plug-in described by this descriptor
-	 * has been activated. Invoking this method will not cause the
-	 * plug-in to be activated.
-	 *
-	 * @return <code>true</code> if this plug-in is activated, and
-	 *   <code>false</code> otherwise
-	 * @see #getPlugin()
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     bundle.getState == org.osgi.framework.Bundle.ACTIVE 
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public boolean isPluginActivated();
-
-	/**
-	 * Returns a URL for the given path.  Returns <code>null</code> if the URL
-	 * could not be computed or created.
-	 * 
-	 * @param path path relative to plug-in installation location 
-	 * @return a URL for the given path or <code>null</code>  It is not
-	 * necessary to perform a 'resolve' on this URL.
-	 * 
-	 * @since 2.0
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     Platform.find(bundle, file) 
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public URL find(IPath path);
-
-	/**
-	 * Returns a URL for the given path.  Returns <code>null</code> if the URL
-	 * could not be computed or created.
-	 * 
-	 * find will look for this path under the directory structure for this plugin
-	 * and any of its fragments.  If this path will yield a result outside the
-	 * scope of this plugin, <code>null</code> will be returned.  Note that
-	 * there is no specific order to the fragments.
-	 * 
-	 * The following arguments may also be used
-	 * 
-	 *  $nl$ - for language specific information
-	 *  $os$ - for operating system specific information
-	 *  $ws$ - for windowing system specific information
-	 * 
-	 * A path of $nl$/about.properties in an environment with a default 
-	 * locale of en_CA will return a URL corresponding to the first place
-	 * about.properties is found according to the following order:
-	 *   plugin root/nl/en/CA/about.properties
-	 *   fragment1 root/nl/en/CA/about.properties
-	 *   fragment2 root/nl/en/CA/about.properties
-	 *   ...
-	 *   plugin root/nl/en/about.properties
-	 *   fragment1 root/nl/en/about.properties
-	 *   fragment2 root/nl/en/about.properties
-	 *   ...
-	 *   plugin root/about.properties
-	 *   fragment1 root/about.properties
-	 *   fragment2 root/about.properties
-	 *   ...
-	 * 
-	 * If a locale other than the default locale is desired, use an
-	 * override map.
-	 * 
-	 * @param path file path relative to plug-in installation location
-	 * @param override map of override substitution arguments to be used for
-	 * any $arg$ path elements. The map keys correspond to the substitution
-	 * arguments (eg. "$nl$" or "$os$"). The resulting
-	 * values must be of type java.lang.String. If the map is <code>null</code>,
-	 * or does not contain the required substitution argument, the default
-	 * is used.
-	 * @return a URL for the given path or <code>null</code>.  It is not
-	 * necessary to perform a 'resolve' on this URL.
-	 * 
-	 * @since 2.0
-	 * @deprecated 
-	 * Use 
-	 * <pre>
-	 *     Platform.find(bundle, path, override) 
-	 * </pre>
-	 * where <code>bundle</code> is the bundle associated with 
-	 * the relevant plug-in.
-	 */
-	public URL find(IPath path, Map override);
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPluginPrerequisite.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPluginPrerequisite.java
deleted file mode 100644
index e296532..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPluginPrerequisite.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-import org.eclipse.osgi.service.resolver.State;
-import org.eclipse.osgi.util.ManifestElement;
-import org.osgi.framework.Constants;
-
-/**
- * A prerequisite entry declared by a plug-in. The declaration causes
- * classes defined by the prerequisite plug-in to be visible
- * to the plug-in that declared the dependency.
- * <p>
- * This interface is not intended to be implemented by developers.
- * </p>
- *
- * @see IPluginDescriptor#getPluginPrerequisites()
- * @deprecated 
- * In Eclipse 3.0 the plug-in prerequisite representation was changed.  Clients of 
- * <code>IPluginPrerequisite</code> are directed to the headers associated with the relevant bundle.
- * In particular, the <code>Require-Bundle</code> header contains all available information
- * about the prerequisites of a plug-in.  Having retrieved the header, the {@link ManifestElement}
- * helper class can be used to parse the value and discover the individual 
- * prerequisite plug-ins.  The various header attributes are defined in {@link Constants}.
- * <p>For example, 
- * <pre>    String header = bundle.getHeaders().get(Constants.REQUIRE_BUNDLE);
- *     ManifestElement[] elements = ManifestElement.parseHeader(
- *         Constants.REQUIRE_BUNDLE, header);
- *     if (elements == null) 
- *         return;
- *     elements[0].getValue();   // the prerequisite plug-in id
- *     elements[0].getAttribute(Constants.BUNDLE_VERSION_ATTRIBUTE);   // the prerequisite plug-in version
- *     ...
- * </pre>
- * </p><p>
- * See {@link IPluginDescriptor} for information on the relationship between plug-in 
- * descriptors and bundles.
- * </p><p>
- * This interface must only be used by plug-ins 
- * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
- * </p>
- */
-public interface IPluginPrerequisite {
-	/**
-	 * Returns the actual version identifier that is used
-	 * at runtime to resolve this prerequisite dependency,
-	 * or null, if the dependency is not resolved.
-	 * 
-	 * @return the plug-in version identifier, or null
-	 * @deprecated Callers of this method should interrogate the current {@link State}
-	 * of the platform.  For example, 
-	 * <pre>
-	 *     State state = Platform.getPlatformAdmin().getState();
-	 *     BundleDescription bundle = state.getBundle("my plug-in id", my plug-in version);
-	 *     BundleSpecification spec = bundle.getRequiredBundle("required plug-in id");
-	 *     BundleDescription prereq = spec.getSupplier();
-	 * </pre>
-	 */
-	public PluginVersionIdentifier getResolvedVersionIdentifier();
-
-	/**
-	 * Returns the plug-in identifier of the prerequisite plug-in.
-	 * 
-	 * @return the plug-in identifier
-	 * @deprecated Given a manifest element equivalent of a plug-in 
-	 * prerequisite (see the class comment), this method is replaced by:
-	 * <pre>
-	 *     element.getValue();
-	 * </pre>
-	 */
-	public String getUniqueIdentifier();
-
-	/**
-	 * Returns the version identifier of the prerequisite plug-in,
-	 * or <code>null</code> if none.
-	 * 
-	 * @return the plug-in version identifier, or <code>null</code> if 
-	 *    none was specified
-	 * @deprecated Callers of this method should interrogate the current {@link State}
-	 * of the platform.  For example, 
-	 * <pre>
-	 *     State state = Platform.getPlatformAdmin().getState();
-	 *     BundleDescription bundle = state.getBundle("my plug-in id", my plug-in version);
-	 *     BundleSpecification spec = bundle.getRequiredBundle("required plug-in id");
-	 *     Version reqMinVersion = spec.getVersionRange().getMinimum();
-	 * </pre>
-	 */
-	public PluginVersionIdentifier getVersionIdentifier();
-
-	/**
-	 * Indicates whether this prerequisite plug-in is further exposed to any
-	 * plug-ins that declare a dependency on this plug-in. This allows
-	 * for chaining of dependencies. For example, if plug-in A depends
-	 * on plug-in B which depends on plug-in C, the classes from C 
-	 * are typically visible to B, but not to A.  A can get around this 
-	 * if either B explicitly exports its dependency on C, or 
-	 * A explicitly declares C as a prerequisite in addition to B.
-	 * 
-	 * @return <code>true</code> if this prerequisite plug-in is exposed,
-	 *    <code>false</code> otherwise
-	 * @deprecated Given a manifest element equivalent of a plug-in 
-	 * prerequisite (see the class comment), this method is replaced by:
-	 * <pre>
-	 *     element.getAttribute(Constants.REPROVIDE_ATTRIBUTE);
-	 * </pre>
-	 */
-	public boolean isExported();
-
-	/**
-	 * Indicates that this plug-in prerequisite can be resolved
-	 * against a configured plug-in with an identifier that is
-	 * greater than or equal to it.
-	 *
-	 * @return <code>true</code> if greater or equal match is allowed,
-	 *   <code>false</code> otherwise.
-	 * @since 2.0
-	 * @deprecated Callers of this method should interrogate the current {@link State}
-	 * of the platform.  For example, 
-	 * <pre>
-	 *     State state = Platform.getPlatformAdmin().getState();
-	 *     BundleDescription bundle = state.getBundle("my plug-in id", my plug-in version);
-	 *     BundleSpecification spec = bundle.getRequiredBundle("required plug-in id");
-	 *     VersionRange versionRange = spec.getVersionRange();
-	 *     if (versionRange == null || versionRange.getMinimum() == null)
-	 *         return false;
-	 *     Version minimum = versionRange.getMinimum();
-	 *     Version maximum = versionRange.getMaximum() == null ? Version.maxVersion : versionRange.getMaximum();
-	 *     if (maximum.equals(Version.maxVersion))
-	 *         return true;
-	 *     return false;
-	 * </pre>
-	 */
-	public boolean isMatchedAsGreaterOrEqual();
-
-	/**
-	 * Indicates that this plug-in prerequisite can be resolved
-	 * against a configured plug-in with a compatible identifier.
-	 *
-	 * @return <code>true</code> if compatible match is allowed,
-	 *   <code>false</code> if exact match is required.
-	 * @deprecated Callers of this method should interrogate the current {@link State}
-	 * of the platform.  For example, 
-	 * <pre>
-	 *     State state = Platform.getPlatformAdmin().getState();
-	 *     BundleDescription bundle = state.getBundle("my plug-in id", my plug-in version);
-	 *     BundleSpecification spec = bundle.getRequiredBundle("required plug-in id");
-	 *     VersionRange versionRange = spec.getVersionRange();
-	 *     if (versionRange == null || versionRange.getMinimum() == null)
-	 *         return false;
-	 *     Version minimum = versionRange.getMinimum();
-	 *     Version maximum = versionRange.getMaximum() == null ? Version.maxVersion : versionRange.getMaximum();
-	 *     if (!minimum.isInclusive() || maximum.isInclusive())
-	 *         return false;
-	 *     else if (minimum.getMajorComponent() == maximum.getMajorComponent() - 1)
-	 *         return true;
-	 *     return false;	
-	 * </pre>
-	 */
-	public boolean isMatchedAsCompatible();
-
-	/**
-	 * Indicates that this plug-in prerequisite can only be resolved
-	 * against a configured plug-in with an equivalent plug-in 
-	 * identifier.
-	 *
-	 * @return <code>true</code> if only equivalent identifier match
-	 * satisfies this dependency, <code>false</code> otherwise.
-	 * @since 2.0
-	 * @deprecated Callers of this method should interrogate the current {@link State}
-	 * of the platform.  For example, 
-	 * <pre>
-	 *     State state = Platform.getPlatformAdmin().getState();
-	 *     BundleDescription bundle = state.getBundle("my plug-in id", my plug-in version);
-	 *     BundleSpecification spec = bundle.getRequiredBundle("required plug-in id");
-	 *     VersionRange versionRange = spec.getVersionRange();
-	 *     if (versionRange == null || versionRange.getMinimum() == null)
-	 *         return false;
-	 *     Version minimum = versionRange.getMinimum();
-	 *     Version maximum = versionRange.getMaximum() == null ? Version.maxVersion : versionRange.getMaximum();
-	 *     if (!minimum.isInclusive() || maximum.isInclusive())
-	 *         return false;
-	 *     else if (minimum.getMajorComponent() == maximum.getMajorComponent() - 1)
-	 *         return false;
-	 *     else if (minimum.getMajorComponent() != maximum.getMajorComponent())
-	 *         return false;
-	 *     else if (minimum.getMinorComponent() == maximum.getMinorComponent() - 1)
-	 *         return true;
-	 *     return false;
-	 * </pre>
-	 */
-	public boolean isMatchedAsEquivalent();
-
-	/**
-	 * Indicates that this plug-in prerequisite can only be resolved
-	 * against a configured plug-in with a plug-in identifier that
-	 * is perfectly equal.
-	 *
-	 * @return <code>true</code> if only perfectly equal
-	 * identifier match satisfies this dependency,
-	 * <code>false</code> otherwise.
-	 * @since 2.0
-	 * @deprecated Callers of this method should interrogate the current {@link State}
-	 * of the platform.  For example, 
-	 * <pre>
-	 *     State state = Platform.getPlatformAdmin().getState();
-	 *     BundleDescription bundle = state.getBundle("my plug-in id", my plug-in version);
-	 *     BundleSpecification spec = bundle.getRequiredBundle("required plug-in id");
-	 *     VersionRange versionRange = spec.getVersionRange();
-	 *     if (versionRange == null || versionRange.getMinimum() == null)
-	 *         return false;
-	 *     Version minimum = versionRange.getMinimum();
-	 *     Version maximum = versionRange.getMaximum() == null ? Version.maxVersion : versionRange.getMaximum();
-	 *     if (minimum.equals(maximum))
-	 *         return true;
-	 *     return false;
-	 * </pre>
-	 */
-	public boolean isMatchedAsPerfect();
-
-	/**
-	 * Indicates that this plug-in prerequisite can only be resolved
-	 * against a configured plug-in with exactly the same plug-in 
-	 * identifier.
-	 *
-	 * @return <code>true</code> if only exact identifier match
-	 * satisfies this dependency, <code>false</code> if compatible
-	 * plug-in will satisfy this dependency.
-	 * @deprecated Callers of this method should interrogate the current {@link State}
-	 * of the platform.  For example, 
-	 * <pre>
-	 *     State state = Platform.getPlatformAdmin().getState();
-	 *     BundleDescription bundle = state.getBundle("my plug-in id", my plug-in version);
-	 *     BundleSpecification spec = bundle.getRequiredBundle("required plug-in id");
-	 *     VersionRange versionRange = spec.getVersionRange();
-	 *     if (versionRange == null || versionRange.getMinimum() == null)
-	 *         return false;
-	 *     Version minimum = versionRange.getMinimum();
-	 *     Version maximum = versionRange.getMaximum() == null ? Version.maxVersion : versionRange.getMaximum();
-	 *     if (!minimum.isInclusive() || maximum.isInclusive())
-	 *         return false;
-	 *     else if (minimum.getMajorComponent() == maximum.getMajorComponent() - 1)
-	 *         return false;
-	 *     else if (minimum.getMajorComponent() != maximum.getMajorComponent())
-	 *         return false;
-	 *     else if (minimum.getMinorComponent() == maximum.getMinorComponent() - 1)
-	 *         return true;
-	 *     return false;
-	 * </pre>
-	 */
-	public boolean isMatchedAsExact();
-
-	/**
-	 * Indicates whether this plug-in prerequisite is optional.  If a required (i.e., non-optional)
-	 * prerequisite is missing, this plugin is disabled.  
-	 *
-	 * @return <code>true</code> if this prerequisite is optional, <code>false</code> otherwise
-	 * @deprecated Given a manifest element equivalent of a plug-in 
-	 * prerequisite (see the class comment), this method is replaced by:
-	 * <pre>
-	 *     "true".equals(element.getAttribute(Constants.OPTIONAL_ATTRIBUTE);
-	 * </pre>
-	 */
-	public boolean isOptional();
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPluginRegistry.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPluginRegistry.java
deleted file mode 100644
index 953d9b0..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IPluginRegistry.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-/**
- * The plug-in registry holds the master list of all
- * discovered plug-ins, extension points, and extensions.
- * <p>
- * The plug-in registry can be queried, by name, for 
- * plug-ins, extension points, and extensions.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @deprecated 
- * The plug-in registry has been generalized in Eclipse 3.0.  It is now the
- * {@link IExtensionRegistry}.  Most of the <code>IPluginRegistry</code> function
- * is directly supported on the new interface without change.  Most clients
- * of <code>IPluginRegistry</code> need only to change their references to use
- * <code>IExtensionRegistry</code>.  The only exceptions are 
- * methods that return <code>IPluginDescriptor</code>s.  See the relevant method
- * comments for details.
- * <p>
- * This interface must only be used by plug-ins 
- * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
- * </p>
- */
-public interface IPluginRegistry {
-	/**
-	 * Returns all configuration elements from all extensions configured
-	 * into the identified extension point. Returns an empty array if the extension 
-	 * point does not exist, has no extensions configured, or none of the extensions 
-	 * contain configuration elements.
-	 *
-	 * @param extensionPointId the unique identifier of the extension point
-	 *		(e.g. <code>"org.eclipse.core.resources.builders"</code>)
-	 * @return the configuration elements
-	 * @deprecated Replaced by {@link IExtensionRegistry#getConfigurationElementsFor(String)}.
-	 */
-	public IConfigurationElement[] getConfigurationElementsFor(String extensionPointId);
-
-	/**
-	 * Returns all configuration elements from all extensions configured
-	 * into the identified extension point. Returns an empty array if the extension 
-	 * point does not exist, has no extensions configured, or none of the extensions 
-	 * contain configuration elements.
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"org.eclipse.core.resources"</code>)
-	 * @param extensionPointName the simple identifier of the 
-	 *		extension point (e.g. <code>"builders"</code>)
-	 * @return the configuration elements
-	 * @deprecated Replaced by {@link IExtensionRegistry#getConfigurationElementsFor(String, String)}.
-	 */
-	public IConfigurationElement[] getConfigurationElementsFor(String pluginId, String extensionPointName);
-
-	/**
-	 * Returns all configuration elements from the identified extension.
-	 * Returns an empty array if the extension does not exist or 
-	 * contains no configuration elements.
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"org.eclipse.core.resources"</code>)
-	 * @param extensionPointName the simple identifier of the 
-	 *		extension point (e.g. <code>"builders"</code>)
-	 * @param extensionId the unique identifier of the extension 
-	 *		(e.g. <code>"com.example.acme.coolbuilder</code>)
-	 * @return the configuration elements
-	 * @deprecated Replaced by {@link IExtensionRegistry#getConfigurationElementsFor(String, String, String)}.
-	 */
-	public IConfigurationElement[] getConfigurationElementsFor(String pluginId, String extensionPointName, String extensionId);
-
-	/**
-	 * Returns the specified extension in this plug-in registry, 
-	 * or <code>null</code> if there is no such extension.
-	 * The first parameter identifies the extension point, and the second
-	 * parameter identifies an extension plugged in to that extension point.
-	 *
-	 * @param extensionPointId the unique identifier of the extension point
-	 *		(e.g. <code>"org.eclipse.core.resources.builders"</code>)
-	 * @param extensionId the unique identifier of the extension 
-	 *		(e.g. <code>"com.example.acme.coolbuilder"</code>)
-	 * @return the extension, or <code>null</code>
-	 * @deprecated Replaced by {@link IExtensionRegistry#getExtension(String, String)}.
-	 */
-	public IExtension getExtension(String extensionPointId, String extensionId);
-
-	/**
-	 * Returns the specified extension in this plug-in registry, 
-	 * or <code>null</code> if there is no such extension.
-	 * The first two parameters identify the extension point, and the third
-	 * parameter identifies an extension plugged in to that extension point.
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"org.eclipse.core.resources"</code>)
-	 * @param extensionPointName the simple identifier of the 
-	 *		extension point (e.g. <code>"builders"</code>)
-	 * @param extensionId the unique identifier of the extension 
-	 *		(e.g. <code>"com.example.acme.coolbuilder"</code>)
-	 * @return the extension, or <code>null</code>
-	 * @deprecated Replaced by {@link IExtensionRegistry#getExtension(String, String, String)}.
-	 */
-	public IExtension getExtension(String pluginId, String extensionPointName, String extensionId);
-
-	/**
-	 * Returns the extension point with the given extension point identifier
-	 * in this plug-in registry, or <code>null</code> if there is no such
-	 * extension point.
-	 *
-	 * @param extensionPointId the unique identifier of the extension point 
-	 *    (e.g., <code>"org.eclipse.core.resources.builders"</code>)
-	 * @return the extension point, or <code>null</code>
-	 * @deprecated Replaced by {@link IExtensionRegistry#getExtensionPoint(String)}.
-	 */
-	public IExtensionPoint getExtensionPoint(String extensionPointId);
-
-	/**
-	 * Returns the extension point in this plug-in registry
-	 * with the given plug-in identifier and extension point simple identifier,
-	 * or <code>null</code> if there is no such extension point.
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"org.eclipse.core.resources"</code>)
-	 * @param extensionPointName the simple identifier of the 
-	 *		extension point (e.g. <code>" builders"</code>)
-	 * @return the extension point, or <code>null</code>
-	 * @deprecated Replaced by {@link IExtensionRegistry#getExtensionPoint(String, String)}.
-	 */
-	public IExtensionPoint getExtensionPoint(String pluginId, String extensionPointName);
-
-	/**
-	 * Returns all extension points known to this plug-in registry.
-	 * Returns an empty array if there are no extension points.
-	 *
-	 * @return the extension points known to this plug-in registry
-	 * @deprecated Replaced by {@link IExtensionRegistry#getExtensionPoints()}.
-	 */
-	public IExtensionPoint[] getExtensionPoints();
-
-	/**
-	 * Returns the plug-in descriptor with the given plug-in identifier
-	 * in this plug-in registry, or <code>null</code> if there is no such
-	 * plug-in.  If there are multiple versions of the identified plug-in,
-	 * one will be non-deterministically chosen and returned.  
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"com.example.acme"</code>).
-	 * @return the plug-in descriptor, or <code>null</code>
-	 * @deprecated 
-	 * <code>IPluginDescriptor</code> was refactored in Eclipse 3.0.
-	 * The <code>getPluginDescriptor()</code> method may only be called by plug-ins 
-	 * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
-	 * See the comments on {@link IPluginDescriptor} and its methods for details.
-	 */
-	public IPluginDescriptor getPluginDescriptor(String pluginId);
-
-	/**
-	 * Returns the plug-in descriptor with the given plug-in identifier
-	 * and version in this plug-in registry, or <code>null</code> if 
-	 * there is no such plug-in.
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"org.eclipse.core.resources"</code>)
-	 * @param version plug-in version identifier. If <code>null</code> is specified,
-	 * a non-deterministically chosen version of the identified plug-in (if any)
-	 * will be returned
-	 * @return the plug-in descriptor, or <code>null</code>
-	 * @deprecated 
-	 * <code>IPluginDescriptor</code> was refactored in Eclipse 3.0.
-	 * The <code>getPluginDescriptor()</code> method may only be called by plug-ins 
-	 * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
-	 * See the comments on {@link IPluginDescriptor} and its methods for details.
-	 */
-	public IPluginDescriptor getPluginDescriptor(String pluginId, PluginVersionIdentifier version);
-
-	/**
-	 * Returns all plug-in descriptors known to this plug-in registry.
-	 * Returns an empty array if there are no installed plug-ins.
-	 *
-	 * @return the plug-in descriptors known to this plug-in registry
-	 * @deprecated 
-	 * <code>IPluginDescriptor</code> was refactored in Eclipse 3.0.
-	 * The <code>getPluginDescriptors()</code> method may only be called by plug-ins 
-	 * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
-	 * See the comments on {@link IPluginDescriptor} and its methods for details.
-	 */
-	public IPluginDescriptor[] getPluginDescriptors();
-
-	/**
-	 * Returns all versions of the identified plug-in descriptor
-	 * known to this plug-in registry.
-	 * Returns an empty array if there are no plug-ins
-	 * with the specified identifier.
-	 *
-	 * @param pluginId the unique identifier of the plug-in 
-	 *		(e.g. <code>"org.eclipse.core.resources"</code>).
-	 * @return the plug-in descriptors known to this plug-in registry
-	 * @deprecated 
-	 * <code>IPluginDescriptor</code> was refactored in Eclipse 3.0.
-	 * The <code>getPluginDescriptors()</code> method may only be called by plug-ins 
-	 * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
-	 * See the comments on {@link IPluginDescriptor} and its methods for details.
-	 */
-	public IPluginDescriptor[] getPluginDescriptors(String pluginId);
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IProduct.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IProduct.java
deleted file mode 100644
index d03417e..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IProduct.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-import org.osgi.framework.Bundle;
-
-/**
- * Products are the Eclipse unit of branding.  From the runtime point of view they have
- * a name, id and description and identify the Eclipse application to run.  
- * <p>
- * Since the bulk of the branding related information is
- * specific to the UI, products also carry an arbitrary set of properties.  The valid set of 
- * key-value pairs and their interpretation defined by the UI of the target environment.
- * For example, in the standard Eclipse UI, <code>org.eclipse.ui.branding.IProductConstants</code>
- * the properties of interest to the UI.  Other clients may specify additional properties.
- * </p><p>
- * Products can be defined directly using extensions to the <code>org.eclipse.core.runtime.products</code>
- * extension point or by using facilities provided by IProductProvider implementations.
- * </p><p>
- * For readers familiar with Eclipse 2.1 and earlier, products are roughly equivalent to 
- * <i>primary features</i>. 
- * </p>
- * 
- * @see IProductProvider
- * @see org.eclipse.ui.branding.IProductConstants
- * @since 3.0
- */
-public interface IProduct {
-	/**
-	 * Returns the application associated with this product.  This information is used 
-	 * to guide the runtime as to what application extension to create and execute.
-	 * 
-	 * @return this product's application or <code>null</code> if none
-	 */
-	public String getApplication();
-
-	/**
-	 * Returns the name of this product.  The name is typically used in the title
-	 * bar of UI windows.
-	 * 
-	 * @return the name of this product or <code>null</code> if none
-	 */
-	public String getName();
-
-	/**
-	 * Returns the text description of this product
-	 * 
-	 * @return the description of this product or <code>null</code> if none
-	 */
-	public String getDescription();
-
-	/** Returns the unique product id of this product.
-	 * 
-	 * @return the id of this product
-	 */
-	public String getId();
-
-	/**
-	 * Returns the property of this product with the given key.
-	 * <code>null</code> is returned if there is no such key/value pair.
-	 * 
-	 * @param key the name of the property to return
-	 * @return the value associated with the given key or <code>null</code> if none
-	 */
-	public String getProperty(String key);
-	
-	/**
-	 * Returns the bundle which is responsible for the definition of this product.
-	 * Typically this is used as a base for searching for images and other files 
-	 * that are needed in presenting the product.
-	 * 
-	 * @return the bundle which defines this product or <code>null</code> if none
-	 */
-	public Bundle getDefiningBundle();
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IProductProvider.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IProductProvider.java
deleted file mode 100644
index 72a0ab4..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/IProductProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-/**
- * Product providers define products (units of branding) which have been installed in
- * the current system.  Typically, a configuration agent (i.e., plug-in installer) will 
- * define a product provider so that it can report to the system the products it has installed.
- * <p>
- * Products are normally defined and installed in the system using extensions to the 
- * <code>org.eclipse.core.runtime.products</code> extension point.  In cases where 
- * the notion of product is defined by alternate means (e.g., primary feature), an <code>IProductProvider</code>
- * can be installed in this extension point using an executable extension.  The provider
- * then acts as a proxy for the product extensions that represent the products installed.
- * </p>
- * 
- * @see IProduct
- * @since 3.0
- */
-public interface IProductProvider {
-	/**
-	 * Returns the human-readable name of this product provider.
-	 * 
-	 * @return the name of this product provider
-	 */
-	public String getName();
-
-	/**
-	 * Returns the products provided by this provider.
-	 * 
-	 * @return the products provided by this provider
-	 */
-	public IProduct[] getProducts();
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/PerformanceStats.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/PerformanceStats.java
deleted file mode 100644
index 76dada2..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/PerformanceStats.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-import java.io.PrintWriter;
-import java.util.*;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.internal.runtime.PerformanceStatsProcessor;
-
-/**
- * PerformanceStats collects and aggregates timing data about events such as
- * a builder running, an editor opening, etc.  This data is collected for the 
- * purpose of performance analysis, and is not intended to be used as
- * a generic event tracking and notification system.
- * <p>
- * Each performance event can have an associated maximum acceptable
- * duration that is specified in the platform debug options file (.options).
- * Events that take longer than this maximum are logged as errors.  Along
- * with option file entries for each debug event, there are some global debug
- * options for enabling or disabling performance event gathering and reporting.
- * See the "org.eclipse.core.runtime/perf*" debug options in the .options file
- * for the org.eclipse.core.runtime plugin for more details.
- * </p><p>
- * A performance event can optionally have additional context information
- * ({@link #getContext}).  This information is only stored in the case
- * of a performance failure, and can be used to provide further diagnostic 
- * information that can help track down the cause of the failure.
- * </p><p>
- * Performance events and performance failures are batched up and periodically
- * sent to interested performance event listeners.
- * </p><p>
- * This class is not intended to be subclassed or instantiated by clients.
- * </p>
- * @since 3.1
- */
-public class PerformanceStats {
-	/**
-	 * A performance listener is periodically notified after performance events occur 
-	 * or after events fail.
-	 * <p>
-	 * This class is intended to be subclassed.
-	 * </p>
-	 * 
-	 * @see PerformanceStats#addListener(PerformanceStats.PerformanceListener)
-	 */
-	public static abstract class PerformanceListener {
-		/**
-		 * Creates a new listener.
-		 */
-		protected PerformanceListener() {
-			super();
-		}
-
-		/**
-		 * Notifies than an event exceeded the maximum duration for that event type.
-		 * <p>
-		 * This default implementation does nothing. Subclasses may override.
-		 * </p>
-		 * 
-		 * @param event The event that failed
-		 * @param duration The duration of the failed event, in milliseconds
-		 */
-		public void eventFailed(PerformanceStats event, long duration) {
-			//default implementation does nothing
-		}
-
-		/**
-		 * Notifies that an event occurred.  Notification might not occur
-		 * in the same thread or near the time of the actual event.
-		 * <p>
-		 * This default implementation does nothing. Subclasses may override.
-		 * </p>
-		 * 
-		 * @param event The event that occurred
-		 */
-		public void eventsOccurred(PerformanceStats[] event) {
-			//default implementation does nothing
-		}
-	}
-
-	/**
-	 * An empty stats object that is returned when tracing is turned off
-	 */
-	private static final PerformanceStats EMPTY_STATS = new PerformanceStats("", ""); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * Constant indicating whether or not tracing is enabled
-	 */
-	public static final boolean ENABLED;
-
-	/**
-	 * A constant indicating that the timer has not been started.
-	 */
-	private static final long NOT_STARTED = -1;
-
-	/**
-	 * All known event statistics.
-	 */
-	private final static Map statMap = Collections.synchronizedMap(new HashMap());
-
-	/**
-	 * Maximum allowed durations for each event.
-	 * Maps String (event name) -> Long (threshold)
-	 */
-	private final static Map thresholdMap = Collections.synchronizedMap(new HashMap());
-
-	/**
-	 * Whether non-failure statistics should be retained.
-	 */
-	private static final boolean TRACE_SUCCESS;
-
-	/**
-	 * An identifier that can be used to figure out who caused the event. This is 
-	 * typically a string representation of the object whose code was running when 
-	 * the event occurred or a <code>String</code> describing the event.
-	 */
-	private String blame;
-
-	/**
-	 * The id of the plugin that defined the blame object for this event, or
-	 * <code>null</code> if it could not be determined.
-	 */
-	private String blamePluginId;
-
-	/**
-	 * An optional context for the event (may be <code>null</code>).
-	 * The context can provide extra information about an event, such as the
-	 * name of a project being built, or the input of an editor being opened.
-	 */
-	private String context;
-
-	/**
-	 * The starting time of the current occurrence of this event.
-	 */
-	private long currentStart = NOT_STARTED;
-
-	/**
-	 * The symbolic name of the event that occurred. This is usually the name of 
-	 * the debug option for this event.
-	 */
-	private String event;
-
-	/**
-	 * Whether this is a performance failure event
-	 */
-	private boolean isFailure;
-
-	/**
-	 * The total number of times this event has occurred.
-	 */
-	private int runCount = 0;
-
-	/**
-	 * The total time in milliseconds taken by all occurrences of this event.
-	 */
-	private long runningTime = 0;
-
-	static {
-		ENABLED = InternalPlatform.getDefault().getBooleanOption(Platform.PI_RUNTIME + "/perf", false);//$NON-NLS-1$
-		//turn these on by default if the global trace flag is turned on
-		TRACE_SUCCESS = InternalPlatform.getDefault().getBooleanOption(Platform.PI_RUNTIME + "/perf/success", ENABLED); //$NON-NLS-1$
-	}
-
-	/**
-	 * Adds a listener that is notified when performance events occur.  If
-	 * an equal listener is already installed, it will be replaced.
-	 * 
-	 * @param listener The listener to be added
-	 * @see #removeListener(PerformanceStats.PerformanceListener)
-	 */
-	public static void addListener(PerformanceListener listener) {
-		if (ENABLED)
-			PerformanceStatsProcessor.addListener(listener);
-	}
-
-	/**
-	 * Discards all known performance event statistics.
-	 */
-	public static void clear() {
-		statMap.clear();
-	}
-
-	/**
-	 * Returns all performance event statistics.
-	 * 
-	 * @return An array of known performance event statistics.  The array
-	 * will be empty if there are no recorded statistics.
-	 */
-	public static PerformanceStats[] getAllStats() {
-		return (PerformanceStats[]) statMap.values().toArray(new PerformanceStats[statMap.values().size()]);
-	}
-
-	/**
-	 * Returns the stats object corresponding to the given parameters.  
-	 * A stats object is created and added to the global list of events if it did not 
-	 * already exist.
-	 * 
-	 * @param eventName A symbolic event name.  This is usually the name of 
-	 * the debug option for this event. An example event name from
-	 * the org.eclipse.core.resources plugin describing a build event might look like:
-	 * 		<code>"org.eclipse.core.resources/perf/building"</code>"
-	 * @param blameObject The blame for the event.  This is typically the object 
-	 * whose code was running when the event occurred.  If a blame object cannot 
-	 * be obtained, a <code>String</code> describing the event should be supplied
-	 */
-	public static PerformanceStats getStats(String eventName, Object blameObject) {
-		if (!ENABLED || eventName == null || blameObject == null)
-			return EMPTY_STATS;
-		PerformanceStats newStats = new PerformanceStats(eventName, blameObject);
-		if (!TRACE_SUCCESS)
-			return newStats;
-		//use existing stats object if available
-		PerformanceStats oldStats = (PerformanceStats) statMap.get(newStats);
-		if (oldStats != null)
-			return oldStats;
-		statMap.put(newStats, newStats);
-		return newStats;
-	}
-
-	/**
-	 * Returns whether monitoring of a given performance event is enabled.
-	 * <p>
-	 * For frequent performance events, the result of this method call should
-	 * be cached by the caller to minimize overhead when performance monitoring
-	 * is turned off.  It is not possible for enablement to change during the life
-	 * of this invocation of the platform.
-	 * </p>
-	 * 
-	 * @param eventName The name of the event to determine enablement for
-	 * @return <code>true</code>If the performance event with the given
-	 * name is enabled, and <code>false</code> otherwise.
-	 */
-	public static boolean isEnabled(String eventName) {
-		if (!ENABLED)
-			return false;
-		String option = Platform.getDebugOption(eventName);
-		return option != null && !option.equalsIgnoreCase("false") && !option.equalsIgnoreCase("-1"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Prints all statistics to the standard output.
-	 */
-	public static void printStats() {
-		if (!ENABLED)
-			return;
-		PrintWriter writer = new PrintWriter(System.out);
-		PerformanceStatsProcessor.printStats(writer);
-		writer.flush();
-		writer.close();
-	}
-
-	/**
-	 * Writes all statistics using the provided writer
-	 * 
-	 * @param out The writer to print stats to.
-	 */
-	public static void printStats(PrintWriter out) {
-		if (!ENABLED)
-			return;
-		PerformanceStatsProcessor.printStats(out);
-	}
-
-	/**
-	 * Removes an event listener. Has no effect if an equal
-	 * listener object is not currently registered.
-	 * 
-	 * @param listener The listener to remove
-	 * @see #addListener(PerformanceStats.PerformanceListener)
-	 */
-	public static void removeListener(PerformanceListener listener) {
-		if (ENABLED)
-			PerformanceStatsProcessor.removeListener(listener);
-	}
-
-	/**
-	 * Removes statistics for a given event and blame
-	 * 
-	 * @param eventName The name of the event to remove
-	 * @param blameObject The blame for the event to remove
-	 */
-	public static void removeStats(String eventName, Object blameObject) {
-		synchronized (statMap) {
-			for (Iterator it = statMap.keySet().iterator(); it.hasNext();) {
-				PerformanceStats stats = (PerformanceStats) it.next();
-				if (stats.getEvent().equals(eventName) && stats.getBlame().equals(blameObject))
-					it.remove();
-			}
-		}
-	}
-
-	/** 
-	 * Creates a new PerformanceStats object.  Private to prevent client instantiation.
-	 */
-	private PerformanceStats(String event, Object blame) {
-		this(event, blame, null);
-	}
-
-	/** 
-	 * Creates a new PerformanceStats object.  Private to prevent client instantiation.
-	 */
-	private PerformanceStats(String event, Object blameObject, String context) {
-		this.event = event;
-		this.blame = blameObject instanceof String ? (String) blameObject : blameObject.getClass().getName();
-		this.blamePluginId = InternalPlatform.getDefault().getBundleId(blameObject);
-		this.context = context;
-	}
-
-	/**
-	 * Adds an occurrence of this event to the cumulative counters. This method
-	 * can be used as an alternative to <code>startRun</code> and <code>endRun</code>
-	 * for clients that want to track the context and execution time separately.
-	 * 
-	 * @param elapsed The elapsed time of the new occurrence in milliseconds
-	 * @param contextName The context for the event to return, or <code>null</code>.
-	 * The context optionally provides extra information about an event, such as the
-	 * name of a project being built, or the input of an editor being opened.
-	 */
-	public void addRun(long elapsed, String contextName) {
-		if (!ENABLED)
-			return;
-		runCount++;
-		runningTime += elapsed;
-		if (elapsed > getThreshold(event))
-			PerformanceStatsProcessor.failed(createFailureStats(contextName, elapsed), blamePluginId, elapsed);
-		if (TRACE_SUCCESS)
-			PerformanceStatsProcessor.changed(this);
-	}
-
-	/**
-	 * Creates a stats object representing a performance failure
-	 * 
-	 * @param contextName The failure context information.
-	 * @param elapsed The elapsed time in milliseconds
-	 * @return The failure stats
-	 */
-	private PerformanceStats createFailureStats(String contextName, long elapsed) {
-		PerformanceStats failedStat = new PerformanceStats(event, blame, contextName);
-		PerformanceStats old = (PerformanceStats) statMap.get(failedStat);
-		if (old == null)
-			statMap.put(failedStat, failedStat);
-		else
-			failedStat = old;
-		failedStat.isFailure = true;
-		failedStat.runCount++;
-		failedStat.runningTime += elapsed;
-		return failedStat;
-	}
-
-	/**
-	 * Stops timing the occurrence of this event that was started by the previous
-	 * call to <code>startRun</code>.  The event is automatically added to
-	 * the cumulative counters for this event and listeners are notified.
-	 * <p>
-	 * Note that this facility guards itself against runs that start but fail to stop,
-	 * so it is not necessary to call this method from a finally block.  Tracking
-	 * performance of failure cases is generally not of interest.
-	 * </p>
-	 * 
-	 * @see #startRun()
-	 */
-	public void endRun() {
-		if (!ENABLED || currentStart == NOT_STARTED)
-			return;
-		addRun(System.currentTimeMillis() - currentStart, context);
-		currentStart = NOT_STARTED;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals()
-	 */
-	public boolean equals(Object obj) {
-		//count and time are not considered part of equality
-		if (!(obj instanceof PerformanceStats))
-			return false;
-		PerformanceStats that = (PerformanceStats) obj;
-		if (!this.event.equals(that.event))
-			return false;
-		if (!this.getBlameString().equals(that.getBlameString()))
-			return false;
-		return this.context == null ? that.context == null : this.context.equals(that.context);
-	}
-
-	/**
-	 * Returns an object that can be used to figure out who caused the event,
-	 * or a string describing the cause of the event.
-	 * 
-	 * @return The blame for this event
-	 */
-	public Object getBlame() {
-		return blame;
-	}
-
-	/**
-	 * Returns a string describing the blame for this event.
-	 * 
-	 * @return A string describing the blame.
-	 */
-	public String getBlameString() {
-		return blame;
-	}
-
-	/**
-	 * Returns the optional event context, such as the input of an editor, or the target project
-	 * of a build event.
-	 * 
-	 * @return The context, or <code>null</code> if there is none
-	 */
-	public String getContext() {
-		return context;
-	}
-
-	/**
-	 * Returns the symbolic name of the event that occurred.
-	 * 
-	 * @return The name of the event.
-	 */
-	public String getEvent() {
-		return event;
-	}
-
-	/**
-	 * Returns the total number of times this event has occurred.
-	 * 
-	 * @return The number of occurrences of this event.
-	 */
-	public int getRunCount() {
-		return runCount;
-	}
-
-	/**
-	 * Returns the total execution time in milliseconds for all occurrences
-	 * of this event.
-	 * 
-	 * @return The total running time in milliseconds.
-	 */
-	public long getRunningTime() {
-		return runningTime;
-	}
-
-	/**
-	 * Returns the performance threshold for this event.
-	 */
-	private long getThreshold(String eventName) {
-		Long value = (Long) thresholdMap.get(eventName);
-		if (value == null) {
-			String option = InternalPlatform.getDefault().getOption(eventName);
-			if (option != null) {
-				try {
-					value = new Long(option);
-				} catch (NumberFormatException e) {
-					//invalid option, just ignore
-				}
-			}
-			if (value == null)
-				value = new Long(Long.MAX_VALUE);
-			thresholdMap.put(eventName, value);
-		}
-		return value.longValue();
-	}
-
-	public int hashCode() {
-		//count and time are not considered part of equality
-		int hash = event.hashCode() * 37 + getBlameString().hashCode();
-		if (context != null)
-			hash = hash * 37 + context.hashCode();
-		return hash;
-	}
-
-	/**
-	 * Returns whether this performance event represents a performance failure.
-	 * 
-	 * @return <code>true</code> if this is a performance failure, and 
-	 * <code>false</code> otherwise.
-	 */
-	public boolean isFailure() {
-		return isFailure;
-	}
-
-	/**
-	 * Resets count and running time for this particular stats event.
-	 */
-	public void reset() {
-		runningTime = 0;
-		runCount = 0;
-	}
-
-	/**
-	 * Starts timing an occurrence of this event. This is a convenience method,
-	 * fully equivalent to <code>startRun(null)</code>.
-	 */
-	public void startRun() {
-		if (ENABLED)
-			startRun(null);
-	}
-
-	/**
-	 * Starts timing an occurrence of this event.  The event should be stopped
-	 * by a subsequent call to <code>endRun</code>.
-	 * 
-	 * @param contextName The context for the event to return, or <code>null</code>.
-	 * The context optionally provides extra information about an event, such as the
-	 * name of a project being built, or the input of an editor being opened.
-	 * @see #endRun
-	 */
-	public void startRun(String contextName) {
-		if (!ENABLED)
-			return;
-		this.context = contextName;
-		this.currentStart = System.currentTimeMillis();
-	}
-
-	/**
-	 * For debugging purposes only.
-	 */
-	public String toString() {
-		StringBuffer result = new StringBuffer("PerformanceStats("); //$NON-NLS-1$
-		result.append(event);
-		result.append(',');
-		result.append(blame);
-		if (context != null) {
-			result.append(',');
-			result.append(context);
-		}
-		result.append(')');
-		return result.toString();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Platform.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Platform.java
deleted file mode 100644
index 2f0cae7..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Platform.java
+++ /dev/null
@@ -1,1494 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.util.*;
-import org.eclipse.core.internal.runtime.*;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.core.runtime.jobs.IJobManager;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.preferences.IPreferencesService;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.osgi.service.debug.DebugOptions;
-import org.eclipse.osgi.service.environment.EnvironmentInfo;
-import org.eclipse.osgi.service.resolver.PlatformAdmin;
-import org.osgi.framework.Bundle;
-import org.osgi.service.packageadmin.PackageAdmin;
-
-/**
- * The central class of the Eclipse Platform Runtime. This class cannot
- * be instantiated or subclassed by clients; all functionality is provided 
- * by static methods.  Features include:
- * <ul>
- * <li>the platform registry of installed plug-ins</li>
- * <li>the platform adapter manager</li>
- * <li>the platform log</li>
- * <li>the authorization info management</li>
- * </ul>
- */
-public final class Platform {
-
-	/**
-	 * The unique identifier constant (value "<code>org.eclipse.core.runtime</code>")
-	 * of the Core Runtime (pseudo-) plug-in.
-	 */
-	public static final String PI_RUNTIME = "org.eclipse.core.runtime"; //$NON-NLS-1$
-
-	/** 
-	 * The simple identifier constant (value "<code>applications</code>") of
-	 * the extension point of the Core Runtime plug-in where plug-ins declare
-	 * the existence of runnable applications. A plug-in may define any
-	 * number of applications; however, the platform is only capable
-	 * of running one application at a time.
-	 * 
-	 */
-	public static final String PT_APPLICATIONS = "applications"; //$NON-NLS-1$
-
-	/** 
-	 * The simple identifier constant (value "<code>adapters</code>") of
-	 * the extension point of the Core Runtime plug-in where plug-ins declare
-	 * the existence of adapter factories. A plug-in may define any
-	 * number of adapters.
-	 * 
-	 * @see IAdapterManager#hasAdapter(Object, String)
-	 * @since 3.0
-	 */
-	public static final String PT_ADAPTERS = "adapters"; //$NON-NLS-1$
-
-	/** 
-	 * The simple identifier constant (value "<code>preferences</code>") of
-	 * the extension point of the Core Runtime plug-in where plug-ins declare
-	 * extensions to the preference facility. A plug-in may define any number
-	 * of preference extensions.
-	 * 
-	 * @see #getPreferencesService()
-	 * @since 3.0
-	 */
-	public static final String PT_PREFERENCES = Preferences.PT_PREFERENCES;
-
-	/** 
-	 * The simple identifier constant (value "<code>products</code>") of
-	 * the extension point of the Core Runtime plug-in where plug-ins declare
-	 * the existence of a product. A plug-in may define any
-	 * number of products; however, the platform is only capable
-	 * of running one product at a time.
-	 * 
-	 * @see #getProduct()
-	 * @since 3.0
-	 */
-	public static final String PT_PRODUCT = "products"; //$NON-NLS-1$
-
-	/** 
-	 * Debug option value denoting the time at which the platform runtime
-	 * was started.  This constant can be used in conjunction with
-	 * <code>getDebugOption</code> to find the string value of
-	 * <code>System.currentTimeMillis()</code> when the platform was started.
-	 */
-	public static final String OPTION_STARTTIME = PI_RUNTIME + "/starttime"; //$NON-NLS-1$
-
-	/**
-	 * Name of a preference for configuring the performance level for this system.
-	 *
-	 * <p>
-	 * This value can be used by all components to customize features to suit the 
-	 * speed of the user's machine.  The platform job manager uses this value to make
-	 * scheduling decisions about background jobs.
-	 * </p>
-	 * <p>
-	 * The preference value must be an integer between the constant values
-	 * MIN_PERFORMANCE and MAX_PERFORMANCE
-	 * </p>
-	 * @see #MIN_PERFORMANCE
-	 * @see #MAX_PERFORMANCE
-	 * @since 3.0
-	 */
-	public static final String PREF_PLATFORM_PERFORMANCE = "runtime.performance"; //$NON-NLS-1$
-
-	/**
-	 * Constant (value "line.separator") name of the preference used for storing 
-	 * the line separator. 
-	 * 
-	 * @see #knownPlatformLineSeparators
-	 * @since 3.1
-	 */
-	public static final String PREF_LINE_SEPARATOR = "line.separator"; //$NON-NLS-1$
-
-	/** 
-	 * Constant (value 1) indicating the minimum allowed value for the 
-	 * <code>PREF_PLATFORM_PERFORMANCE</code> preference setting.
-	 * @since 3.0
-	 */
-	public static final int MIN_PERFORMANCE = 1;
-
-	/** 
-	 * Constant (value 5) indicating the maximum allowed value for the 
-	 * <code>PREF_PLATFORM_PERFORMANCE</code> preference setting.
-	 * @since 3.0
-	 */
-	public static final int MAX_PERFORMANCE = 5;
-
-	/** 
-	 * Status code constant (value 1) indicating a problem in a plug-in
-	 * manifest (<code>plugin.xml</code>) file.
-	 */
-	public static final int PARSE_PROBLEM = 1;
-
-	/**
-	 * Status code constant (value 2) indicating an error occurred while running a plug-in.
-	 */
-	public static final int PLUGIN_ERROR = 2;
-
-	/**
-	 * Status code constant (value 3) indicating an error internal to the
-	 * platform has occurred.
-	 */
-	public static final int INTERNAL_ERROR = 3;
-
-	/**
-	 * Status code constant (value 4) indicating the platform could not read
-	 * some of its metadata.
-	 */
-	public static final int FAILED_READ_METADATA = 4;
-
-	/**
-	 * Status code constant (value 5) indicating the platform could not write
-	 * some of its metadata.
-	 */
-	public static final int FAILED_WRITE_METADATA = 5;
-
-	/**
-	 * Status code constant (value 6) indicating the platform could not delete
-	 * some of its metadata.
-	 */
-	public static final int FAILED_DELETE_METADATA = 6;
-
-	/**
-	 * Constant string (value "win32") indicating the platform is running on a
-	 * Window 32-bit operating system (e.g., Windows 98, NT, 2000).
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String OS_WIN32 = "win32";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "linux") indicating the platform is running on a
-	 * Linux-based operating system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String OS_LINUX = "linux";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "aix") indicating the platform is running on an
-	 * AIX-based operating system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String OS_AIX = "aix";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "solaris") indicating the platform is running on a
-	 * Solaris-based operating system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String OS_SOLARIS = "solaris";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "hpux") indicating the platform is running on an
-	 * HP/UX-based operating system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String OS_HPUX = "hpux";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "qnx") indicating the platform is running on a
-	 * QNX-based operating system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String OS_QNX = "qnx";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "macosx") indicating the platform is running on a
-	 * Mac OS X operating system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String OS_MACOSX = "macosx";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "unknown") indicating the platform is running on a
-	 * machine running an unknown operating system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String OS_UNKNOWN = "unknown";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "x86") indicating the platform is running on an
-	 * x86-based architecture.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String ARCH_X86 = "x86";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "PA_RISC") indicating the platform is running on an
-	 * PA_RISC-based architecture.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String ARCH_PA_RISC = "PA_RISC";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "ppc") indicating the platform is running on an
-	 * PowerPC-based architecture.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String ARCH_PPC = "ppc";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "sparc") indicating the platform is running on an
-	 * Sparc-based architecture.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String ARCH_SPARC = "sparc";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "x86_64") indicating the platform is running on an
-	 * x86 64bit-based architecture.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String ARCH_X86_64 = "x86_64";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "amd64") indicating the platform is running on an
-	 * AMD64-based architecture.
-	 * 
-	 * @since 3.0
-	 * @deprecated use <code>ARCH_X86_64</code> instead. Note the values
-	 * has been changed to be the value of the <code>ARCH_X86_64</code> constant.
-	 */
-	public static final String ARCH_AMD64 = ARCH_X86_64;
-
-	/**
-	 * Constant string (value "ia64") indicating the platform is running on an
-	 * IA64-based architecture.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String ARCH_IA64 = "ia64"; //$NON-NLS-1$
-
-	/**
-	 * Constant string (value "ia64_32") indicating the platform is running on an
-	 * IA64 32bit-based architecture.
-	 * 
-	 * @since 3.1
-	 */
-	public static final String ARCH_IA64_32 = "ia64_32";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "win32") indicating the platform is running on a
-	 * machine using the Windows windowing system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String WS_WIN32 = "win32";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "motif") indicating the platform is running on a
-	 * machine using the Motif windowing system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String WS_MOTIF = "motif";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "gtk") indicating the platform is running on a
-	 * machine using the GTK windowing system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String WS_GTK = "gtk";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "photon") indicating the platform is running on a
-	 * machine using the Photon windowing system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String WS_PHOTON = "photon";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "carbon") indicating the platform is running on a
-	 * machine using the Carbon windowing system (Mac OS X).
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String WS_CARBON = "carbon";//$NON-NLS-1$
-
-	/**
-	 * Constant string (value "unknown") indicating the platform is running on a
-	 * machine running an unknown windowing system.
-	 * <p>
-	 * Note this constant has been moved from the deprecated 
-	 * org.eclipse.core.boot.BootLoader class and its value has not changed.
-	 * </p>
-	 * @since 3.0
-	 */
-	public static final String WS_UNKNOWN = "unknown";//$NON-NLS-1$
-
-	// private constants for platform line separators and their associated platform names
-	private static final String LINE_SEPARATOR_KEY_MAC_OS_9 = Messages.line_separator_platform_mac_os_9;
-	private static final String LINE_SEPARATOR_KEY_UNIX = Messages.line_separator_platform_unix;
-	private static final String LINE_SEPARATOR_KEY_WINDOWS = Messages.line_separator_platform_windows;
-
-	private static final String LINE_SEPARATOR_VALUE_CR = "\r"; //$NON-NLS-1$
-	private static final String LINE_SEPARATOR_VALUE_LF = "\n"; //$NON-NLS-1$
-	private static final String LINE_SEPARATOR_VALUE_CRLF = "\r\n"; //$NON-NLS-1$
-
-	/**
-	 * Private constructor to block instance creation.
-	 */
-	private Platform() {
-		super();
-	}
-
-	/**
-	 * Adds the given authorization information to the key ring. The
-	 * information is relevant for the specified protection space and the
-	 * given authorization scheme. The protection space is defined by the
-	 * combination of the given server URL and realm. The authorization 
-	 * scheme determines what the authorization information contains and how 
-	 * it should be used. The authorization information is a <code>Map</code> 
-	 * of <code>String</code> to <code>String</code> and typically
-	 * contains information such as user names and passwords.
-	 *
-	 * @param serverUrl the URL identifying the server for this authorization
-	 *		information. For example, "http://www.example.com/".
-	 * @param realm the subsection of the given server to which this
-	 *		authorization information applies.  For example,
-	 *		"realm1@example.com" or "" for no realm.
-	 * @param authScheme the scheme for which this authorization information
-	 *		applies. For example, "Basic" or "" for no authorization scheme
-	 * @param info a <code>Map</code> containing authorization information 
-	 *		such as user names and passwords (key type : <code>String</code>, 
-	 *		value type : <code>String</code>)
-	 * @exception CoreException if there are problems setting the
-	 *		authorization information. Reasons include:
-	 * <ul>
-	 * <li>The keyring could not be saved.</li>
-	 * </ul>
-	 * XXX Move to a plug-in to be defined (JAAS plugin).
-	 */
-	public static void addAuthorizationInfo(URL serverUrl, String realm, String authScheme, Map info) throws CoreException {
-		InternalPlatform.getDefault().addAuthorizationInfo(serverUrl, realm, authScheme, info);
-	}
-
-	/** 
-	 * Adds the given log listener to the notification list of the platform.
-	 * <p>
-	 * Once registered, a listener starts receiving notification as entries
-	 * are added to plug-in logs via <code>ILog.log()</code>. The listener continues to
-	 * receive notifications until it is replaced or removed.
-	 * </p>
-	 *
-	 * @param listener the listener to register
-	 * @see ILog#addLogListener(ILogListener)
-	 * @see #removeLogListener(ILogListener)
-	 * XXX Use the LogMgr service.
-	 */
-	public static void addLogListener(ILogListener listener) {
-		InternalPlatform.getDefault().addLogListener(listener);
-	}
-
-	/**
-	 * Adds the specified resource to the protection space specified by the
-	 * given realm. All targets at or deeper than the depth of the last
-	 * symbolic element in the path of the given resource URL are assumed to
-	 * be in the same protection space.
-	 *
-	 * @param resourceUrl the URL identifying the resources to be added to
-	 *		the specified protection space. For example,
-	 *		"http://www.example.com/folder/".
-	 * @param realm the name of the protection space. For example,
-	 *		"realm1@example.com"
-	 * @exception CoreException if there are problems setting the
-	 *		authorization information. Reasons include:
-	 * <ul>
-	 * <li>The key ring could not be saved.</li>
-	 * </ul>
-	 * XXX Move to a plug-in to be defined (JAAS plugin).
-	 */
-	public static void addProtectionSpace(URL resourceUrl, String realm) throws CoreException {
-		InternalPlatform.getDefault().addProtectionSpace(resourceUrl, realm);
-	}
-
-	/**
-	 * Returns a URL that is the local equivalent of the
-	 * supplied URL. This method is expected to be used with the
-	 * plug-in-relative URLs returned by IPluginDescriptor, Bundle.getEntry()
-	 * and Platform.find().
-	 * If the specified URL is not a plug-in-relative URL, it 
-	 * is returned as is. If the specified URL is a plug-in-relative
-	 * URL of a file (including .jar archive), it is returned as 
-	 * a locally accessible URL using "file:" protocol
-	 * (extracting/caching the file locally, if required). If the specified URL
-	 * is a plug-in-relative URL of a directory, the directory and any files and directories
-	 * under it are made locally accessible likewise. 
-	 *
-	 * @param url original plug-in-relative URL.
-	 * @return the resolved URL
-	 * @exception IOException if unable to resolve URL
-	 * @see #resolve(URL)
-	 * @see #find(Bundle, IPath)
-	 * @see Bundle#getEntry(String)
-	 * @deprecated use {@link FileLocator#toFileURL(URL)} instead
-	 */
-	public static URL asLocalURL(URL url) throws IOException {
-		return FileLocator.toFileURL(url);
-	}
-
-	/**
-	 * Takes down the splash screen if one was put up.
-	 * XXX this is application life cycle. Need to have the appropriate method on IApplication.
-	 */
-	public static void endSplash() {
-		InternalPlatform.getDefault().endSplash();
-	}
-
-	/**
-	 * Removes the authorization information for the specified protection
-	 * space and given authorization scheme. The protection space is defined
-	 * by the given server URL and realm.
-	 *
-	 * @param serverUrl the URL identifying the server to remove the
-	 *		authorization information for. For example,
-	 *		"http://www.example.com/".
-	 * @param realm the subsection of the given server to remove the
-	 *		authorization information for. For example,
-	 *		"realm1@example.com" or "" for no realm.
-	 * @param authScheme the scheme for which the authorization information
-	 *		to remove applies. For example, "Basic" or "" for no
-	 *		authorization scheme.
-	 * @exception CoreException if there are problems removing the
-	 *		authorization information. Reasons include:
-	 * <ul>
-	 * <li>The keyring could not be saved.</li>
-	 * </ul>
-	 * XXX Move to a plug-in to be defined (JAAS plugin).
-	 */
-	public static void flushAuthorizationInfo(URL serverUrl, String realm, String authScheme) throws CoreException {
-		InternalPlatform.getDefault().flushAuthorizationInfo(serverUrl, realm, authScheme);
-	}
-
-	/**
-	 * Returns the adapter manager used for extending
-	 * <code>IAdaptable</code> objects.
-	 *
-	 * @return the adapter manager for this platform
-	 * @see IAdapterManager
-	 * XXX register as a service (same pattern than Jobs)
-	 * Do we want to make it available as a singleton?
-	 */
-	public static IAdapterManager getAdapterManager() {
-		return InternalPlatform.getDefault().getAdapterManager();
-	}
-
-	/**
-	 * Returns the authorization information for the specified protection
-	 * space and given authorization scheme. The protection space is defined
-	 * by the given server URL and realm. Returns <code>null</code> if no
-	 * such information exists.
-	 *
-	 * @param serverUrl the URL identifying the server for the authorization
-	 *		information. For example, "http://www.example.com/".
-	 * @param realm the subsection of the given server to which the
-	 *		authorization information applies.  For example,
-	 *		"realm1@example.com" or "" for no realm.
-	 * @param authScheme the scheme for which the authorization information
-	 *		applies. For example, "Basic" or "" for no authorization scheme
-	 * @return the authorization information for the specified protection
-	 *		space and given authorization scheme, or <code>null</code> if no
-	 *		such information exists
-	 *XXX Move to a plug-in to be defined (JAAS plugin).
-	 */
-	public static Map getAuthorizationInfo(URL serverUrl, String realm, String authScheme) {
-		return InternalPlatform.getDefault().getAuthorizationInfo(serverUrl, realm, authScheme);
-	}
-
-	/**
-	 * Returns the command line args provided to the Eclipse runtime layer when it was first run.
-	 * The returned value does not include arguments consumed by the lower levels of Eclipse
-	 * (e.g., OSGi or the launcher).
-	 * Note that individual platform runnables may be provided with different arguments
-	 * if they are being run individually rather than with <code>Platform.run()</code>.
-	 * <p>
-	 * Clients are also able to acquire the {@link EnvironmentInfo} service and query it for
-	 * the command-line arguments.
-	 * </p>
-	 * @return the command line used to start the platform
-	 */
-	public static String[] getCommandLineArgs() {
-		return InternalPlatform.getDefault().getCommandLineArgs();
-	}
-
-	/**
-	 * Returns the content type manager.
-	 * <p>
-	 * Clients are also able to acquire the {@link IContentTypeManager} service.
-	 * </p>
-	 * @return the content type manager
-	 * @since 3.0
-	 */
-	public static IContentTypeManager getContentTypeManager() {
-		return InternalPlatform.getDefault().getContentTypeManager();
-	}
-
-	/**
-	 * Returns the identified option.  <code>null</code>
-	 * is returned if no such option is found.   Options are specified
-	 * in the general form <i>&lt;plug-in id&gt;/&lt;option-path&gt;</i>.  
-	 * For example, <code>org.eclipse.core.runtime/debug</code>
-	 * <p>
-	 * Clients are also able to acquire the {@link DebugOptions} service
-	 * and query it for debug options.
-	 * </p>
-	 * @param option the name of the option to lookup
-	 * @return the value of the requested debug option or <code>null</code>
-	 */
-	public static String getDebugOption(String option) {
-		return InternalPlatform.getDefault().getOption(option);
-	}
-
-	/**
-	 * Returns the location of the platform working directory.  
-	 * <p>
-	 * Callers of this method should consider using <code>getInstanceLocation</code>
-	 * instead.  In various, typically non IDE-related configurations of Eclipse, the platform
-	 * working directory may not be on the local file system.  As such, the more general
-	 * form of this location is as a URL.
-	 * </p><p>
-	 * Alternatively, instead of calling <code>getInstanceLocation</code> clients are 
-	 * able to acquire the {@link Location} service (with the type {@link Location#INSTANCE_FILTER})
-	 * and then change the resulting URL to a path. See the javadoc for <code>getInstanceLocation</code>
-	 * for more details.
-	 * </p>
-	 * @return the location of the platform
-	 * @see #getInstanceLocation()
-	 */
-	public static IPath getLocation() throws IllegalStateException {
-		return InternalPlatform.getDefault().getLocation();
-	}
-
-	/**
-	 * Returns the location of the platform log file.  This file may contain information
-	 * about errors that have previously occurred during this invocation of the Platform.
-	 * <p>
-	 * It is recommended not to keep this value, as the log location may vary when an instance
-	 * location is being set.</p>
-	 * <p>
-	 * Note: it is very important that users of this method do not leave the log
-	 * file open for extended periods of time.  Doing so may prevent others
-	 * from writing to the log file, which could result in important error messages
-	 * being lost.  It is strongly recommended that clients wanting to read the
-	 * log file for extended periods should copy the log file contents elsewhere,
-	 * and immediately close the original file.</p>
-	 * @return the path of the log file on disk.
-	 * 
-	 * XXX  consider making an ILogger interface that listeners can implements and it allows 
-	 * us to implement Platform.getLogLocation()
-	 */
-	public static IPath getLogFileLocation() {
-		return InternalPlatform.getDefault().getMetaArea().getLogLocation();
-	}
-
-	/**
-	 * Returns the plug-in runtime object for the identified plug-in
-	 * or <code>null</code> if no such plug-in can be found.  If
-	 * the plug-in is defined but not yet activated, the plug-in will
-	 * be activated before being returned.
-	 * <p>
-	 * <b>Note</b>: This method is only able to find and return plug-in
-	 * objects for plug-ins described using plugin.xml according to the 
-	 * traditional Eclipse conventions.  Eclipse 3.0 permits plug-ins to be
-	 * described in manifest.mf files and to define their own bundle 
-	 * activators.  Such plug-ins cannot be discovered by this method.</p>
-	 *
-	 * @param id the unique identifier of the desired plug-in 
-	 *		(e.g., <code>"com.example.acme"</code>).
-	 * @return the plug-in runtime object, or <code>null</code>
-	 * @deprecated 
-	 * This method only works if the compatibility layer is installed and must not be used otherwise.
-	 * See the comments on {@link IPluginDescriptor#getPlugin()} for details.
-	 */
-	public static Plugin getPlugin(String id) {
-		try {
-			IPluginRegistry registry = getPluginRegistry();
-			if (registry == null)
-				throw new IllegalStateException();
-			IPluginDescriptor pd = registry.getPluginDescriptor(id);
-			if (pd == null)
-				return null;
-			return pd.getPlugin();
-		} catch (CoreException e) {
-			// TODO log the exception
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the plug-in registry for this platform.
-	 *
-	 * @return the plug-in registry
-	 * @see IPluginRegistry
-	 * @deprecated <code>IPluginRegistry</code> was refactored in Eclipse 3.0.
-	 * This method only works if the compatibility layer is installed and must not be used otherwise.
-	 * See the comments on {@link IPluginRegistry} and its methods for details.
-	 */
-	public static IPluginRegistry getPluginRegistry() {
-		Bundle compatibility = InternalPlatform.getDefault().getBundle(CompatibilityHelper.PI_RUNTIME_COMPATIBILITY);
-		if (compatibility == null)
-			throw new IllegalStateException();
-
-		Class oldInternalPlatform = null;
-		try {
-			oldInternalPlatform = compatibility.loadClass("org.eclipse.core.internal.plugins.InternalPlatform"); //$NON-NLS-1$
-			Method getPluginRegistry = oldInternalPlatform.getMethod("getPluginRegistry", null); //$NON-NLS-1$
-			return (IPluginRegistry) getPluginRegistry.invoke(oldInternalPlatform, null);
-		} catch (Exception e) {
-			//Ignore the exceptions, return null
-		}
-		return null;
-
-	}
-
-	/**
-	 * Returns the location in the local file system of the plug-in 
-	 * state area for the given plug-in.
-	 * The platform must be running.
-	 * <p>
-	 * The plug-in state area is a file directory within the
-	 * platform's metadata area where a plug-in is free to create files.
-	 * The content and structure of this area is defined by the plug-in,
-	 * and the particular plug-in is solely responsible for any files
-	 * it puts there. It is recommended for plug-in preference settings.
-	 * </p>
-	 *
-	 * @param plugin the plug-in whose state location is returned
-	 * @return a local file system path
-	 * @deprecated clients should call <code>getStateLocation</code> instead
-	 */
-	public static IPath getPluginStateLocation(Plugin plugin) {
-		return plugin.getStateLocation();
-	}
-
-	/**
-	 * Returns the protection space (realm) for the specified resource, or
-	 * <code>null</code> if the realm is unknown.
-	 *
-	 * @param resourceUrl the URL of the resource whose protection space is
-	 *		returned. For example, "http://www.example.com/folder/".
-	 * @return the protection space (realm) for the specified resource, or
-	 *		<code>null</code> if the realm is unknown
-	 *	 * XXX Move to a plug-in to be defined (JAAS plugin).
-	 */
-	public static String getProtectionSpace(URL resourceUrl) {
-		return InternalPlatform.getDefault().getProtectionSpace(resourceUrl);
-	}
-
-	/** 
-	 * Removes the indicated (identical) log listener from the notification list
-	 * of the platform.  If no such listener exists, no action is taken.
-	 *
-	 * @param listener the listener to de-register
-	 * @see ILog#removeLogListener(ILogListener)
-	 * @see #addLogListener(ILogListener)
-	 * XXX Use the LogMgr service.
-	 */
-	public static void removeLogListener(ILogListener listener) {
-		InternalPlatform.getDefault().removeLogListener(listener);
-	}
-
-	/**
-	 * Returns a URL which is the resolved equivalent of the
-	 * supplied URL. This method is expected to be used with the
-	 * plug-in-relative URLs returned by IPluginDescriptor, Bundle.getEntry()
-	 * and Platform.find().
-	 * <p>
-	 * If the specified URL is not a plug-in-relative URL, it is returned
-	 * as is. If the specified URL is a plug-in-relative URL, this method
-	 * attempts to reduce the given URL to one which is native to the Java
-	 * class library (eg. file, http, etc). 
-	 * </p><p>
-	 * Note however that users of this API should not assume too much about the
-	 * results of this method.  While it may consistently return a file: URL in certain
-	 * installation configurations, others may result in jar: or http: URLs.
-	 * </p>
-	 * @param url original plug-in-relative URL.
-	 * @return the resolved URL
-	 * @exception IOException if unable to resolve URL
-	 * @see #asLocalURL(URL)
-	 * @see #find(Bundle, IPath)
-	 * @see Bundle#getEntry(String)
-	 * @deprecated use {@link FileLocator#resolve(URL)} instead
-	 */
-	public static URL resolve(URL url) throws IOException {
-		return FileLocator.resolve(url);
-	}
-
-	/**
-	 * Runs the given runnable in a protected mode.   Exceptions
-	 * thrown in the runnable are logged and passed to the runnable's
-	 * exception handler.  Such exceptions are not rethrown by this method.
-	 *
-	 * @param runnable the runnable to run
-	 * @deprecated clients should use <code>SafeRunner#run</code> instead
-	 */
-	public static void run(ISafeRunnable runnable) {
-		SafeRunner.run(runnable);
-	}
-
-	/**
-	 * Returns the platform job manager.
-	 * 
-	 * @return the platform's job manager
-	 * @since 3.0
-	 * XXX deprecate to use Job.getJobManager().
-	 * Does it need to have a service? YES.
-	 */
-	public static IJobManager getJobManager() {
-		return Job.getJobManager();
-		// TODO: deprecate?
-	}
-
-	/**
-	 * Returns the extension registry for this platform.
-	 *
-	 * @return the extension registry
-	 * @see IExtensionRegistry
-	 * @since 3.0
-	 */
-	public static IExtensionRegistry getExtensionRegistry() {
-		return InternalPlatform.getDefault().getRegistry();
-	}
-
-	/**
-	 * Returns a URL for the given path in the given bundle.  Returns <code>null</code> if the URL
-	 * could not be computed or created.
-	 * 
-	 * @param bundle the bundle in which to search
-	 * @param path path relative to plug-in installation location 
-	 * @return a URL for the given path or <code>null</code>.  The actual form
-	 * of the returned URL is not specified.
-	 * @see #find(Bundle, IPath, Map)
-	 * @see #resolve(URL)
-	 * @see #asLocalURL(URL)
-	 * @since 3.0
-	 * @deprecated use {@link FileLocator#find(Bundle, IPath, Map)}
-	 */
-	public static URL find(Bundle bundle, IPath path) {
-		return FileLocator.find(bundle, path, null);
-	}
-
-	/**
-	 * Returns a URL for the given path in the given bundle.  Returns <code>null</code> if the URL
-	 * could not be computed or created.
-	 * <p>
-	 * find looks for this path in given bundle and any attached fragments.  
-	 * <code>null</code> is returned if no such entry is found.  Note that
-	 * there is no specific order to the fragments.
-	 * </p><p>
-	 * The following arguments may also be used
-	 * <pre>
-	 *     $nl$ - for language specific information
-	 *     $os$ - for operating system specific information
-	 *     $ws$ - for windowing system specific information
-	 * </pre>
-	 * </p><p>
-	 * A path of $nl$/about.properties in an environment with a default 
-	 * locale of en_CA will return a URL corresponding to the first place
-	 * about.properties is found according to the following order:
-	 * <pre>
-	 *     plugin root/nl/en/CA/about.properties
-	 *     fragment1 root/nl/en/CA/about.properties
-	 *     fragment2 root/nl/en/CA/about.properties
-	 *     ...
-	 *     plugin root/nl/en/about.properties
-	 *     fragment1 root/nl/en/about.properties
-	 *     fragment2 root/nl/en/about.properties
-	 *     ...
-	 *     plugin root/about.properties
-	 *     fragment1 root/about.properties
-	 *     fragment2 root/about.properties
-	 *     ...
-	 * </pre>
-	 * </p><p>
-	 * The current environment variable values can be overridden using 
-	 * the override map argument.
-	 * </p>
-	 * 
-	 * @param bundle the bundle in which to search
-	 * @param path file path relative to plug-in installation location
-	 * @param override map of override substitution arguments to be used for
-	 * any $arg$ path elements. The map keys correspond to the substitution
-	 * arguments (eg. "$nl$" or "$os$"). The resulting
-	 * values must be of type java.lang.String. If the map is <code>null</code>,
-	 * or does not contain the required substitution argument, the default
-	 * is used.
-	 * @return a URL for the given path or <code>null</code>.  The actual form
-	 * of the returned URL is not specified.
-	 * @see #resolve(URL)
-	 * @see #asLocalURL(URL)
-	 * @since 3.0
-	 * @deprecated use {@link FileLocator#find(Bundle, IPath, Map)} instead
-	 */
-	public static URL find(Bundle bundle, IPath path, Map override) {
-		return FileLocator.find(bundle, path, override);
-	}
-
-	/**
-	 * Returns the location in the local file system of the 
-	 * plug-in state area for the given bundle.
-	 * If the plug-in state area did not exist prior to this call,
-	 * it is created.
-	 * <p>
-	 * The plug-in state area is a file directory within the
-	 * platform's metadata area where a plug-in is free to create files.
-	 * The content and structure of this area is defined by the plug-in,
-	 * and the particular plug-in is solely responsible for any files
-	 * it puts there. It is recommended for plug-in preference settings and 
-	 * other configuration parameters.
-	 * </p>
-	 *
-	 * @param bundle the bundle whose state location if returned
-	 * @return a local file system path
-	 * @since 3.0
-	 * XXX Investigate the usage of a service factory
-	 */
-	public static IPath getStateLocation(Bundle bundle) {
-		return InternalPlatform.getDefault().getStateLocation(bundle);
-	}
-
-	/**
-	 * Returns a number that changes whenever the set of installed plug-ins
-	 * changes. This can be used for invalidating caches that are based on 
-	 * the set of currently installed plug-ins. (e.g. extensions)
-	 * <p>
-	 * Clients are also able to acquire the {@link PlatformAdmin} service
-	 * and get the timestamp from its state object.
-	 * </p>
-	 * @return a number related to the set of installed plug-ins
-	 * @since 3.1
-	 */
-	public static long getStateStamp() {
-		return InternalPlatform.getDefault().getStateTimeStamp();
-	}
-
-	/**
-	 * Returns the log for the given bundle.  If no such log exists, one is created.
-	 *
-	 * @param bundle the bundle whose log is returned
-	 * @return the log for the given bundle
-	 * @since 3.0
-	 * XXX change this into a LogMgr service that would keep track of the map. See if it can be a service factory.
-	 * It would contain all the methods that are here.
-	 * Relate to RuntimeLog if appropriate.
-	 * The system log listener needs to be optional: turned on or off. What about a system property? :-)
-	 */
-	public static ILog getLog(Bundle bundle) {
-		return InternalPlatform.getDefault().getLog(bundle);
-	}
-
-	/**
-	 * Returns the given bundle's resource bundle for the current locale. 
-	 * <p>
-	 * This resource bundle is typically stored as the plugin.properties file 
-	 * in the plug-in itself, and contains any translatable strings used in the 
-	 * plug-in manifest file (plugin.xml).
-	 * </p>
-	 * <p>
-	 * 	This mechanism is intended only for 
-	 * externalizing strings found in the plug-in manifest file. Using this 
-	 * method for externalizing strings in your code may result in degraded 
-	 * memory performance.
-	 * </p>
-	 *
-	 * @param bundle the bundle whose resource bundle is being queried
-	 * @return the resource bundle
-	 * @exception MissingResourceException if the resource bundle was not found
-	 * @since 3.0
-	 * XXX this is deprecated. use NLS or BundleFinder.find()
-	 */
-	public static ResourceBundle getResourceBundle(Bundle bundle) throws MissingResourceException {
-		return InternalPlatform.getDefault().getResourceBundle(bundle);
-	}
-
-	/**
-	 * Returns a resource string corresponding to the given argument value.
-	 * If the argument value specifies a resource key, the string
-	 * is looked up in the default resource bundle for the given runtime bundle. If the argument does not
-	 * specify a valid key, the argument itself is returned as the
-	 * resource string. The key lookup is performed in the
-	 * file referenced in the Bundle-Localization header of the bundle manifest. If a resource string 
-	 * corresponding to the key is not found in the resource bundle
-	 * the key value, or any default text following the key in the
-	 * argument value is returned as the resource string.
-	 * A key is identified as a string beginning with the "%" character.
-	 * Note, that the "%" character is stripped off prior to lookup
-	 * in the resource bundle.
-	 * <p>
-	 * Equivalent to <code>getResourceString(bundle, value, getResourceBundle())</code>
-	 * </p>
-	 *
-	 * @param bundle the bundle whose resource bundle is being queried
-	 * @param value the value to look for
-	 * @return the resource string
-	 * @see #getResourceBundle(Bundle)
-	 * @since 3.0
-	 * XXX this is deprecated. use NLS or  BundleFinder.find()
-	 */
-	public static String getResourceString(Bundle bundle, String value) {
-		return InternalPlatform.getDefault().getResourceString(bundle, value);
-	}
-
-	/**
-	 * Returns a resource string corresponding to the given argument 
-	 * value and resource bundle in the given runtime bundle.
-	 * If the argument value specifies a resource key, the string
-	 * is looked up in the given resource bundle. If the argument does not
-	 * specify a valid key, the argument itself is returned as the
-	 * resource string. The key lookup is performed against the
-	 * specified resource bundle. If a resource string 
-	 * corresponding to the key is not found in the resource bundle
-	 * the key value, or any default text following the key in the
-	 * argument value is returned as the resource string.
-	 * A key is identified as a string beginning with the "%" character.
-	 * Note that the "%" character is stripped off prior to lookup
-	 * in the resource bundle.
-	 * <p>
-	 * For example, assume resource bundle plugin.properties contains
-	 * name = Project Name
-	 * <pre>
-	 *     getResourceString("Hello World") returns "Hello World"</li>
-	 *     getResourceString("%name") returns "Project Name"</li>
-	 *     getResourceString("%name Hello World") returns "Project Name"</li>
-	 *     getResourceString("%abcd Hello World") returns "Hello World"</li>
-	 *     getResourceString("%abcd") returns "%abcd"</li>
-	 *     getResourceString("%%name") returns "%name"</li>
-	 * </pre>
-	 * </p>
-	 *
-	 * @param bundle the bundle whose resource bundle is being queried
-	 * @param value the value
-	 * @param resourceBundle the resource bundle to query
-	 * @return the resource string
-	 * @see #getResourceBundle(Bundle)
-	 * @since 3.0
-	 * XXX this is deprecated. use NLS or  BundleFinder.find()
-	 */
-	public static String getResourceString(Bundle bundle, String value, ResourceBundle resourceBundle) {
-		return InternalPlatform.getDefault().getResourceString(bundle, value, resourceBundle);
-	}
-
-	/**
-	 * Returns the string name of the current system architecture.  
-	 * The value is a user-defined string if the architecture is 
-	 * specified on the command line, otherwise it is the value 
-	 * returned by <code>java.lang.System.getProperty("os.arch")</code>.
-	 * <p>
-	 * Clients are also able to acquire the {@link EnvironmentInfo} service and query it for
-	 * the operating-system architecture.
-	 * </p>
-	 * @return the string name of the current system architecture
-	 * @since 3.0
-	 */
-	public static String getOSArch() {
-		return InternalPlatform.getDefault().getOSArch();
-	}
-
-	/**
-	 * Returns the string name of the current locale for use in finding files
-	 * whose path starts with <code>$nl$</code>.
-	 * <p>
-	 * Clients are also able to acquire the {@link EnvironmentInfo} service and query it for
-	 * the NL.
-	 * </p>
-	 * @return the string name of the current locale
-	 * @since 3.0
-	 */
-	public static String getNL() {
-		return InternalPlatform.getDefault().getNL();
-	}
-
-	/**
-	 * Returns the string name of the current operating system for use in finding
-	 * files whose path starts with <code>$os$</code>.  <code>OS_UNKNOWN</code> is
-	 * returned if the operating system cannot be determined.  
-	 * The value may indicate one of the operating systems known to the platform
-	 * (as specified in <code>knownOSValues</code>) or a user-defined string if
-	 * the operating system name is specified on the command line.
-	 * <p>
-	 * Clients are also able to acquire the {@link EnvironmentInfo} service and query it for
-	 * the operating-system.
-	 * </p>
-	 * @return the string name of the current operating system
-	 * @since 3.0
-	 */
-	public static String getOS() {
-		return InternalPlatform.getDefault().getOS();
-	}
-
-	/**
-	 * Returns the string name of the current window system for use in finding files
-	 * whose path starts with <code>$ws$</code>.  <code>null</code> is returned
-	 * if the window system cannot be determined.
-	 * <p>
-	 * Clients are also able to acquire the {@link EnvironmentInfo} service and query it for
-	 * the windowing system.
-	 * </p>
-	 * @return the string name of the current window system or <code>null</code>
-	 * @since 3.0
-	 */
-	public static String getWS() {
-		return InternalPlatform.getDefault().getWS();
-	}
-
-	/**
-	 * Returns the arguments not consumed by the framework implementation itself.  Which
-	 * arguments are consumed is implementation specific. These arguments are available 
-	 * for use by the application.
-	 * 
-	 * @return the array of command line arguments not consumed by the framework.
-	 * @since 3.0
-	 * XXX Use the Environment info service. Need to see how to set the value of the app args.
-	 */
-	public static String[] getApplicationArgs() {
-		return InternalPlatform.getDefault().getApplicationArgs();
-	}
-
-	/**
-	 * Returns the platform administrator for this running Eclipse.  
-	 * <p>
-	 * Note: This is an internal method and <em>must not</em> 
-	 * be used by clients which are not part of the Eclipse Platform.
-	 * This method allows access to classes which are not Eclipse 
-	 * Platform API but are part of the OSGi runtime that the Eclipse
-	 * Platform is built on. Even as the Eclipse Platform evolves 
-	 * in compatible ways from release to release, the details of 
-	 * the OSGi implementation might not. 
-	 * </p><p>
-	 * Clients can also acquire the {@link PlatformAdmin} service
-	 * to retrieve this object.
-	 * </p>
-	 * @return the platform admin for this instance of Eclipse
-	 * @since 3.0
-	 */
-	public static PlatformAdmin getPlatformAdmin() {
-		return InternalPlatform.getDefault().getPlatformAdmin();
-	}
-
-	/**
-	 * Returns the location of the platform's working directory (also known as the instance data area).  
-	 * <code>null</code> is returned if the platform is running without an instance location.
-	 * <p>
-	 * This method is equivalent to acquiring the <code>org.eclipse.osgi.service.datalocation.Location</code>
-	 * service with the property "type" equal to {@link Location#INSTANCE_FILTER}.
-	 *</p>
-	 * @return the location of the platform's instance data area or <code>null</code> if none
-	 * @since 3.0
-	 * @see Location#INSTANCE_FILTER
-	 */
-	public static Location getInstanceLocation() {
-		return InternalPlatform.getDefault().getInstanceLocation();
-	}
-
-	/**
-	 * Returns the currently registered bundle group providers.
-	 * <p>
-	 * Clients are also able to acquire the {@link IBundleGroupProvider} service and query it for
-	 * the registered bundle group providers.
-	 * </p>
-	 * @return the currently registered bundle group providers
-	 * @since 3.0
-	 */
-	public static IBundleGroupProvider[] getBundleGroupProviders() {
-		return InternalPlatform.getDefault().getBundleGroupProviders();
-	}
-
-	/**
-	 * Return the interface into the preference mechanism. The returned
-	 * object can be used for such operations as searching for preference 
-	 * values across multiple scopes and preference import/export.
-	 * <p>
-	 * Clients are also able to acquire the {@link IPreferencesService} service via
-	 * OSGi mechanisms and use it for preference functions.
-	 * </p>
-	 * @return an object to interface into the preference mechanism
-	 * @since 3.0
-	 */
-	public static IPreferencesService getPreferencesService() {
-		return InternalPlatform.getDefault().getPreferencesService();
-	}
-
-	/**
-	 * Returns the product which was selected when running this Eclipse instance
-	 * or <code>null</code> if none
-	 * @return the current product or <code>null</code> if none
-	 * @since 3.0
-	 * XXX move this into the app model.
-	 */
-	public static IProduct getProduct() {
-		return InternalPlatform.getDefault().getProduct();
-	}
-
-	/**
-	 * Registers the given bundle group provider with the platform.
-	 * <p>
-	 * Clients are also able to use the {@link IBundleGroupProvider} service to
-	 * register themselves as a bundle group provider.
-	 * </p>
-	 * @param provider a provider to register
-	 * @since 3.0
-	 */
-	public static void registerBundleGroupProvider(IBundleGroupProvider provider) {
-		InternalPlatform.getDefault().registerBundleGroupProvider(provider);
-	}
-
-	/**
-	 * De-registers the given bundle group provider with the platform.
-	 * <p>
-	 * Clients are also able to use the {@link IBundleGroupProvider} service mechanism
-	 * for unregistering themselves.
-	 * </p>
-	 * @param provider a provider to de-register
-	 * @since 3.0
-	 * @see #registerBundleGroupProvider(IBundleGroupProvider)
-	 */
-	public static void unregisterBundleGroupProvider(IBundleGroupProvider provider) {
-		InternalPlatform.getDefault().unregisterBundleGroupProvider(provider);
-	}
-
-	/**
-	 * Returns the location of the configuration information 
-	 * used to run this instance of Eclipse.  The configuration area typically
-	 * contains the list of plug-ins available for use, various settings
-	 * (those shared across different instances of the same configuration)
-	 * and any other such data needed by plug-ins.
-	 * <code>null</code> is returned if the platform is running without a configuration location.
-	 * <p>
-	 * This method is equivalent to acquiring the <code>org.eclipse.osgi.service.datalocation.Location</code>
-	 * service with the property "type" equal to {@link Location#CONFIGURATION_FILTER}.
-	 *</p>
-	 * @return the location of the platform's configuration data area or <code>null</code> if none
-	 * @since 3.0
-	 * @see Location#CONFIGURATION_FILTER
-	 */
-	public static Location getConfigurationLocation() {
-		return InternalPlatform.getDefault().getConfigurationLocation();
-	}
-
-	/**
-	 * Returns the location of the platform's user data area.  The user data area is a location on the system
-	 * which is specific to the system's current user.  By default it is located relative to the 
-	 * location given by the System property "user.home".  
-	 * <code>null</code> is returned if the platform is running without an user location.
-	 * <p>
-	 * This method is equivalent to acquiring the <code>org.eclipse.osgi.service.datalocation.Location</code>
-	 * service with the property "type" equal to {@link Location#USER_FILTER}.
-	 *</p>
-	 * @return the location of the platform's user data area or <code>null</code> if none
-	 * @since 3.0
-	 * @see Location#USER_FILTER
-	 */
-	public static Location getUserLocation() {
-		return InternalPlatform.getDefault().getUserLocation();
-	}
-
-	/**
-	 * Returns the location of the base installation for the running platform
-	 * <code>null</code> is returned if the platform is running without a configuration location.
-	 * <p>
-	 * This method is equivalent to acquiring the <code>org.eclipse.osgi.service.datalocation.Location</code>
-	 * service with the property "type" equal to {@link Location#INSTALL_FILTER}.
-	 *</p>
-	 * @return the location of the platform's installation area or <code>null</code> if none
-	 * @since 3.0
-	 * @see Location#INSTALL_FILTER
-	 */
-	public static Location getInstallLocation() {
-		return InternalPlatform.getDefault().getInstallLocation();
-	}
-
-	/**
-	 * Checks if the specified bundle is a fragment bundle.
-	 * <p>
-	 * Clients are also able to acquire the {@link PackageAdmin} service
-	 * to query if the given bundle is a fragment by asking for the bundle type
-	 * and checking against constants on the service interface.
-	 * </p>
-	 * @param bundle the bundle to query
-	 * @return true if the specified bundle is a fragment bundle; otherwise false is returned.
-	 * @since 3.0
-	 */
-	public static boolean isFragment(Bundle bundle) {
-		return InternalPlatform.getDefault().isFragment(bundle);
-	}
-
-	/**
-	 * Returns an array of attached fragment bundles for the specified bundle.  If the 
-	 * specified bundle is a fragment then <tt>null</tt> is returned.  If no fragments are 
-	 * attached to the specified bundle then <tt>null</tt> is returned.
-	 * <p>
-	 * Clients are also able to acquire the {@link PackageAdmin} service and query
-	 * it for the fragments of the given bundle.
-	 * </p>
-	 * @param bundle the bundle to get the attached fragment bundles for.
-	 * @return an array of fragment bundles or <tt>null</tt> if the bundle does not 
-	 * have any attached fragment bundles. 
-	 * @since 3.0
-	 */
-	public static Bundle[] getFragments(Bundle bundle) {
-		return InternalPlatform.getDefault().getFragments(bundle);
-	}
-
-	/**
-	 * Returns the resolved bundle with the specified symbolic name that has the
-	 * highest version.  If no resolved bundles are installed that have the 
-	 * specified symbolic name then null is returned.
-	 * <p>
-	 * Clients are also able to acquire the {@link PackageAdmin} service and query
-	 * it for the bundle with the specified symbolic name. Clients can ask the
-	 * service for all bundles with that particular name and then determine the
-	 * one with the highest version. Note that clients may want to filter
-	 * the results based on the state of the bundles.
-	 * </p>
-	 * @param symbolicName the symbolic name of the bundle to be returned.
-	 * @return the bundle that has the specified symbolic name with the 
-	 * highest version, or <tt>null</tt> if no bundle is found.
-	 * @since 3.0
-	 */
-	public static Bundle getBundle(String symbolicName) {
-		return InternalPlatform.getDefault().getBundle(symbolicName);
-	}
-
-	/**
-	 * Returns all bundles with the specified symbolic name.  If no resolved bundles 
-	 * with the specified symbolic name can be found, <tt>null</tt> is returned.  
-	 * If the version argument is not null then only the Bundles that have 
-	 * the specified symbolic name and a version greater than or equal to the 
-	 * specified version are returned. The returned bundles are ordered in 
-	 * descending bundle version order.
-	 * <p>
-	 * Clients are also able to acquire the {@link PackageAdmin} service and query
-	 * it for all bundle versions with the given symbolic name, after turning the
-	 * specific version into a version range. Note that clients may want to filter
-	 * the results based on the state of the bundles.
-	 * </p>
-	 * @param symbolicName the symbolic name of the bundles that are to be returned.
-	 * @param version the version that the return bundle versions must match, 
-	 * or <tt>null</tt> if no version matching is to be done. 
-	 * @return the array of Bundles with the specified name that match the 
-	 * specified version and match rule, or <tt>null</tt> if no bundles are found.
-	 */
-	public static Bundle[] getBundles(String symbolicName, String version) {
-		return InternalPlatform.getDefault().getBundles(symbolicName, version);
-	}
-
-	/**
-	 * Returns an array of host bundles that the specified fragment bundle is 
-	 * attached to or <tt>null</tt> if the specified bundle is not attached to a host.  
-	 * If the bundle is not a fragment bundle then <tt>null</tt> is returned.
-	 * <p>
-	 * Clients are also able to acquire the {@link PackageAdmin} service and query
-	 * it for the hosts for the given bundle.
-	 * </p>
-	 * @param bundle the bundle to get the host bundles for.
-	 * @return an array of host bundles or null if the bundle does not have any
-	 * host bundles.
-	 * @since 3.0
-	 */
-	public static Bundle[] getHosts(Bundle bundle) {
-		return InternalPlatform.getDefault().getHosts(bundle);
-	}
-
-	/**
-	 * Returns whether the platform is running.
-	 *
-	 * @return <code>true</code> if the platform is running, 
-	 *		and <code>false</code> otherwise
-	 *@since 3.0
-	 *XXX do what you want to do. track osgi, track runtime, or whatever.
-	 */
-	public static boolean isRunning() {
-		return InternalPlatform.getDefault().isRunning();
-	}
-
-	/**
-	 * Returns a list of known system architectures.
-	 * <p>
-	 * Note that this list is not authoritative; there may be legal values
-	 * not included in this list. Indeed, the value returned by 
-	 * <code>getOSArch</code> may not be in this list. Also, this list may 
-	 * change over time as Eclipse comes to run on more operating environments.
-	 * </p>
-	 * 
-	 * @return the list of system architectures known to the system
-	 * @see #getOSArch()
-	 * @since 3.0
-	 * XXX This is useless
-	 */
-	public static String[] knownOSArchValues() {
-		return InternalPlatform.getDefault().knownOSArchValues();
-	}
-
-	/**
-	 * Returns a list of known operating system names.
-	 * <p>
-	 * Note that this list is not authoritative; there may be legal values
-	 * not included in this list. Indeed, the value returned by 
-	 * <code>getOS</code> may not be in this list. Also, this list may 
-	 * change over time as Eclipse comes to run on more operating environments.
-	 * </p>
-	 * 
-	 * @return the list of operating systems known to the system
-	 * @see #getOS()
-	 * @since 3.0
-	 * XXX This is useless
-	 */
-	public static String[] knownOSValues() {
-		return InternalPlatform.getDefault().knownOSValues();
-	}
-
-	/**
-	 * Returns a map of known platform line separators. The keys are 
-	 * translated names of platforms and the values are their associated 
-	 * line separator strings.
-	 * 
-	 * @return a map of platform to their line separator string
-	 * @since 3.1
-	 */
-	public static Map knownPlatformLineSeparators() {
-		Map result = new HashMap();
-		result.put(LINE_SEPARATOR_KEY_MAC_OS_9, LINE_SEPARATOR_VALUE_CR);
-		result.put(LINE_SEPARATOR_KEY_UNIX, LINE_SEPARATOR_VALUE_LF);
-		result.put(LINE_SEPARATOR_KEY_WINDOWS, LINE_SEPARATOR_VALUE_CRLF);
-		return result;
-	}
-
-	/**
-	 * Returns a list of known windowing system names.
-	 * <p>
-	 * Note that this list is not authoritative; there may be legal values
-	 * not included in this list. Indeed, the value returned by 
-	 * <code>getWS</code> may not be in this list. Also, this list may 
-	 * change over time as Eclipse comes to run on more operating environments.
-	 * </p>
-	 * 
-	 * @return the list of window systems known to the system
-	 * @see #getWS()
-	 * @since 3.0
-	 * XXX This is useless
-	 */
-	public static String[] knownWSValues() {
-		return InternalPlatform.getDefault().knownWSValues();
-	}
-
-	/**
-	 * Returns <code>true</code> if the platform is currently running in 
-	 * debug mode.  The platform is typically put in debug mode using the
-	 * "-debug" command line argument.
-	 * <p>
-	 * Clients are also able to acquire the {@link EnvironmentInfo} service and query it 
-	 * to see if they are in debug mode.
-	 * </p>
-	 * @return whether or not the platform is running in debug mode
-	 * @since 3.0
-	 */
-	public static boolean inDebugMode() {
-		return PlatformActivator.getContext().getProperty("osgi.debug") != null; //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns <code>true</code> if the platform is currently running in 
-	 * development mode.  That is, if special procedures are to be 
-	 * taken when defining plug-in class paths.  The platform is typically put in 
-	 * development mode using the "-dev" command line argument.
-	 * <p>
-	 * Clients are also able to acquire the {@link EnvironmentInfo} service and query it
-	 * to see if they are in development mode.
-	 * </p>
-	 * @return whether or not the platform is running in development mode
-	 * @since 3.0
-	 */
-	public static boolean inDevelopmentMode() {
-		return PlatformActivator.getContext().getProperty("osgi.dev") != null; //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Plugin.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Plugin.java
deleted file mode 100644
index 3f90cc4..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Plugin.java
+++ /dev/null
@@ -1,738 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-import java.io.*;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.util.Map;
-import org.eclipse.core.internal.preferences.PreferenceForwarder;
-import org.eclipse.core.internal.runtime.*;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.*;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * The abstract superclass of all plug-in runtime class
- * implementations. A plug-in subclasses this class and overrides
- * the appropriate life cycle methods in order to react to the life cycle 
- * requests automatically issued by the platform.
- * For compatibility reasons, the methods called for those life cycle events 
- * vary, please see the "Constructors and life cycle methods" section below. 
- *  
- * <p>
- * Conceptually, the plug-in runtime class represents the entire plug-in
- * rather than an implementation of any one particular extension the
- * plug-in declares. A plug-in is not required to explicitly
- * specify a plug-in runtime class; if none is specified, the plug-in
- * will be given a default plug-in runtime object that ignores all life 
- * cycle requests (it still provides access to the corresponding
- * plug-in descriptor).
- * </p>
- * <p>
- * In the case of more complex plug-ins, it may be desirable
- * to define a concrete subclass of <code>Plugin</code>.
- * However, just subclassing <code>Plugin</code> is not
- * sufficient. The name of the class must be explicitly configured
- * in the plug-in's manifest (<code>plugin.xml</code>) file
- * with the class attribute of the <code>&ltplugin&gt</code> element markup.
- * </p>
- * <p>
- * Instances of plug-in runtime classes are automatically created 
- * by the platform in the course of plug-in activation. For compatibility reasons, 
- * the constructor used to create plug-in instances varies, please see the "Constructors 
- * and life cycle methods" section below.
- * </p><p>
- * The concept of bundles underlies plug-ins. However it is safe to regard plug-ins 
- * and bundles as synonyms. 
- * </p>
- * <p>
- * <b>Clients must never explicitly instantiate a plug-in runtime class</b>.
- * </p>
- * <p>
- * A typical implementation pattern for plug-in runtime classes is to
- * provide a static convenience method to gain access to a plug-in's
- * runtime object. This way, code in other parts of the plug-in
- * implementation without direct access to the plug-in runtime object
- * can easily obtain a reference to it, and thence to any plug-in-wide
- * resources recorded on it. An example for Eclipse 3.0 follows:
- * <pre>
- *     package myplugin;
- *     public class MyPluginClass extends Plugin {
- *         private static MyPluginClass instance;
- *
- *         public static MyPluginClass getInstance() { return instance; }
- *
- *         public void MyPluginClass() {
- *             super();
- *             instance = this;
- *             // ... other initialization
- *         }
- *         // ... other methods
- *     }
- * </pre>
- * In the above example, a call to <code>MyPluginClass.getInstance()</code>
- * will always return an initialized instance of <code>MyPluginClass</code>.
- * </p>
- * <p>
- * <b>Constructors and life cycle methods</b> 
- * </p><p>
- * If the plugin.xml of a plug-in indicates &lt;?eclipse version="3.0"?&gt; and its prerequisite
- * list includes <code>org.eclipse.core.runtime</code>, the default constructor of the plug-in 
- * class is used and {@link #start(BundleContext)} and {@link #stop(BundleContext)} are
- * called as life cycle methods.    
- * </p><p>
- * If the plugin.xml of a plug-in indicates &lt;?eclipse version="3.0"?&gt; and its prerequisite list includes
- * <code>org.eclipse.core.runtime.compatibility</code>, the {@link #Plugin(IPluginDescriptor)}
- * constructor is used and {@link #startup()} and {@link #shutdown()} are called as life cycle methods.
- * Note that in this situation, start() is called before startup() and stop() is called
- * after shutdown. 
- * </p><p>
- * If the plugin.xml of your plug-in does <b>not</b> indicate &lt;?eclipse version="3.0"?&gt; it is therefore
- * not a 3.0 plug-in. Consequently the {@link #Plugin(IPluginDescriptor)} is used and {@link #startup()} and 
- * {@link #shutdown()} are called as life cycle methods.
- * </p>
- */
-public abstract class Plugin implements BundleActivator {
-
-	/**
-	 * String constant used for the default scope name for legacy 
-	 * Eclipse plug-in preferences. 
-	 * 
-	 * @since 3.0
-	 */
-	public static final String PLUGIN_PREFERENCE_SCOPE = InstanceScope.SCOPE;
-
-	/**
-	 * The bundle associated this plug-in
-	 */
-	private Bundle bundle;
-
-	/**
-	 * The debug flag for this plug-in.  The flag is false by default.
-	 * It can be set to true either by the plug-in itself or in the platform 
-	 * debug options.
-	 */
-	private boolean debug = false;
-
-	/** The plug-in descriptor.
-	 * @deprecated Marked as deprecated to suppress deprecation warnings.
-	 */
-	private IPluginDescriptor descriptor;
-
-	/**
-	 * The base name (value <code>"preferences"</code>) for the file which is used for
-	 * overriding default preference values.
-	 *   
-	 * @since 2.0
-	 * @see #PREFERENCES_DEFAULT_OVERRIDE_FILE_NAME
-	 */
-	public static final String PREFERENCES_DEFAULT_OVERRIDE_BASE_NAME = "preferences"; //$NON-NLS-1$
-
-	/**
-	 * The name of the file (value <code>"preferences.ini"</code>) in a
-	 * plug-in's (read-only) directory that, when present, contains values that
-	 * override the normal default values for this plug-in's preferences.
-	 * <p>
-	 * The format of the file is as per <code>java.io.Properties</code> where
-	 * the keys are property names and values are strings.
-	 * </p>
-	 * 
-	 * @since 2.0
-	 */
-	public static final String PREFERENCES_DEFAULT_OVERRIDE_FILE_NAME = PREFERENCES_DEFAULT_OVERRIDE_BASE_NAME + ".ini"; //$NON-NLS-1$
-
-	/**
-	 * The preference object for this plug-in; initially <code>null</code>
-	 * meaning not yet created and initialized.
-	 * 
-	 * @since 2.0
-	 */
-	private PreferenceForwarder preferences = null;
-
-	/**
-	 * Creates a new plug-in runtime object.  This method is called by the platform
-	 * if this class is used as a <code>BundleActivator</code>.  This method is not 
-	 * needed/used if this plug-in requires the org.eclipse.core.runtime.compatibility plug-in.  
-	 * Subclasses of <code>Plugin</code> 
-	 * must call this method first in their constructors.  
-	 * 
-	 * The resultant instance is not managed by the runtime and
-	 * so should be remembered by the client (typically using a Singleton pattern).
-	 * <b>Clients must never explicitly call this method.</b>
-	 * </p> 
-	 * <p>
-	 * Note: The class loader typically has monitors acquired during invocation of this method.  It is 
-	 * strongly recommended that this method avoid synchronized blocks or other thread locking mechanisms,
-	 * as this would lead to deadlock vulnerability.
-	 * </p>
-	 * 
-	 * @since 3.0
-	 */
-	public Plugin() {
-		super();
-	}
-
-	/**
-	 * Creates a new plug-in runtime object for the given plug-in descriptor.
-	 * <p>
-	 * Instances of plug-in runtime classes are automatically created 
-	 * by the platform in the course of plug-in activation.
-	 * <b>Clients must never explicitly call this method.</b>
-	 * </p>
-	 * <p>
-	 * Note: The class loader typically has monitors acquired during invocation of this method.  It is 
-	 * strongly recommended that this method avoid synchronized blocks or other thread locking mechanisms,
-	 * as this would lead to deadlock vulnerability.
-	 * </p>
-	 *
-	 * @param descriptor the plug-in descriptor
-	 * @see #getDescriptor()
-	 * @deprecated
-	 * In Eclipse 3.0 this constructor has been replaced by {@link #Plugin()}.
-	 * Implementations of <code>MyPlugin(IPluginDescriptor descriptor)</code> should be changed to 
-	 * <code>MyPlugin()</code> and call <code>super()</code> instead of <code>super(descriptor)</code>.
-	 * The <code>MyPlugin(IPluginDescriptor descriptor)</code> constructor is called only for plug-ins 
-	 * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
-	 */
-	public Plugin(IPluginDescriptor descriptor) {
-		Assert.isNotNull(descriptor);
-		Assert.isTrue(!CompatibilityHelper.hasPluginObject(descriptor), NLS.bind(Messages.plugin_deactivatedLoad, this.getClass().getName(), descriptor.getUniqueIdentifier() + " is not activated")); //$NON-NLS-1$
-		this.descriptor = descriptor;
-
-		// on plugin start, find and start the corresponding bundle.
-		bundle = InternalPlatform.getDefault().getBundle(descriptor.getUniqueIdentifier());
-		try {
-			if ((bundle.getState() & (Bundle.STARTING | Bundle.ACTIVE | Bundle.STOPPING)) == 0)
-				bundle.start();
-		} catch (BundleException e) {
-			String message = NLS.bind(Messages.plugin_startupProblems, descriptor.getUniqueIdentifier());
-			IStatus status = new Status(IStatus.ERROR, Platform.PI_RUNTIME, IStatus.ERROR, message, e);
-			InternalPlatform.getDefault().log(status);
-		}
-	}
-
-	/**
-	 * Returns a URL for the given path.  Returns <code>null</code> if the URL
-	 * could not be computed or created.
-	 * 
-	 * @param path path relative to plug-in installation location 
-	 * @return a URL for the given path or <code>null</code>
-	 * @deprecated use {@link FileLocator#find(Bundle, IPath, Map)}
-	 */
-	public final URL find(IPath path) {
-		return FileLocator.find(bundle, path, null);
-	}
-
-	/**
-	 * Returns a URL for the given path.  Returns <code>null</code> if the URL
-	 * could not be computed or created.
-	 * 
-	 * @param path file path relative to plug-in installation location
-	 * @param override map of override substitution arguments to be used for
-	 * any $arg$ path elements. The map keys correspond to the substitution
-	 * arguments (eg. "$nl$" or "$os$"). The resulting
-	 * values must be of type java.lang.String. If the map is <code>null</code>,
-	 * or does not contain the required substitution argument, the default
-	 * is used.
-	 * @return a URL for the given path or <code>null</code>
-	 * @deprecated use {@link FileLocator#find(Bundle, IPath, Map)}
-	 */
-	public final URL find(IPath path, Map override) {
-		return FileLocator.find(bundle, path, override);
-	}
-
-	/**
-	 * Returns the plug-in descriptor for this plug-in runtime object.
-	 *
-	 * @return the plug-in descriptor for this plug-in runtime object
-	 * @deprecated 
-	 * <code>IPluginDescriptor</code> was refactored in Eclipse 3.0.
-	 * The <code>getDescriptor()</code> method may only be called by plug-ins 
-	 * which explicitly require the org.eclipse.core.runtime.compatibility plug-in.
-	 * See the comments on {@link IPluginDescriptor} and its methods for details.
-	 */
-	public final IPluginDescriptor getDescriptor() {
-		if (descriptor != null)
-			return descriptor;
-
-		return initializeDescriptor(bundle.getSymbolicName());
-	}
-
-	/**
-	 * Returns the log for this plug-in.  If no such log exists, one is created.
-	 *
-	 * @return the log for this plug-in
-	 * XXX change this into a LogMgr service that would keep track of the map. See if it can be a service factory.
-	 */
-	public final ILog getLog() {
-		return InternalPlatform.getDefault().getLog(bundle);
-	}
-
-	/**
-	 * Returns the location in the local file system of the 
-	 * plug-in state area for this plug-in.
-	 * If the plug-in state area did not exist prior to this call,
-	 * it is created.
-	 * <p>
-	 * The plug-in state area is a file directory within the
-	 * platform's metadata area where a plug-in is free to create files.
-	 * The content and structure of this area is defined by the plug-in,
-	 * and the particular plug-in is solely responsible for any files
-	 * it puts there. It is recommended for plug-in preference settings and 
-	 * other configuration parameters.
-	 * </p>
-	 * @throws IllegalStateException, when the system is running with no data area (-data @none),
-	 * or when a data area has not been set yet.
-	 * @return a local file system path
-	 *  XXX Investigate the usage of a service factory (see also platform.getStateLocation)
-	 */
-	public final IPath getStateLocation() throws IllegalStateException {
-		return InternalPlatform.getDefault().getStateLocation(bundle, true);
-	}
-
-	/**
-	 * Returns the preference store for this plug-in.
-	 * <p>
-	 * Note that if an error occurs reading the preference store from disk, an empty 
-	 * preference store is quietly created, initialized with defaults, and returned.
-	 * </p>
-	 * <p>
-	 * Calling this method may cause the preference store to be created and
-	 * initialized. Subclasses which reimplement the 
-	 * <code>initializeDefaultPluginPreferences</code> method have this opportunity
-	 * to initialize preference default values, just prior to processing override
-	 * default values imposed externally to this plug-in (specified for the product,
-	 * or at platform start up).
-	 * </p>
-	 * <p>
-	 * After settings in the preference store are changed (for example, with 
-	 * <code>Preferences.setValue</code> or <code>setToDefault</code>),
-	 * <code>savePluginPreferences</code> should be called to store the changed
-	 * values back to disk. Otherwise the changes will be lost on plug-in
-	 * shutdown.
-	 * </p>
-	 *
-	 * @return the preference store
-	 * @see #savePluginPreferences()
-	 * @see Preferences#setValue(String, String)
-	 * @see Preferences#setToDefault(String)
-	 * @since 2.0
-	 * XXX deprecate since this does not leverage the config, project scopes, etc...
-	 */
-	public final Preferences getPluginPreferences() {
-		if (preferences != null) {
-			if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-				InternalPlatform.message("Plugin preferences already loaded for: " + bundle.getSymbolicName()); //$NON-NLS-1$
-			return preferences;
-		}
-
-		if (InternalPlatform.DEBUG_PLUGIN_PREFERENCES)
-			InternalPlatform.message("Loading preferences for plugin: " + bundle.getSymbolicName()); //$NON-NLS-1$
-		preferences = new PreferenceForwarder(this, bundle.getSymbolicName());
-		return preferences;
-	}
-
-	/**
-	 * Saves preferences settings for this plug-in. Does nothing if the preference
-	 * store does not need saving.
-	 * <p>
-	 * Plug-in preferences are <b>not</b> saved automatically on plug-in shutdown.
-	 * </p>
-	 * 
-	 * @see Preferences#store(OutputStream, String)
-	 * @see Preferences#needsSaving()
-	 * @since 2.0
-	 * XXX deprecate call flush on the node for this bundle on the instance scope
-	 */
-	public final void savePluginPreferences() {
-		// populate the "preferences" instvar. We still might
-		// need to save them because someone else might have
-		// made changes via the OSGi APIs.
-		getPluginPreferences();
-		try {
-			preferences.flush();
-		} catch (BackingStoreException e) {
-			IStatus status = new Status(IStatus.ERROR, Platform.PI_RUNTIME, IStatus.ERROR, Messages.preferences_saveProblems, e);
-			InternalPlatform.getDefault().log(status);
-		}
-	}
-
-	/**
-	 * Initializes the default preferences settings for this plug-in.
-	 * <p>
-	 * This method is called sometime after the preference store for this
-	 * plug-in is created. Default values are never stored in preference
-	 * stores; they must be filled in each time. This method provides the
-	 * opportunity to initialize the default values.
-	 * </p>
-	 * <p>
-	 * The default implementation of this method does nothing. A subclass that needs
-	 * to set default values for its preferences must reimplement this method.
-	 * Default values set at a later point will override any default override
-	 * settings supplied from outside the plug-in (product configuration or
-	 * platform start up).
-	 * </p>
-	 * @since 2.0
-	 * @deprecated
-	 * This method has been refactored in the new preference mechanism 
-	 * to handle the case where the runtime compatibility layer does not exist. The 
-	 * contents of this method should be moved to the method named 
-	 * <code>initializeDefaultPreferences</code> in a separate subclass of 
-	 * {@link org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer}. 
-	 * This class should be contributed via the
-	 * <code>org.eclipse.core.runtime.preferences</code> extension point.
-	 * <pre>
-	 * 	&lt;extension point=&quo;org.eclipse.core.runtime.preferences&quo;&gt;
-	 *			&lt;initializer class=&quo;com.example.MyPreferenceInitializer&quo;/&gt;
-	 *		&lt;/extension&gt;
-	 *		...
-	 *		package com.example;
-	 *		public class MyPreferenceInitializer extends AbstractPreferenceInitializer {
-	 *			public MyPreferenceInitializer() {
-	 *				super();
-	 *			}
-	 *			public void initializeDefaultPreferences() {
-	 *				Preferences node = new DefaultScope().getNode("my.plugin.id");
-	 *				node.put(key, value);
-	 *			}
-	 *		}
-	 * </pre>
-	 */
-	protected void initializeDefaultPluginPreferences() {
-		// default implementation of this method - spec'd to do nothing
-	}
-
-	/**
-	 * Internal method. This method is a hook for
-	 * initialization of default preference values. 
-	 * It should not be called by clients.
-	 * 
-	 * @since 3.0
-	 */
-	public final void internalInitializeDefaultPluginPreferences() {
-		initializeDefaultPluginPreferences();
-	}
-
-	/**
-	 * Returns whether this plug-in is in debug mode.
-	 * By default plug-ins are not in debug mode.  A plug-in can put itself
-	 * into debug mode or the user can set an execution option to do so.
-	 * <p>
-	 * Note that the plug-in's debug flag is initialized when the 
-	 * plug-in is started. The result of calling this method before the plug-in
-	 * has started is unspecified.
-	 * </p>
-	 *
-	 * @return whether this plug-in is in debug mode
-	 * XXX deprecate use the service and cache as needed
-	 */
-	public boolean isDebugging() {
-		return debug;
-	}
-
-	/**
-	 * Returns an input stream for the specified file. The file path
-	 * must be specified relative this the plug-in's installation location.
-	 *
-	 * @param file path relative to plug-in installation location
-	 * @return an input stream
-	 * @exception IOException if the given path cannot be found in this plug-in
-	 * 
-	 * @see #openStream(IPath,boolean)
-	 * @deprecated use {@link FileLocator#openStream(Bundle, IPath, boolean)}
-	 */
-	public final InputStream openStream(IPath file) throws IOException {
-		return FileLocator.openStream(bundle, file, false);
-	}
-
-	/**
-	 * Returns an input stream for the specified file. The file path
-	 * must be specified relative to this plug-in's installation location.
-	 * Optionally, the platform searches for the correct localized version
-	 * of the specified file using the users current locale, and Java
-	 * naming convention for localized resource files (locale suffix appended 
-	 * to the specified file extension).
-	 * <p>
-	 * The caller must close the returned stream when done.
-	 * </p>
-	 *
-	 * @param file path relative to plug-in installation location
-	 * @param localized <code>true</code> for the localized version
-	 *   of the file, and <code>false</code> for the file exactly
-	 *   as specified
-	 * @return an input stream
-	 * @exception IOException if the given path cannot be found in this plug-in
-	 * @deprecated use {@link FileLocator#openStream(Bundle, IPath, boolean)}
-	 */
-	public final InputStream openStream(IPath file, boolean localized) throws IOException {
-		return FileLocator.openStream(bundle, file, localized);
-	}
-
-	/**
-	 * Sets whether this plug-in is in debug mode.
-	 * By default plug-ins are not in debug mode.  A plug-in can put itself
-	 * into debug mode or the user can set a debug option to do so.
-	 * <p>
-	 * Note that the plug-in's debug flag is initialized when the 
-	 * plug-in is started. The result of calling this method before the plug-in
-	 * has started is unspecified.
-	 * </p>
-	 *
-	 * @param value whether or not this plug-in is in debug mode
-	 * XXX deprecate use the service and cache as needed
-	 */
-	public void setDebugging(boolean value) {
-		debug = value;
-	}
-
-	/**
-	 * Shuts down this plug-in and discards all plug-in state.
-	 * <p>
-	 * This method should be re-implemented in subclasses that need to do something
-	 * when the plug-in is shut down.  Implementors should call the inherited method
-	 * to ensure that any system requirements can be met.
-	 * </p>
-	 * <p>
-	 * Plug-in shutdown code should be robust. In particular, this method
-	 * should always make an effort to shut down the plug-in. Furthermore,
-	 * the code should not assume that the plug-in was started successfully,
-	 * as this method will be invoked in the event of a failure during startup.
-	 * </p>
-	 * <p>
-	 * Note 1: If a plug-in has been started, this method will be automatically
-	 * invoked by the platform when the platform is shut down.
-	 * </p>
-	 * <p>
-	 * Note 2: This method is intended to perform simple termination
-	 * of the plug-in environment. The platform may terminate invocations
-	 * that do not complete in a timely fashion.
-	 * </p>
-	 * <b>Clients must never explicitly call this method.</b>
-	 * <p>
-	 *
-	 * @exception CoreException if this method fails to shut down
-	 *   this plug-in
-	 * @deprecated 
-	 * In Eclipse 3.0 this method has been replaced by {@link Plugin#stop(BundleContext context)}.
-	 * Implementations of <code>shutdown()</code> should be changed to override 
-	 * <code>stop(BundleContext context)</code> and call <code>super.stop(context)</code> 
-	 * instead of <code>super.shutdown()</code>.
-	 * The <code>shutdown()</code> method is called only for plug-ins which explicitly require the 
-	 * org.eclipse.core.runtime.compatibility plug-in.
-	 */
-	public void shutdown() throws CoreException {
-		if (CompatibilityHelper.initializeCompatibility() == null)
-			return;
-		Throwable exception = null;
-		Method m;
-		try {
-			m = descriptor.getClass().getMethod("doPluginDeactivation", new Class[0]); //$NON-NLS-1$
-			m.invoke(descriptor, null);
-		} catch (SecurityException e) {
-			exception = e;
-		} catch (NoSuchMethodException e) {
-			exception = e;
-		} catch (IllegalArgumentException e) {
-			exception = e;
-		} catch (IllegalAccessException e) {
-			exception = e;
-		} catch (InvocationTargetException e) {
-			exception = e;
-		}
-		if (exception == null)
-			return;
-		String message = NLS.bind(Messages.plugin_shutdownProblems, descriptor.getUniqueIdentifier());
-		IStatus status = new Status(IStatus.ERROR, Platform.PI_RUNTIME, IStatus.ERROR, message, exception);
-		InternalPlatform.getDefault().log(status);
-	}
-
-	/**
-	 * Starts up this plug-in.
-	 * <p>
-	 * This method should be overridden in subclasses that need to do something
-	 * when this plug-in is started.  Implementors should call the inherited method
-	 * to ensure that any system requirements can be met.
-	 * </p>
-	 * <p>
-	 * If this method throws an exception, it is taken as an indication that
-	 * plug-in initialization has failed; as a result, the plug-in will not
-	 * be activated; moreover, the plug-in will be marked as disabled and 
-	 * ineligible for activation for the duration.
-	 * </p>
-	 * <p>
-	 * Plug-in startup code should be robust. In the event of a startup failure,
-	 * the plug-in's <code>shutdown</code> method will be invoked automatically,
-	 * in an attempt to close open files, etc.
-	 * </p>
-	 * <p>
-	 * Note 1: This method is automatically invoked by the platform 
-	 * the first time any code in the plug-in is executed.
-	 * </p>
-	 * <p>
-	 * Note 2: This method is intended to perform simple initialization 
-	 * of the plug-in environment. The platform may terminate initializers 
-	 * that do not complete in a timely fashion.
-	 * </p>
-	 * <p>
-	 * Note 3: The class loader typically has monitors acquired during invocation of this method.  It is 
-	 * strongly recommended that this method avoid synchronized blocks or other thread locking mechanisms,
-	 * as this would lead to deadlock vulnerability.
-	 * </p>
-	 * <b>Clients must never explicitly call this method.</b>
-	 * <p>
-	 *
-	 * @exception CoreException if this plug-in did not start up properly
-	 * @deprecated 
-	 * In Eclipse 3.0 this method has been replaced by {@link Plugin#start(BundleContext context)}.
-	 * Implementations of <code>startup()</code> should be changed to extend
-	 * <code>start(BundleContext context)</code> and call <code>super.start(context)</code>
-	 * instead of <code>super.startup()</code>.
-	 * The <code>startup()</code> method is called only for plug-ins which explicitly require the 
-	 * org.eclipse.core.runtime.compatibility plug-in.
-	 */
-	public void startup() throws CoreException {
-	}
-
-	/**
-	 * Returns a string representation of the plug-in, suitable 
-	 * for debugging purposes only.
-	 */
-	public String toString() {
-		String name = bundle.getSymbolicName();
-		return name == null ? new Long(bundle.getBundleId()).toString() : name;
-	}
-
-	/**
-	 * Starts up this plug-in.
-	 * <p>
-	 * This method should be overridden in subclasses that need to do something
-	 * when this plug-in is started.  Implementors should call the inherited method
-	 * at the first possible point to ensure that any system requirements can be met.
-	 * </p>
-	 * <p>
-	 * If this method throws an exception, it is taken as an indication that
-	 * plug-in initialization has failed; as a result, the plug-in will not
-	 * be activated; moreover, the plug-in will be marked as disabled and 
-	 * ineligible for activation for the duration.
-	 * </p>
-	 * <p>
-	 * Plug-in startup code should be robust. In the event of a startup failure,
-	 * the plug-in's <code>shutdown</code> method will be invoked automatically,
-	 * in an attempt to close open files, etc.
-	 * </p>
-	 * <p>
-	 * Note 1: This method is automatically invoked by the platform 
-	 * the first time any code in the plug-in is executed.
-	 * </p>
-	 * <p>
-	 * Note 2: This method is intended to perform simple initialization 
-	 * of the plug-in environment. The platform may terminate initializers 
-	 * that do not complete in a timely fashion.
-	 * </p>
-	 * <p>
-	 * Note 3: The class loader typically has monitors acquired during invocation of this method.  It is 
-	 * strongly recommended that this method avoid synchronized blocks or other thread locking mechanisms,
-	 * as this would lead to deadlock vulnerability.
-	 * </p>
-	 * <p>
-	 * Note 4: The supplied bundle context represents the plug-in to the OSGi framework.
-	 * For security reasons, it is strongly recommended that this object should not be divulged.
-	 * </p>
-	 * <b>Clients must never explicitly call this method.</b>
-	 *
-	 * @param context the bundle context for this plug-in
-	 * @exception Exception if this plug-in did not start up properly
-	 * @since 3.0
-	 */
-	public void start(BundleContext context) throws Exception {
-		bundle = context.getBundle();
-
-		String symbolicName = bundle.getSymbolicName();
-		if (symbolicName != null) {
-			String key = symbolicName + "/debug"; //$NON-NLS-1$
-			String value = InternalPlatform.getDefault().getOption(key);
-			this.debug = value == null ? false : value.equalsIgnoreCase("true"); //$NON-NLS-1$
-		}
-
-		initializeDescriptor(symbolicName);
-	}
-
-	/**
-	 * @deprecated Marked as deprecated to suppress deprecation warnings.
-	 */
-	private IPluginDescriptor initializeDescriptor(String symbolicName) {
-		if (CompatibilityHelper.initializeCompatibility() == null)
-			return null;
-
-		//This associate a descriptor to any real bundle that uses this to start
-		if (symbolicName == null)
-			return null;
-
-		IPluginDescriptor tmp = CompatibilityHelper.getPluginDescriptor(symbolicName);
-
-		//Runtime descriptor is never set to support dynamic re-installation of compatibility 
-		if (!symbolicName.equals(Platform.PI_RUNTIME))
-			descriptor = tmp;
-
-		CompatibilityHelper.setPlugin(tmp, this);
-		CompatibilityHelper.setActive(tmp);
-		return tmp;
-	}
-
-	/**
-	 * Stops this plug-in.
-	 * <p>
-	 * This method should be re-implemented in subclasses that need to do something
-	 * when the plug-in is shut down.  Implementors should call the inherited method
-	 * as late as possible to ensure that any system requirements can be met.
-	 * </p>
-	 * <p>
-	 * Plug-in shutdown code should be robust. In particular, this method
-	 * should always make an effort to shut down the plug-in. Furthermore,
-	 * the code should not assume that the plug-in was started successfully,
-	 * as this method will be invoked in the event of a failure during startup.
-	 * </p>
-	 * <p>
-	 * Note 1: If a plug-in has been automatically started, this method will be automatically
-	 * invoked by the platform when the platform is shut down.
-	 * </p>
-	 * <p>
-	 * Note 2: This method is intended to perform simple termination
-	 * of the plug-in environment. The platform may terminate invocations
-	 * that do not complete in a timely fashion.
-	 * </p>
-	 * <p>
-	 * Note 3: The supplied bundle context represents the plug-in to the OSGi framework.
-	 * For security reasons, it is strongly recommended that this object should not be divulged.
-	 * </p>
-	 * <b>Clients must never explicitly call this method.</b>
-	 * 
-	 * @param context the bundle context for this plug-in
-	 * @exception Exception if this method fails to shut down this plug-in
-	 * @since 3.0
-	 */
-	public void stop(BundleContext context) throws Exception {
-		// sub-classes to override
-	}
-
-	/**
-	 * Returns the bundle associated with this plug-in.
-	 * 
-	 * @return the associated bundle
-	 * @since 3.0
-	 */
-	public final Bundle getBundle() {
-		return bundle;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Preferences.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Preferences.java
deleted file mode 100644
index e2fe96a..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Preferences.java
+++ /dev/null
@@ -1,1270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.runtime;
-
-import java.io.*;
-import java.util.*;
-import org.eclipse.core.internal.preferences.PreferencesService;
-import org.eclipse.core.internal.preferences.PrefsMessages;
-import org.eclipse.core.runtime.preferences.*;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * A table of preference settings, mapping named properties to values. Property
- * names are non-empty strings; property values can be either booleans,
- * non-null strings, or values of one of the primitive number types.
- * The table consists of two, sparse, layers: the lower layer holds default values 
- * for properties, and the upper layer holds explicitly set values for properties.
- * Normal retrieval looks for an explicitly set value for the given property in
- * the upper layer; if there is nothing for that property in the upper layer, it
- * next looks for a default value for the given property in the lower layer; if
- * there is nothing for that property in the lower layer, it returns a standard
- * default-default value. The default-default values for the primitive types are
- * as follows:
- * <ul>
- * 	<li><code>boolean</code> = <code>false</code></li>
- * 	<li><code>double</code> = <code>0.0</code></li>
- * 	<li><code>float</code> = <code>0.0f</code></li>
- * 	<li><code>int</code> = <code>0</code></li>
- *  <li><code>long</code> = <code>0L</code></li>
- * 	<li><code>String</code> = <code>""</code> (the empty string)</li>
- * </ul>
- * <p>
- * Internally, all properties values (in both layers) are stored as strings.
- * Standard conversions to and from numeric and boolean types are performed on
- * demand.
- * </p>
- * <p>
- * The typical usage is to establish the defaults for all known properties
- * and then restore previously stored values for properties whose values 
- * were explicitly set. The existing settings can be changed and new properties
- * can be set (<code>setValue</code>). If the values specified is the same as 
- * the default value, the explicit setting is deleted from the top layer.
- * It is also possible to reset a property value back to the default value 
- * using <code>setToDefault</code>. After the properties have been modified, 
- * the properties with explicit settings are written to disk. The default values
- * are never saved. This two-tiered approach
- * to saving and restoring property setting minimizes the number of properties
- * that need to be persisted; indeed, the normal starting state does not require
- * storing any properties at all. It also makes it easy to use different 
- * default settings in different environments while maintaining just those
- * property settings the user has adjusted.
- * </p>
- * <p>
- * A property change event is reported whenever a property's value actually
- * changes (either through <code>setValue</code>, <code>setToDefault</code>).
- * Note, however, that manipulating default values (with <code>setDefault</code>)
- * does not cause any events to be reported.
- * </p>
- * <p>
- * Clients may instantiate this class. This class was not designed to be 
- * subclassed.
- * </p>
- * <p>
- * The implementation is based on a pair of internal 
- * <code>java.util.Properties</code> objects, one holding explicitly set values
- * (set using <code>setValue</code>), the other holding the default values
- * (set using <code>setDefaultValue</code>). The <code>load</code> and
- * <code>store</code> methods persist the non-default property values to 
- * streams (the default values are not saved).
- * </p>
- * <p>
- * If a client sets a default value to be equivalent to the default-default for that
- * type, the value is still known to the preference store as having a default value.
- * That is, the name will still be returned in the result of the <code>defaultPropertyNames</code>
- * and <code>contains</code> methods.
- * </p>
- * 
- * @since 2.0
- */
-public class Preferences {
-
-	/**
-	 * The default-default value for boolean properties (<code>false</code>).
-	 */
-	public static final boolean BOOLEAN_DEFAULT_DEFAULT = false;
-
-	/**
-	 * The default-default value for double properties (<code>0.0</code>).
-	 */
-	public static final double DOUBLE_DEFAULT_DEFAULT = 0.0;
-
-	/**
-	 * The default-default value for float properties (<code>0.0f</code>).
-	 */
-	public static final float FLOAT_DEFAULT_DEFAULT = 0.0f;
-
-	/**
-	 * The default-default value for int properties (<code>0</code>).
-	 */
-	public static final int INT_DEFAULT_DEFAULT = 0;
-
-	/**
-	 * The default-default value for long properties (<code>0L</code>).
-	 */
-	public static final long LONG_DEFAULT_DEFAULT = 0L;
-
-	/**
-	 * The default-default value for String properties (<code>""</code>).
-	 */
-	public static final String STRING_DEFAULT_DEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The string representation used for <code>true</code>
-	 * (<code>"true"</code>).
-	 */
-	protected static final String TRUE = "true"; //$NON-NLS-1$
-
-	/**
-	 * The string representation used for <code>false</code>
-	 * (<code>"false"</code>).
-	 */
-	protected static final String FALSE = "false"; //$NON-NLS-1$
-
-	/**
-	 * Singleton empty string array (optimization)
-	 */
-	private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
-	/** 
-	 * The simple identifier constant (value "<code>preferences</code>") of
-	 * the extension point of the Core Runtime plug-in where plug-ins declare
-	 * extensions to the preference facility. A plug-in may define any number
-	 * of preference extensions.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String PT_PREFERENCES = "preferences"; //$NON-NLS-1$
-
-	/**
-	 * An event object describing a change to a named property.
-	 * <p>
-	 * The preferences object reports property change events for internal state
-	 * changes that may be of interest to external parties. A special listener
-	 * interface (<code>Preferences.IPropertyChangeListener</code>) is 
-	 * defined for this purpose. Listeners are registered via the
-	 * <code>Preferences.addPropertyChangeListener</code> method.
-	 * </p>
-	 * <p>
-	 * Clients cannot instantiate or subclass this class.
-	 * </p>
-	 *
-	 * @see Preferences#addPropertyChangeListener(Preferences.IPropertyChangeListener)
-	 * @see Preferences.IPropertyChangeListener
-	 */
-	public static class PropertyChangeEvent extends EventObject {
-		/**
-		 * All serializable objects should have a stable serialVersionUID
-		 */
-		private static final long serialVersionUID = 1L;
-
-		/**
-		 * The name of the changed property.
-		 */
-		private String propertyName;
-
-		/**
-		 * The old value of the changed property, or <code>null</code> if
-		 * not known or not relevant.
-		 */
-		private Object oldValue;
-
-		/**
-		 * The new value of the changed property, or <code>null</code> if
-		 * not known or not relevant.
-		 */
-		private Object newValue;
-
-		/**
-		 * Creates a new property change event.
-		 *
-		 * @param source the object whose property has changed
-		 * @param property the property that has changed (must not be 
-		 *    <code>null</code>)
-		 * @param oldValue the old value of the property, or 
-		 *    <code>null</code> if none
-		 * @param newValue the new value of the property, or 
-		 *    <code>null</code> if none
-		 */
-		protected PropertyChangeEvent(Object source, String property, Object oldValue, Object newValue) {
-
-			super(source);
-			if (property == null) {
-				throw new IllegalArgumentException();
-			}
-			this.propertyName = property;
-			this.oldValue = oldValue;
-			this.newValue = newValue;
-		}
-
-		/**
-		 * Returns the name of the property that changed.
-		 * <p>
-		 * Warning: there is no guarantee that the property name returned
-		 * is a constant string.  Callers must compare property names using
-		 * <code>equals</code>, not ==.
-		 *</p>
-		 * 
-		 * @return the name of the property that changed
-		 */
-		public String getProperty() {
-			return propertyName;
-		}
-
-		/**
-		 * Returns the new value of the property.
-		 *
-		 * @return the new value, or <code>null</code> if not known
-		 *  or not relevant
-		 */
-		public Object getNewValue() {
-			return newValue;
-		}
-
-		/**
-		 * Returns the old value of the property.
-		 *
-		 * @return the old value, or <code>null</code> if not known
-		 *  or not relevant
-		 */
-		public Object getOldValue() {
-			return oldValue;
-		}
-	}
-
-	/**
-	 * Listener for property changes.
-	 * <p>
-	 * Usage:
-	 * <pre>
-	 * Preferences.IPropertyChangeListener listener =
-	 *   new Preferences.IPropertyChangeListener() {
-	 *      public void propertyChange(Preferences.PropertyChangeEvent event) {
-	 *         ... // code to deal with occurrence of property change
-	 *      }
-	 *   };
-	 * emitter.addPropertyChangeListener(listener);
-	 * ...
-	 * emitter.removePropertyChangeListener(listener);
-	 * </pre>
-	 * </p>
-	 * <p>
-	 * <em>Note:</em> Depending on the means in which the property
-	 * values changed, the old and new values for the property can 
-	 * be either typed, a string representation of the value, or <code>null</code>.
-	 * Clients who wish to behave properly in all cases should all
-	 * three cases in their implementation of the property change listener.
-	 * </p>
-	 */
-	public interface IPropertyChangeListener extends EventListener {
-
-		/**
-		 * Notification that a property has changed.
-		 * <p>
-		 * This method gets called when the observed object fires a property
-		 * change event.
-		 * </p>
-		 *
-		 * @param event the property change event object describing which
-		 *    property changed and how
-		 */
-		public void propertyChange(Preferences.PropertyChangeEvent event);
-	}
-
-	/** 
-	 * List of registered listeners (element type: 
-	 * <code>IPropertyChangeListener</code>).
-	 * These listeners are to be informed when the current value of a property
-	 * changes.
-	 */
-	protected ListenerList listeners = new ListenerList();
-
-	/**
-	 * The mapping from property name to
-	 * property value (represented as strings).
-	 */
-	private Properties properties;
-
-	/**
-	 * The mapping from property name to
-	 * default property value (represented as strings);
-	 * <code>null</code> if none.
-	 */
-	private Properties defaultProperties;
-
-	/**
-	 * Indicates whether a value has been changed by <code>setToDefault</code>
-	 * or <code>setValue</code>; initially <code>false</code>.
-	 */
-	protected boolean dirty = false;
-
-	/**
-	 * Exports all non-default-valued preferences for all installed plugins to the 
-	 * provided file. If a file already exists at the given location, it will be deleted.
-	 * If there are no preferences to export, no file will be written.
-	 * <p>
-	 * The file that is written can be read later using the importPreferences method.
-	 * </p>
-	 * @param path The absolute file system path of the file to export preferences to.
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> The file could not be written.</li>
-	 * </ul>
-	 * @see #importPreferences(IPath)
-	 * @see #validatePreferenceVersions(IPath)
-	 */
-	public static void exportPreferences(IPath path) throws CoreException {
-		File file = path.toFile();
-		if (file.exists())
-			file.delete();
-		file.getParentFile().mkdirs();
-		IPreferencesService service = PreferencesService.getDefault();
-		OutputStream output = null;
-		FileOutputStream fos = null;
-		try {
-			fos = new FileOutputStream(file);
-			output = new BufferedOutputStream(fos);
-			IEclipsePreferences node = (IEclipsePreferences) service.getRootNode().node(InstanceScope.SCOPE);
-			service.exportPreferences(node, output, (String[]) null);
-			output.flush();
-			fos.getFD().sync();
-		} catch (IOException e) {
-			String message = NLS.bind(PrefsMessages.preferences_errorWriting, file, e.getMessage());
-			IStatus status = new Status(IStatus.ERROR, PrefsMessages.OWNER_NAME, IStatus.ERROR, message, e);
-			throw new CoreException(status);
-		} finally {
-			if (output != null)
-				try {
-					output.close();
-				} catch (IOException e) {
-					// ignore
-				}
-		}
-	}
-
-	/**
-	 * Loads the plugin preferences from the given file, and replaces all 
-	 * non-default-valued preferences for all plugins with the values from this file.
-	 * <p>
-	 * If the file contains preferences for plug-ins that don't exist in the current
-	 * install, they are ignored.  This method does not validate if the plug-in
-	 * versions in the preference file match the currently installed plug-ins.
-	 * Clients should first call validatePreferenceVersions on the file to ensure
-	 * that the versions are compatible.
-	 * </p>
-	 * <p>
-	 * The file must have been written by the exportPreferences method.
-	 * </p>
-	 * @param path The absolute file system path of the file to import preferences from.
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li> The file does not exist.</li>
-	 * <li> The file could not be read.</li>
-	 * </ul>
-	 * @see #exportPreferences(IPath)
-	 * @see #validatePreferenceVersions(IPath)
-	 */
-	public static void importPreferences(IPath path) throws CoreException {
-		if (!path.toFile().exists()) {
-			String msg = NLS.bind(PrefsMessages.preferences_fileNotFound, path.toOSString());
-			throw new CoreException(new Status(IStatus.ERROR, PrefsMessages.OWNER_NAME, 1, msg, null));
-		}
-		IPreferencesService service = PreferencesService.getDefault();
-		InputStream input = null;
-		try {
-			input = new BufferedInputStream(new FileInputStream(path.toFile()));
-			service.importPreferences(input);
-		} catch (FileNotFoundException e) {
-			String msg = NLS.bind(PrefsMessages.preferences_fileNotFound, path.toOSString());
-			throw new CoreException(new Status(IStatus.ERROR, PrefsMessages.OWNER_NAME, 1, msg, e));
-		} finally {
-			if (input != null)
-				try {
-					input.close();
-				} catch (IOException e) {
-					// ignore
-				}
-		}
-	}
-
-	/**
-	 * Validates that the preference versions in the given file match the versions
-	 * of the currently installed plugins.  Returns an OK status if all preferences match 
-	 * the currently installed plugins, otherwise a MultiStatus describing what 
-	 * plugins have preferences that don't match.  
-	 * <p>
-	 * If the returned status has a <code>IStatus.WARNING</code> severity, 
-	 * it means that some preferences may not be applicable but for the most 
-	 * part they will be compatible.  If the returned status has a 
-	 * <code>IStatus.ERROR</code> severity, it means that the preferences 
-	 * will probably not be compatible.
-	 * <p>
-	 * If the file contains preferences for plug-ins that don't exist in the current
-	 * install, they are ignored.
-	 * </p>
-	 * <p>
-	 * The file must have been written by the exportPreferences method.
-	 * </p>
-	 * @param file The absolute file system path of the preference file to validate.
-	 * @see #exportPreferences(IPath)
-	 * @see #importPreferences(IPath)
-	 */
-	public static IStatus validatePreferenceVersions(IPath file) {
-		PreferencesService service = PreferencesService.getDefault();
-		return service.validateVersions(file);
-	}
-
-	/**
-	 * Creates an empty preference table.
-	 * <p>
-	 * Use the methods <code>load(InputStream)</code> and
-	 * <code>store(InputStream)</code> to load and store these preferences.
-	 * </p>
-	 * @see #load(InputStream)
-	 * @see #store(OutputStream, String)
-	 */
-	public Preferences() {
-		defaultProperties = new Properties();
-		properties = new Properties(defaultProperties);
-	}
-
-	/**
-	 * Adds a property change listener to this preference object.
-	 * Has no affect if the identical listener is already registered.
-	 * <p>
-	 * <em>Note:</em> Depending on the means in which the property
-	 * values changed, the old and new values for the property can 
-	 * be either typed, a string representation of the value, or <code>null</code>.
-	 * Clients who wish to behave properly in all cases should all
-	 * three cases in their implementation of the property change listener.
-	 * </p>
-	 * @param listener a property change listener
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener) {
-		listeners.add(listener);
-	}
-
-	/**
-	 * Removes the given listener from this preference object.
-	 * Has no affect if the listener is not registered.
-	 *
-	 * @param listener a property change listener
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener) {
-		listeners.remove(listener);
-	}
-
-	/**
-	 * Returns whether the given property is known to this preference object,
-	 * either by having an explicit setting or by having a default
-	 * setting. Returns <code>false</code> if the given name is <code>null</code>.
-	 *
-	 * @param name the name of the property, or <code>null</code>
-	 * @return <code>true</code> if either a current value or a default
-	 *  value is known for the named property, and <code>false</code>otherwise
-	 */
-	public boolean contains(String name) {
-		return (properties.containsKey(name) || defaultProperties.containsKey(name));
-	}
-
-	/**
-	 * Fires a property change event corresponding to a change to the
-	 * current value of the property with the given name.
-	 *
-	 * @param name the name of the property, to be used as the property
-	 *  in the event object
-	 * @param oldValue the old value, or <code>null</code> if not known or not
-	 *    relevant
-	 * @param newValue the new value, or <code>null</code> if not known or not
-	 *    relevant
-	 */
-	protected void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
-		if (name == null)
-			throw new IllegalArgumentException();
-		Object[] changeListeners = this.listeners.getListeners();
-		// Do we even need to fire an event?
-		if (changeListeners.length == 0)
-			return;
-		final PropertyChangeEvent pe = new PropertyChangeEvent(this, name, oldValue, newValue);
-		for (int i = 0; i < changeListeners.length; ++i) {
-			final IPropertyChangeListener l = (IPropertyChangeListener) changeListeners[i];
-			ISafeRunnable job = new ISafeRunnable() {
-				public void handleException(Throwable exception) {
-					// already being logged in Platform#run()
-				}
-
-				public void run() throws Exception {
-					l.propertyChange(pe);
-				}
-			};
-			SafeRunner.run(job);
-		}
-	}
-
-	/**
-	 * Returns the current value of the boolean-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>false</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as a boolean.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the boolean-valued property
-	 */
-	public boolean getBoolean(String name) {
-		String value = properties.getProperty(name);
-		if (value == null) {
-			return BOOLEAN_DEFAULT_DEFAULT;
-		}
-		return value.equals(Preferences.TRUE);
-	}
-
-	/**
-	 * Sets the current value of the boolean-valued property with the
-	 * given name. The given name must not be <code>null</code>.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property
-	 */
-	public void setValue(String name, boolean value) {
-		boolean defaultValue = getDefaultBoolean(name);
-		boolean oldValue = getBoolean(name);
-		if (value == defaultValue) {
-			Object removed = properties.remove(name);
-			if (removed != null) {
-				// removed an explicit setting
-				dirty = true;
-			}
-		} else {
-			properties.put(name, value ? Preferences.TRUE : Preferences.FALSE);
-		}
-		if (oldValue != value) {
-			// mark as dirty since value did really change
-			dirty = true;
-			// report property change if getValue now returns different value
-			firePropertyChangeEvent(name, oldValue ? Boolean.TRUE : Boolean.FALSE, value ? Boolean.TRUE : Boolean.FALSE);
-		}
-	}
-
-	/**
-	 * Returns the default value for the boolean-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>false</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a boolean.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public boolean getDefaultBoolean(String name) {
-		String value = defaultProperties.getProperty(name);
-		if (value == null) {
-			return BOOLEAN_DEFAULT_DEFAULT;
-		}
-		return value.equals(Preferences.TRUE);
-	}
-
-	/**
-	 * Sets the default value for the boolean-valued property with the
-	 * given name. The given name must not be <code>null</code>.
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property
-	 */
-	public void setDefault(String name, boolean value) {
-		defaultProperties.put(name, value ? Preferences.TRUE : Preferences.FALSE);
-	}
-
-	/**
-	 * Returns the current value of the double-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>0.0</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as a double.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the double-valued property
-	 */
-	public double getDouble(String name) {
-		return convertToDouble(properties.getProperty(name), DOUBLE_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the current value of the double-valued property with the
-	 * given name. The given name must not be <code>null</code>.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property; must be 
-	 *   a number (not a NaN)
-	 */
-	public void setValue(String name, double value) {
-		if (Double.isNaN(value)) {
-			throw new IllegalArgumentException();
-		}
-		double defaultValue = getDefaultDouble(name);
-		double oldValue = getDouble(name);
-		if (value == defaultValue) {
-			Object removed = properties.remove(name);
-			if (removed != null) {
-				// removed an explicit setting
-				dirty = true;
-			}
-		} else {
-			properties.put(name, Double.toString(value));
-		}
-		if (oldValue != value) {
-			// mark as dirty since value did really change
-			dirty = true;
-			// report property change if getValue now returns different value
-			firePropertyChangeEvent(name, new Double(oldValue), new Double(value));
-		}
-	}
-
-	/**
-	 * Returns the default value for the double-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>0.0</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a double.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public double getDefaultDouble(String name) {
-		return convertToDouble(defaultProperties.getProperty(name), DOUBLE_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the double-valued property with the
-	 * given name. The given name must not be <code>null</code>. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property; must be 
-	 *   a number (not a NaN)
-	 */
-	public void setDefault(String name, double value) {
-		if (Double.isNaN(value)) {
-			throw new IllegalArgumentException();
-		}
-		defaultProperties.put(name, Double.toString(value));
-	}
-
-	/**
-	 * Converts the given raw property value string to a double.
-	 * 
-	 * @param rawPropertyValue the raw property value, or <code>null</code>
-	 *   if none
-	 * @param defaultValue the default value
-	 * @return the raw value converted to a double, or the given 
-	 *    <code>defaultValue</code> if the raw value is <code>null</code> or
-	 *    cannot be parsed as a double
-	 */
-	private double convertToDouble(String rawPropertyValue, double defaultValue) {
-		double result = defaultValue;
-		if (rawPropertyValue != null) {
-			try {
-				result = Double.parseDouble(rawPropertyValue);
-			} catch (NumberFormatException e) {
-				// raw value cannot be treated as one of these
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the current value of the float-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>0.0f</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as a float.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the float-valued property
-	 */
-	public float getFloat(String name) {
-		return convertToFloat(properties.getProperty(name), FLOAT_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the current value of the float-valued property with the
-	 * given name. The given name must not be <code>null</code>.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property; must be 
-	 *   a number (not a NaN)
-	 */
-	public void setValue(String name, float value) {
-		if (Float.isNaN(value)) {
-			throw new IllegalArgumentException();
-		}
-		float defaultValue = getDefaultFloat(name);
-		float oldValue = getFloat(name);
-		if (value == defaultValue) {
-			Object removed = properties.remove(name);
-			if (removed != null) {
-				// removed an explicit setting
-				dirty = true;
-			}
-		} else {
-			properties.put(name, Float.toString(value));
-		}
-		if (oldValue != value) {
-			// mark as dirty since value did really change
-			dirty = true;
-			// report property change if getValue now returns different value
-			firePropertyChangeEvent(name, new Float(oldValue), new Float(value));
-		}
-	}
-
-	/**
-	 * Returns the default value for the float-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>0.0f</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a float.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public float getDefaultFloat(String name) {
-		return convertToFloat(defaultProperties.getProperty(name), FLOAT_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the float-valued property with the
-	 * given name. The given name must not be <code>null</code>. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property; must be 
-	 *   a number (not a NaN)
-	 */
-	public void setDefault(String name, float value) {
-		if (Float.isNaN(value)) {
-			throw new IllegalArgumentException();
-		}
-		defaultProperties.put(name, Float.toString(value));
-	}
-
-	/**
-	 * Converts the given raw property value string to a float.
-	 * 
-	 * @param rawPropertyValue the raw property value, or <code>null</code>
-	 *   if none
-	 * @param defaultValue the default value
-	 * @return the raw value converted to a float, or the given 
-	 *    <code>defaultValue</code> if the raw value is <code>null</code> or
-	 *    cannot be parsed as a float
-	 */
-	private float convertToFloat(String rawPropertyValue, float defaultValue) {
-		float result = defaultValue;
-		if (rawPropertyValue != null) {
-			try {
-				result = Float.parseFloat(rawPropertyValue);
-			} catch (NumberFormatException e) {
-				// raw value cannot be treated as one of these
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the current value of the integer-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>0</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as an integer.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the int-valued property
-	 */
-	public int getInt(String name) {
-		return convertToInt(properties.getProperty(name), INT_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the current value of the integer-valued property with the
-	 * given name. The given name must not be <code>null</code>.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property
-	 */
-	public void setValue(String name, int value) {
-		int defaultValue = getDefaultInt(name);
-		int oldValue = getInt(name);
-		if (value == defaultValue) {
-			Object removed = properties.remove(name);
-			if (removed != null) {
-				// removed an explicit setting
-				dirty = true;
-			}
-		} else {
-			properties.put(name, Integer.toString(value));
-		}
-		if (oldValue != value) {
-			// mark as dirty since value did really change
-			dirty = true;
-			// report property change if getValue now returns different value
-			firePropertyChangeEvent(name, new Integer(oldValue), new Integer(value));
-		}
-	}
-
-	/**
-	 * Returns the default value for the integer-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>0</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as an integer.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public int getDefaultInt(String name) {
-		return convertToInt(defaultProperties.getProperty(name), INT_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the integer-valued property with the
-	 * given name. The given name must not be <code>null</code>. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property
-	 */
-	public void setDefault(String name, int value) {
-		defaultProperties.put(name, Integer.toString(value));
-	}
-
-	/**
-	 * Converts the given raw property value string to an int.
-	 * 
-	 * @param rawPropertyValue the raw property value, or <code>null</code>
-	 *   if none
-	 * @param defaultValue the default value
-	 * @return the raw value converted to an int, or the given 
-	 *    <code>defaultValue</code> if the raw value is <code>null</code> or
-	 *    cannot be parsed as an int
-	 */
-	private int convertToInt(String rawPropertyValue, int defaultValue) {
-		int result = defaultValue;
-		if (rawPropertyValue != null) {
-			try {
-				result = Integer.parseInt(rawPropertyValue);
-			} catch (NumberFormatException e) {
-				// raw value cannot be treated as one of these
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the current value of the long-valued property with the
-	 * given name.
-	 * Returns the default-default value (<code>0L</code>) if there
-	 * is no property with the given name, or if the current value 
-	 * cannot be treated as a long.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the long-valued property
-	 */
-	public long getLong(String name) {
-		return convertToLong(properties.getProperty(name), LONG_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the current value of the long-valued property with the
-	 * given name. The given name must not be <code>null</code>.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property
-	 */
-	public void setValue(String name, long value) {
-		long defaultValue = getDefaultLong(name);
-		long oldValue = getLong(name);
-		if (value == defaultValue) {
-			Object removed = properties.remove(name);
-			if (removed != null) {
-				// removed an explicit setting
-				dirty = true;
-			}
-		} else {
-			properties.put(name, Long.toString(value));
-		}
-		if (oldValue != value) {
-			// mark as dirty since value did really change
-			dirty = true;
-			// report property change if getValue now returns different value
-			firePropertyChangeEvent(name, new Long(oldValue), new Long(value));
-		}
-	}
-
-	/**
-	 * Returns the default value for the long-valued property
-	 * with the given name.
-	 * Returns the default-default value (<code>0L</code>) if there
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a long.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public long getDefaultLong(String name) {
-		return convertToLong(defaultProperties.getProperty(name), LONG_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the long-valued property with the
-	 * given name. The given name must not be <code>null</code>. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property
-	 */
-	public void setDefault(String name, long value) {
-		defaultProperties.put(name, Long.toString(value));
-	}
-
-	/**
-	 * Converts the given raw property value string to a long.
-	 * 
-	 * @param rawPropertyValue the raw property value, or <code>null</code>
-	 *   if none
-	 * @param defaultValue the default value
-	 * @return the raw value converted to a long, or the given 
-	 *    <code>defaultValue</code> if the raw value is <code>null</code> or
-	 *    cannot be parsed as a long
-	 */
-	private long convertToLong(String rawPropertyValue, long defaultValue) {
-		long result = defaultValue;
-		if (rawPropertyValue != null) {
-			try {
-				result = Long.parseLong(rawPropertyValue);
-			} catch (NumberFormatException e) {
-				// raw value cannot be treated as one of these
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the current value of the string-valued property with the
-	 * given name.
-	 * Returns the default-default value (the empty string <code>""</code>)
-	 * if there is no property with the given name.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the string-valued property
-	 */
-	public String getString(String name) {
-		String value = properties.getProperty(name);
-		return (value != null ? value : STRING_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the current value of the string-valued property with the
-	 * given name. The given name must not be <code>null</code>.
-	 * <p>
-	 * A property change event is reported if the current value of the 
-	 * property actually changes from its previous value. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are wrapped as objects.
-	 * </p>
-	 * <p>
-	 * If the given value is the same as the corresponding default value
-	 * for the given property, the explicit setting is deleted.
-	 * Note that the recommended way of re-initializing a property to its
-	 * default value is to call <code>setToDefault</code>.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new current value of the property
-	 */
-	public void setValue(String name, String value) {
-		if (value == null) {
-			throw new IllegalArgumentException();
-		}
-		String defaultValue = getDefaultString(name);
-		String oldValue = getString(name);
-		if (value.equals(defaultValue)) {
-			Object removed = properties.remove(name);
-			if (removed != null) {
-				// removed an explicit setting
-				dirty = true;
-			}
-		} else {
-			properties.put(name, value);
-		}
-		if (!oldValue.equals(value)) {
-			// mark as dirty since value did really change
-			dirty = true;
-			// report property change if getValue now returns different value
-			firePropertyChangeEvent(name, oldValue, value);
-		}
-	}
-
-	/**
-	 * Returns the default value for the string-valued property
-	 * with the given name.
-	 * Returns the default-default value (the empty string <code>""</code>) 
-	 * is no default property with the given name, or if the default 
-	 * value cannot be treated as a string.
-	 * The given name must not be <code>null</code>.
-	 *
-	 * @param name the name of the property
-	 * @return the default value of the named property
-	 */
-	public String getDefaultString(String name) {
-		String value = defaultProperties.getProperty(name);
-		return (value != null ? value : STRING_DEFAULT_DEFAULT);
-	}
-
-	/**
-	 * Sets the default value for the string-valued property with the
-	 * given name. The given name must not be <code>null</code>. 
-	 * <p>
-	 * Note that the current value of the property is affected if
-	 * the property's current value was its old default value, in which
-	 * case it changes to the new default value. If the property's current
-	 * is different from its old default value, its current value is
-	 * unaffected. No property change events are reported by changing default
-	 * values.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 * @param value the new default value for the property
-	 */
-	public void setDefault(String name, String value) {
-		if (value == null) {
-			throw new IllegalArgumentException();
-		}
-		defaultProperties.put(name, value);
-	}
-
-	/**
-	 * Returns whether the property with the given name has the default value in
-	 * virtue of having no explicitly set value.
-	 * Returns <code>false</code> if the given name is <code>null</code>.
-	 *
-	 * @param name the name of the property, or <code>null</code>
-	 * @return <code>true</code> if the property has no explicitly set value,
-	 * and <code>false</code> otherwise (including the case where the property
-	 * is unknown to this object)
-	 */
-	public boolean isDefault(String name) {
-		return !properties.containsKey(name);
-	}
-
-	/**
-	 * Sets the current value of the property with the given name back
-	 * to its default value. Has no effect if the property does not have
-	 * its own current value. The given name must not be <code>null</code>.
-	 * <p>
-	 * Note that the recommended way of re-initializing a property to the
-	 * appropriate default value is to call <code>setToDefault</code>.
-	 * This is implemented by removing the named value from the object, 
-	 * thereby exposing the default value.
-	 * </p>
-	 * <p>
-	 * A property change event is always reported. In the event
-	 * object, the property name is the name of the property, and the
-	 * old and new values are either strings, or <code>null</code> 
-	 * indicating the default-default value.
-	 * </p>
-	 *
-	 * @param name the name of the property
-	 */
-	public void setToDefault(String name) {
-		Object oldPropertyValue = properties.remove(name);
-		if (oldPropertyValue != null) {
-			dirty = true;
-		}
-		String newValue = defaultProperties.getProperty(name, null);
-		// n.b. newValue == null if there is no default value
-		// can't determine correct default-default without knowing type
-		firePropertyChangeEvent(name, oldPropertyValue, newValue);
-	}
-
-	/**
-	 * Returns a list of all properties known to this preference object which
-	 * have current values other than their default value.
-	 *
-	 * @return an array of property names 
-	 */
-	public String[] propertyNames() {
-		return (String[]) properties.keySet().toArray(EMPTY_STRING_ARRAY);
-	}
-
-	/**
-	 * Returns a list of all properties known to this preference object which
-	 * have an explicit default value set.
-	 *
-	 * @return an array of property names 
-	 */
-	public String[] defaultPropertyNames() {
-		return (String[]) defaultProperties.keySet().toArray(EMPTY_STRING_ARRAY);
-	}
-
-	/**
-	 * Returns whether the current values in this preference object
-	 * require saving.
-	 *
-	 * @return <code>true</code> if at least one of the properties
-	 *  known to this preference object has a current value different from its
-	 *  default value, and <code>false</code> otherwise
-	 */
-	public boolean needsSaving() {
-		return dirty;
-	}
-
-	/**
-	 * Saves the non-default-valued properties known to this preference object to
-	 * the given output stream using 
-	 * <code>Properties.store(OutputStream,String)</code>.
-	 * <p>
-	 * Note that the output is unconditionally written, even when
-	 * <code>needsSaving</code> is <code>false</code>.
-	 * </p>
-	 *
-	 * @param out the output stream 
-	 * @param header a comment to be included in the output, or 
-	 *    <code>null</code> if none
-	 * @exception IOException if there is a problem saving this preference object
-	 * @see Properties#store(OutputStream,String)
-	 */
-	public void store(OutputStream out, String header) throws IOException {
-		properties.store(out, header);
-		dirty = false;
-	}
-
-	/**
-	 * Loads the non-default-valued properties for this preference object from the
-	 * given input stream using 
-	 * <code>java.util.Properties.load(InputStream)</code>. Default property
-	 * values are not affected.
-	 *
-	 * @param in the input stream
-	 * @exception IOException if there is a problem loading this preference
-	 *    object
-	 * @see java.util.Properties#load(InputStream)
-	 */
-	public void load(InputStream in) throws IOException {
-		properties.load(in);
-		dirty = false;
-	}
-}
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/package.html b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/package.html
deleted file mode 100644
index dad4693..0000000
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/runtime/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>Package-level Javadoc</title>
-</head>
-<body>
-Provides core support for plug-ins and the plug-in registry.
-<h2>
-Package Specification</h2>
-This package specifies the API related to running the platform itself.  This includes 
-area such as the definition and management of plug-ins and the starting, stopping and maintaining the 
-platform itself.  In addition, this API supplies various utility types such as <tt>Path</tt>, 
-<tt>IPath</tt> and various flavours of progress monitors.
-<p>
-Clients writing plug-ins or accessing plug-in functionality will likely be interested in the types
-provided by this package.
-</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.tools/.classpath b/bundles/org.eclipse.core.tools/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/bundles/org.eclipse.core.tools/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.tools/.cvsignore b/bundles/org.eclipse.core.tools/.cvsignore
deleted file mode 100644
index 3aa6193..0000000
--- a/bundles/org.eclipse.core.tools/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-coretools.jar
diff --git a/bundles/org.eclipse.core.tools/.options b/bundles/org.eclipse.core.tools/.options
deleted file mode 100644
index c6784d9..0000000
--- a/bundles/org.eclipse.core.tools/.options
+++ /dev/null
@@ -1,28 +0,0 @@
-#### Monitoring settings
-# monitor class loading
-org.eclipse.osgi/monitor/classes=false
-
-# monitor bundle activation
-org.eclipse.osgi/monitor/activation=false
-
-# monitor resource bundle (*.properties) loading
-org.eclipse.osgi/monitor/resources=false
-
-
-#### Trace settings
-# trace class loading - snapshot the execution stack when a class is loaded
-org.eclipse.osgi/trace/classLoading=false
-
-# trace location - file in which execution traces are written
-org.eclipse.osgi/trace/filename=runtime.traces
-
-# trace filters - Java properties file defining which classes should 
-# be traced (if trace/classLoading is true)
-# File format:
-# plugins=<comma separated list of plugins whose classes to trace>
-# packages=<comma separated list of package prefixes of classes to trace>
-# Note that there may be many 'plugins' and 'packages' lines in one file.
-org.eclipse.osgi/trace/filters=trace.properties
-
-# trace bundle activation - snapshot the execution stack when a bundle is activated
-org.eclipse.osgi/trace/activation=false
diff --git a/bundles/org.eclipse.core.tools/.project b/bundles/org.eclipse.core.tools/.project
deleted file mode 100644
index 4d63ad9..0000000
--- a/bundles/org.eclipse.core.tools/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.tools</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.resources.spysupport</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.ui</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.tools/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.core.tools/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index f3ab745..0000000
--- a/bundles/org.eclipse.core.tools/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Thu May 27 16:37:13 EDT 2004
-encoding/<project>=ISO-8859-1
-eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.core.tools/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.core.tools/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82269cc..0000000
--- a/bundles/org.eclipse.core.tools/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri Jan 06 16:48:35 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=;
-org.eclipse.jdt.ui.ondemandthreshold=3
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="New classes and interfaces" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n *******************************************************************************/\r\n${filecomment}\r\n${package_declaration}\r\n\r\n/**\r\n * \r\n */\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block&\#13;\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.core.tools/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.tools/META-INF/MANIFEST.MF
deleted file mode 100644
index 313bb5e..0000000
--- a/bundles/org.eclipse.core.tools/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: Core Tools
-Bundle-SymbolicName: org.eclipse.core.tools; singleton=true
-Bundle-Version: 1.3.0.qualifier
-Bundle-Activator: org.eclipse.core.tools.CoreToolsPlugin
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Provide-Package: org.eclipse.core.tools,
- org.eclipse.core.tools.runtime,
- org.eclipse.core.tools.metadata
-Require-Bundle: org.eclipse.core.resources;optional=true,
- org.eclipse.core.runtime,
- org.eclipse.jface.text,
- org.eclipse.ui,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.views,
- org.eclipse.jdt.core,
- org.eclipse.jdt.ui,
- org.eclipse.ltk.core.refactoring,
- org.eclipse.core.filebuffers,
- org.eclipse.ui.ide
-Eclipse-AutoStart: true
diff --git a/bundles/org.eclipse.core.tools/about.html b/bundles/org.eclipse.core.tools/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/bundles/org.eclipse.core.tools/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.tools/about.ini b/bundles/org.eclipse.core.tools/about.ini
deleted file mode 100644
index e521604..0000000
--- a/bundles/org.eclipse.core.tools/about.ini
+++ /dev/null
@@ -1,27 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-#welcomePage=$nl$/welcome.xml
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
diff --git a/bundles/org.eclipse.core.tools/about.mappings b/bundles/org.eclipse.core.tools/about.mappings
deleted file mode 100644
index 720ca87..0000000
--- a/bundles/org.eclipse.core.tools/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.tools/about.properties b/bundles/org.eclipse.core.tools/about.properties
deleted file mode 100644
index ae969be..0000000
--- a/bundles/org.eclipse.core.tools/about.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-blurb=Eclipse Core Tools\n\
-\n\
-Version: 1.0.0\n\
-Build id: {0}\n\
-\n\
-(c) Copyright IBM Corp. and others 2000, 2004.  All rights reserved.\n\
-Visit http://eclipse.org/eclipse/development/performance
-
diff --git a/bundles/org.eclipse.core.tools/build.properties b/bundles/org.eclipse.core.tools/build.properties
deleted file mode 100644
index e84bf48..0000000
--- a/bundles/org.eclipse.core.tools/build.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-src.includes=*.html
-bin.includes=plugin.xml,icons/,doc/,*.html,.options, META-INF/,.
-qualifier=context
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.tools/cpl-v10.html b/bundles/org.eclipse.core.tools/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/bundles/org.eclipse.core.tools/cpl-v10.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-<HEAD>
-<TITLE>Common Public License - v 1.0</TITLE>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</HEAD>
-
-<BODY BGCOLOR="#FFFFFF" VLINK="#800000">
-
-
-<P ALIGN="CENTER"><B>Common Public License - v 1.0</B>
-<P><B></B><FONT SIZE="3"></FONT>
-<P><FONT SIZE="3"></FONT><FONT SIZE="2">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT").  ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>1.  DEFINITIONS</B></FONT>
-<P><FONT SIZE="2">"Contribution" means:</FONT>
-
-<UL><FONT SIZE="2">a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and<BR CLEAR="LEFT">
-b) in the case of each subsequent Contributor:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	 	changes to the Program, and</FONT></UL>
-
-
-<UL><FONT SIZE="2">ii)		additions to the Program;</FONT></UL>
-
-
-<UL><FONT SIZE="2">where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.  </FONT><FONT SIZE="2">A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf.  </FONT><FONT SIZE="2">Contributions do not include additions to the Program which:  (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Contributor" means any person or entity that distributes the Program.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.  </FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">"Program" means the Contributions distributed in accordance with this Agreement.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.</FONT>
-<P><FONT SIZE="2"><B></B></FONT>
-<P><FONT SIZE="2"><B>2.  GRANT OF RIGHTS</B></FONT>
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">a)	</FONT><FONT SIZE="2">Subject to the terms of this Agreement, each Contributor hereby grants</FONT><FONT SIZE="2"> Recipient a non-exclusive, worldwide, royalty-free copyright license to</FONT><FONT SIZE="2" COLOR="#FF0000"> </FONT><FONT SIZE="2">reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">b) 	Subject to the terms of this Agreement, each Contributor hereby grants </FONT><FONT SIZE="2">Recipient a non-exclusive, worldwide,</FONT><FONT SIZE="2" COLOR="#008000"> </FONT><FONT SIZE="2">royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form.  This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents.  The patent license shall not apply to any other combinations which include the Contribution.  No hardware per se is licensed hereunder.   </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity.  Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise.  As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any.  For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2"><B>3.  REQUIREMENTS</B></FONT>
-<P><FONT SIZE="2"><B></B>A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:</FONT>
-
-<UL><FONT SIZE="2">a)	it complies with the terms and conditions of this Agreement; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	its license agreement:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	effectively disclaims</FONT><FONT SIZE="2"> on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; </FONT></UL>
-
-
-<UL><FONT SIZE="2">ii) 	effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; </FONT></UL>
-
-
-<UL><FONT SIZE="2">iii)</FONT><FONT SIZE="2">	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.</FONT><FONT SIZE="2" COLOR="#0000FF"> </FONT><FONT SIZE="2" COLOR="#FF0000"></FONT></UL>
-
-
-<UL><FONT SIZE="2" COLOR="#FF0000"></FONT><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2">When the Program is made available in source code form:</FONT>
-
-<UL><FONT SIZE="2">a)	it must be made available under this Agreement; and </FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	a copy of this Agreement must be included with each copy of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT><FONT SIZE="2">Contributors may not remove or alter any copyright notices contained within the Program.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>4.  COMMERCIAL DISTRIBUTION</B></FONT>
-<P><FONT SIZE="2">Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like.  While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors.   Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering.  The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement.  In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations.  The Indemnified Contributor may participate in any such claim at its own expense.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">For example, a Contributor might include the Program in a commercial product offering, Product X.  That Contributor is then a Commercial Contributor.  If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.  Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"></FONT><FONT SIZE="2"><B>5.  NO WARRANTY</B></FONT>
-<P><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is</FONT><FONT SIZE="2"> solely responsible for determining the appropriateness of using and distributing </FONT><FONT SIZE="2">the Program</FONT><FONT SIZE="2"> and assumes all risks associated with its exercise of rights under this Agreement</FONT><FONT SIZE="2">, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, </FONT><FONT SIZE="2">programs or equipment, and unavailability or interruption of operations</FONT><FONT SIZE="2">.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"><B>6.  DISCLAIMER OF LIABILITY</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES </FONT><FONT SIZE="2">(INCLUDING WITHOUT LIMITATION LOST PROFITS),</FONT><FONT SIZE="2"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>7.  GENERAL</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed.  In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance.  If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable.  However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted  and may only be modified in the following manner. The Agreement Steward reserves the right to </FONT><FONT SIZE="2">publish new versions (including revisions) of this Agreement from time to </FONT><FONT SIZE="2">time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward.   IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity.  </FONT><FONT SIZE="2">Each new version of the Agreement will be given a distinguishing version number.  The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new </FONT><FONT SIZE="2">version.  </FONT><FONT SIZE="2">Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, </FONT><FONT SIZE="2">by implication, estoppel or otherwise</FONT><FONT SIZE="2">.</FONT><FONT SIZE="2">  All rights in the Program not expressly granted under this Agreement are reserved.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose.  Each party waives its rights to a jury trial in any resulting litigation.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-
-</BODY>
-
-</HTML>
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.tools/doc/hglegal2002.htm b/bundles/org.eclipse.core.tools/doc/hglegal2002.htm
deleted file mode 100644
index 5df454d..0000000
--- a/bundles/org.eclipse.core.tools/doc/hglegal2002.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-   <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright IBM Corp. 2000, 2002. All Rights Reserved.
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.tools/doc/ngibmcpy2002.gif b/bundles/org.eclipse.core.tools/doc/ngibmcpy2002.gif
deleted file mode 100644
index 61cef48..0000000
--- a/bundles/org.eclipse.core.tools/doc/ngibmcpy2002.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/doc/readme.html b/bundles/org.eclipse.core.tools/doc/readme.html
deleted file mode 100644
index bd66ee6..0000000
--- a/bundles/org.eclipse.core.tools/doc/readme.html
+++ /dev/null
@@ -1,246 +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>Core Tools Readme</title>
-</head>
-
-<body>
-<h2 align="center">Core Tools</h2>
-<h3>Introduction</h3>
-
-  
-<p>Core Tools is a set of views and perspectives useful for people writing Eclipse 
-  plugins or just wanting to know what is going on under the covers. Roughly speaking 
-  there are three kinds of tools:</p>
-<dl> 
-  <dt><b>Runtime tools</b></dt>
-  <dd>The runtime tools expose the internal behaviour of the Platform runtime 
-    as well as certain aspects of plugins (activation ordering, classes loaded, 
-    relation to other plugins, ...) and classes (load order, load nesting, ...). 
-    Plugin developers can use this information to ensure that their plugins/classes 
-    are being activated/loaded as expected, and that they are not taking more 
-    time/space than is warranted.</dd>
-  <dt><b>Resources tools</b></dt>
-  <dd>The resources tools expose the behaviour/performance of installed builders 
-    and listeners as well as the structure of the workspace, resources and resource 
-    deltas.</dd>
-  <dt><b>Metadata tools</b></dt>
-  <dd>The metadata tools enable users to investigate the metadata files used in 
-    Eclipse. Point these tools at a metadata location and browse...</dd>
-</dl>
-
-  
-<h3>Installing and Running Core Tools</h3> 
-
-<h4>Installing Core Tools</h4>
-<p>If you are running on Eclipse 3.*, get org.eclipse.core.tools.zip and extract 
-  all files into the &lt;eclipse install&gt;/plugins directory. This will a add 
-  the Core Tools plugins and fragments to your install. Use Core Tools version 
-  1.1.0 for Eclipse 3.0.*, and Core Tools 1.2 for Eclipse 3.1 from M5a on.</p>
-<p>For running on Eclipse 2.1.* or earlier, the Core Tools comes in two parts; 
-  the tools themselves and some patches for the boot, runtime and resources plugins. 
-  To install:</p>
-<ol>
-  <li>To install the Core Tools, get org.eclipse.core.tools.zip and extract all 
-    files into the &lt;eclipse install&gt;/plugins directory. This will a add 
-    the Core Tools plugins and fragments to your install. 
-    Use Core Tools version 1.0.0 for Eclipse builds prior to I20030128, and
-  Core Tools 1.0.1 for all builds after that (including the 2.1 release).</li>
-  <li>If you are running an Eclipse build from before I20021127 (this includes 
-    2.0.*) you will need to get the patched versions of the boot, runtime and 
-    resources plugins. Get core-tools-patches.zip and extract all files into your 
-    &lt;eclipse install&gt;/plugins directory. This will overwrite boot.jar, runtime.jar 
-    and resources.jar. Note that if your install has version numbers in the plug-in 
-    directory names, you have to manually copy/extract the patch files into the 
-    corresponding versioned plug-in directory in your install.</li>
-</ol>
-<h4>Running Core Tools</h4>
-<p>After installing the Core Tools, you must enable them. The tools are enabled 
-  using Eclipse's debug options mechanism. To run Eclipse in &quot;debug&quot; 
-  mode, use the -debug command line option. If nothing else is said, Eclipse will 
-  look for the file &lt;eclipse install&gt;/.options. This is a Java properties 
-  file detailing which debug options should be enabled etc. See the Eclipse runtime 
-  documentation for more details. </p>
-<p>The org.eclipse.core.tools plugin contains an example .options file which enables 
-  all options (except class load trace filters). To run Eclipse with the Core 
-  Tools, either copy this file to your &lt;eclipse install&gt; directory or identify 
-  it on the command line after -debug. For example, </p>
-<pre>    eclipse -debug file:d:/.options</pre>
-<p>Note that not all tools require enablement. You need only enable the debug 
-  options required by the tools you choose to use. See the tool descriptions for 
-  details.</p>
-<p>If you are using PDE's runtime workbench then you can enable tracing and set 
-  the appropriate options for the target workspace. See PDE Guide -&gt; Running 
-  a plug-in -&gt; Running with tracing found in the standard Eclipse documentation 
-  set for more information.</p>
-<p>Once you are running with the Core Tools installed, there are a number of new 
-  perspectives and views. These are accessed by opening a new perspective or using 
-  the Window-&gt;Show View functions in the workbench.</p>
-<h3>Runtime Tools</h3> 
-
- 
-<p>The runtime tooling contributes a Runtime Spy and Plugin Dependency perspectives. 
-  Note that in some cases the views can be combined or used in other contexts. 
-  The individual views are accessed via the Workspace-&gt;Show View-&gt;Runtime 
-  Tools menu.</p>
-<h4>Runtime Spy Perspective</h4>
-<p>The Runtime Spy perspective shows information about the plugin activation, 
-  class loading, resource bundles etc. It is extremely useful when trying to track 
-  down why plugins are being activated or classes loaded as well as getting a 
-  handle on how much code is loaded. This tool contains four views: </p>
-<dl> 
-  <dt><b>Activated Plugins</b> </dt>
-  <dd>This is the list of plugins which have been activated since the start of 
-    this Eclipse session. Included is total code footprint, startup time, activation 
-    order as well as the number of classes loaded for each plugin.<br>
-    When plugins are activated a snapshot of the execution stack is taken. This 
-    stack trace can be viewed by selecting plugin and clicking on the stack trace 
-    'T' button on the title bar or in the context menu.<br>
-    The classes loaded by the selected plugins is shown in the Loaded Classes 
-    view when the &quot;Classes&quot; button ('C') on the menu bar or context 
-    menu is used.<br>
-    Note that this list is not automatically updated when a new plugin is activated 
-    so users should use the refresh button on the view title bar or in the context 
-    menu.</dd>
-  <dt><b>Loaded Classes</b> </dt>
-  <dd>This view is populated with classes loaded by plugins selected in the Activated 
-    Plugins view. For each class data such as load order and memory footprint 
-    are listed. If the appropriate filtering is enabled when the platform is started 
-    (see below), stack snapshots taken at class loading time are available by 
-    selecting a class and using the Stack Trace menu entry or title bar button.</dd>
-  <dt><b>Plugin Datasheet</b> </dt>
-  <dd>Shows a summary of the currently selected plugin.</dd>
-  <dt><b>Stack Trace</b> </dt>
-  <dd>Shows a snapshot of the execution stack at the time of some event (e.g., 
-    plugin activation, class loading).</dd>
-</dl>
-<p>The following debug options control what data is available in Runtime Spy perspective 
-  views.</p>
-<dl>
-  <dt>org.eclipse.osgi/monitor/classes=&lt;boolean&gt;</dt>
-  <dd>Whether or not to monitor which classes are loaded.</dd>
-  <dt>org.eclipse.osgi/monitor/activation=&lt;boolean&gt;</dt>
-  <dd>Whether or not to monitor which plugins are activated.</dd>
-  <dt>org.eclipse.osgi/monitor/resources=&lt;boolean&gt;</dt>
-  <dd>Whether or not to monitor which resource bundles (i.e., *.properties files 
-    ) are loaded</dd>
-  <dt>org.eclipse.osgi/trace/classLoading=&lt;boolean&gt;</dt>
-  <dd>Whether or not to snapshot the execution stack when a class is loaded</dd>
-  <dt>org.eclipse.osgi/trace/filename=&lt;file location&gt;</dt>
-  <dd>The file in which execution traces are written</dd>
-  <dt>org.eclipse.osgi/trace/filters=&lt;properties file&gt;</dt>
-  <dd>The location of a Java properties file identifying the classes which should 
-    be traced (if trace/classLoading is true). The File format is: <br>
-    plugins=&lt;comma separated list of plugins whose classes to trace&gt;<br>
-    packages=&lt;comma separated list of package prefixes of classes to trace&gt;<br>
-    Note that there may be many 'plugins' and 'packages' lines in one file.</dd>
-  <dt>org.eclipse.osgi/trace/activation=&lt;boolean&gt;</dt>
-  <dd>Whether or not to snapshot the execution stack when a plugin is activated.<br>
-  </dd>
-</dl>
-<h4>Plug-In Dependency Perspective</h4>
-<p>This perspective includes 2 views: a plug-in list view listing all the plug-ins 
-  available in the workspace and a plug-in dependency view. The plug-in ids in 
-  the list view are given in alphabetical order (according to their plug-in id). 
-  Select a plug-in in the list view and the dependency view is updated to show 
-  all plug-ins that the selected plug-in requires as well as all plug-ins that 
-  require this selected plug-in. This information is currently only presented 
-  in a text format.</p>
-<h3>Resources Tools</h3>
-<p>The Resources tooling consists of a number of views described below. These 
-  are accessed via the Workspace-&gt;Show View-&gt;Resources Tools menu and can 
-  be used independently or together to as desired. </p>
-<h4>Resource Spy view</h4>
-This view shows detailed public/internal information about the resource currently 
-selected in any Eclipse view (e.g. Resource Navigator, Package Explorer, etc). 
-It shows details about: flags, markers, synchronization information, session/persistent 
-properties, content type). 
-<h4>Delta Spy View</h4>
-The Delta Spy listens for any resource changes, echoing the resource delta for 
-each change event listened. For each affected resource (and its child resources), 
-it shows the following information: 
-<ul>
-  <li>the resource's full path;</li>
-  <li>the kind of change (between brackets): addition (+), phantom addition (&gt;), 
-    removal (-), phantom removal (&lt;), change (*), no change (~), and unknown 
-    (?);</li>
-  <li>the change flags (between curly braces): CONTENT, MOVED_FROM, MOVED_TO, 
-    OPEN, TYPE, SYNC, MARKERS, REPLACED, DESCRIPTION;</li>
-  <li>in the case it is a marker change, it will show (between brackets) for each 
-    marker changed: 
-    <ul>
-      <li>the kind of marker change: addition (+), removal (-), change (*);</li>
-      <li>the marker's id;</li>
-    </ul>
-  </li>
-  <li>if it is a team private change, a "(team private)" tag.</li>
-</ul>
-<h4>Graphical Delta Spy View</h4>
-<p>The Graphical Delta Spy is similar to the Delta Spy describe above, but it 
-  shows the resource delta tree using a tree widget instead of indented text. 
-  This view can only show the resource delta tree for the last resource change 
-  event only. However, it is easier to visualize a resource delta tree due to 
-  its graphical nature.</p>
-<p>The Graphical Delta Spy view provides a pull-down menu that allows the user 
-  to select which types of events to listen to (PRE_BUILD, POST_BUILD, POST_CHANGE) 
-  and whether phantom resources should be taken into account..</p>
-<h4>Builders/Listeners Spy</h4>
-<p>The Builders/Listeners Spy view displays statistical information about the 
-  behaviour and performance of installed builders and resource change listeners. 
-  The information includes:</p>
-<ul>
-  <li>the name of builder/listener (listeners do not technically have names so 
-    their toString() is used)</li>
-  <li>the project related to the builder (blank for listeners)</li>
-  <li>the number of events (builds or resource changed) processed by the builder/listener</li>
-  <li>the amount of time spent processing these events</li>
-  <li>the number of core exceptions encountered</li>
-</ul>
-<p>For more informatioin on listeners see the Eclipse article &quot;How You've 
-  Changed! Responding to resource changes in the Eclipse workspace&quot; by John 
-  Arthorne (OTI) August 23, 2002. Documentation on builders can be found in the 
-  Platform Plug-in Developer Guide included with the Eclipse documentation.</p>
-<p>The following debug options control what data is available in Builder/Listener 
-  Spy view.</p>
-<dl> 
-  <dt>org.eclipse.core.resources/monitor/builders=&lt;boolean&gt;</dt>
-  <dd>Whether or not to monitor which builders.</dd>
-  <dt>org.eclipse.core.resources/monitor/listeners=&lt;boolean&gt;</dt>
-  <dd>Whether or not to monitor which listeners.</dd>
-</dl>
-<h3>Metadata Tools</h3>
-<p>The metadata tooling contributes a Metadata perspective. The individual views 
-  are not particularly useful on their own but are accessed via the Window-&gt;Show 
-  View-&gt;Metadata Tools menu.</p>
-<h4>The Metadata Perspective</h4>
-This perspective contains three views which allows the user to select a directory, 
-browse any metadata found in it and see contents and integrity status of supported 
-files. 
-<dl> 
-  <dt><b>Metadata Spy</b></dt>
-  <dd>This view allows the user to select a given metadata directory and uses 
-    a tree view to show a directory hierarchy containing all known metadata files 
-    as leaf nodes. If the user double-clicks one of these leaf nodes, the Dump 
-    Contents view will be opened having this file as its current selected file. 
-  </dd>
-  <dt><b>Dump Contents</b></dt>
-  <dd>This view presents to the user the contents of a selected metadata file 
-    in a human-readable format. It provides an action for selecting a new file 
-    to dump. The contents layout will depend on what kind of file is being dumped. 
-    This view has a sub-view called &quot;Dump Summary&quot; that shows whether 
-    the file read was ok or not. </dd>
-  <dt><b>Dump Summary</b></dt>
-  <dd>This view presents to the user the results of a file dumped using the Dump 
-    Contents view. In the case of a error during the dumping process (because 
-    the metadata file being dumped was corrupted), the reason will be shown here, 
-    along with the number of bytes read. This view will only be updated if it 
-    is open when a file is being dumped. </dd>
-</dl>
-<p>Note: the dumping functionality is also available as a headless Eclipse application: 
-  <tt>org.eclipse.core.tools.dumptool</tt>. To run it, you need to pass the file 
-  to be dumped using the <tt>dump.file</tt> system property. For instance:</p>
-<pre>eclipse -application org.eclipse.core.tools.dumptool -vmargs -Ddump.file=d:\eclipse\configuration\org.eclipse.osgi\.state</pre>
-<h4><a href="hglegal2002.htm"><img SRC="ngibmcpy2002.gif" ALT="Copyright IBM Corporation and others 2000, 2002.  All Rights Reserved." BORDER=0 height=14 width=324></a></h4>
-  </body>
-</html>
diff --git a/bundles/org.eclipse.core.tools/icons/classes.gif b/bundles/org.eclipse.core.tools/icons/classes.gif
deleted file mode 100644
index 4fa0940..0000000
--- a/bundles/org.eclipse.core.tools/icons/classes.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/clear.gif b/bundles/org.eclipse.core.tools/icons/clear.gif
deleted file mode 100644
index 2558326..0000000
--- a/bundles/org.eclipse.core.tools/icons/clear.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/collapseall.gif b/bundles/org.eclipse.core.tools/icons/collapseall.gif
deleted file mode 100644
index 0bae56c..0000000
--- a/bundles/org.eclipse.core.tools/icons/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/datasheet.gif b/bundles/org.eclipse.core.tools/icons/datasheet.gif
deleted file mode 100644
index ec0cba1..0000000
--- a/bundles/org.eclipse.core.tools/icons/datasheet.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/plugin.gif b/bundles/org.eclipse.core.tools/icons/plugin.gif
deleted file mode 100644
index 8a87648..0000000
--- a/bundles/org.eclipse.core.tools/icons/plugin.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/refresh.gif b/bundles/org.eclipse.core.tools/icons/refresh.gif
deleted file mode 100644
index a063c23..0000000
--- a/bundles/org.eclipse.core.tools/icons/refresh.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/req_plugins_obj.gif b/bundles/org.eclipse.core.tools/icons/req_plugins_obj.gif
deleted file mode 100644
index 689f522..0000000
--- a/bundles/org.eclipse.core.tools/icons/req_plugins_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/reset.gif b/bundles/org.eclipse.core.tools/icons/reset.gif
deleted file mode 100644
index 8d50500..0000000
--- a/bundles/org.eclipse.core.tools/icons/reset.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/spy.gif b/bundles/org.eclipse.core.tools/icons/spy.gif
deleted file mode 100644
index ce3fc51..0000000
--- a/bundles/org.eclipse.core.tools/icons/spy.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/trace.gif b/bundles/org.eclipse.core.tools/icons/trace.gif
deleted file mode 100644
index 34027a5..0000000
--- a/bundles/org.eclipse.core.tools/icons/trace.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/icons/zoom.gif b/bundles/org.eclipse.core.tools/icons/zoom.gif
deleted file mode 100644
index 3c10582..0000000
--- a/bundles/org.eclipse.core.tools/icons/zoom.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.core.tools/plugin.xml b/bundles/org.eclipse.core.tools/plugin.xml
deleted file mode 100644
index 0cc47e7..0000000
--- a/bundles/org.eclipse.core.tools/plugin.xml
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point id="metadataDumpers" name="Metadata Dumpers"/>
-   
-<!-- Metadata dumpers -->
-   <extension point="org.eclipse.core.tools.metadataDumpers">
-      <dumper file-name=".state" class="org.eclipse.core.tools.metadata.StateDumper"/>
-   </extension>
-   
-<!-- The DumpTool headless application -->
-   <extension point="org.eclipse.core.runtime.applications" id="dumptool">
-    <application> 
-      <run class="org.eclipse.core.tools.metadata.DumpTool"/>
-    </application>
-   </extension>   
-   
-
-<!--  Perspectives -->
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="Plug-in Dependency"
-            icon="icons/req_plugins_obj.gif"
-            class="org.eclipse.core.tools.runtime.PluginDependencyPerspective"
-            id="org.eclipse.core.tools.runtime.PluginDependencyPerspective">
-      </perspective>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="Runtime Spy"
-            icon="icons/zoom.gif"
-            class="org.eclipse.core.tools.runtime.RuntimeSpyPerspective"
-            id="org.eclipse.core.tools.runtime.RuntimeSpyPerspective">
-      </perspective>
-   </extension>
-<!--  Metadata Perspective -->
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="Metadata"
-            icon="icons/spy.gif"
-            class="org.eclipse.core.tools.metadata.MetadataPerspective"
-            id="org.eclipse.core.tools.metadata.MetadataPerspective">
-      </perspective>
-   </extension>
-<!-- Metadata Views  -->
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="Metadata Tools"
-            id="org.eclipse.core.tools.metadata">
-      </category>
-      <view
-            name="Dump Contents"
-            icon="icons/spy.gif"
-            category="org.eclipse.core.tools.metadata"
-            class="org.eclipse.core.tools.metadata.DumpContentsView"
-            id="org.eclipse.core.tools.metadata.DumpContentsView">
-      </view>
-      <view
-            name="Dump Summary"
-            icon="icons/spy.gif"
-            category="org.eclipse.core.tools.metadata"
-            class="org.eclipse.core.tools.metadata.DumpSummaryView"
-            id="org.eclipse.core.tools.metadata.DumpSummaryView">
-      </view>
-      <view
-            name="Metadata Spy"
-            icon="icons/spy.gif"
-            category="org.eclipse.core.tools.metadata"
-            class="org.eclipse.core.tools.metadata.MetadataTreeView"
-            id="org.eclipse.core.tools.metadata.MetadataTreeView">
-      </view>
-   </extension>   
-<!-- Runtime Views -->
-   <extension point="org.eclipse.ui.views">
-      <category name="Runtime Tools" id="org.eclipse.core.tools.runtime"/>
-      <view
-            name="Activated Plug-ins"
-            icon="icons/plugin.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.ActivePluginsView"
-            id="org.eclipse.core.tools.runtime.ActivePluginsView"/>
-      <view
-            name="Loaded Classes"
-            icon="icons/classes.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.LoadedClassesView"
-            id="org.eclipse.core.tools.runtime.LoadedClassesView"/>
-      <view
-            name="Plug-in Datasheet"
-            icon="icons/datasheet.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.PluginDataSheetView"
-            id="org.eclipse.core.tools.runtime.PluginDataSheetView"/>
-      <view
-            name="Stack Trace"
-            icon="icons/trace.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.StackTraceView"
-            id="org.eclipse.core.tools.runtime.StackTraceView"/>
-      <view
-            name="Plug-in Dependency Spy"
-            icon="icons/spy.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.PluginDependencyView"
-            id="org.eclipse.core.tools.runtime.PluginDependencyView"/>
-      <view
-            name="Plug-in List Spy"
-            icon="icons/spy.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.PluginListView"
-            id="org.eclipse.core.tools.runtime.PluginListView"/>
-      <view
-            name="Preferences Spy"
-            icon="icons/spy.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.EclipsePreferencesView"
-            id="org.eclipse.core.tools.runtime.EclipsePreferencesView"/>
-      <view
-            name="Preference Stats Spy"
-            icon="icons/spy.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.PreferenceStatsView"
-            id="org.eclipse.core.tools.runtime.PreferenceStatsView"/>
-      <view
-            name="Content Types"
-            icon="icons/spy.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.ContentTypeView"
-            id="org.eclipse.core.tools.runtime.ContentTypeView"/>            
-      <view
-            name="Event Spy"
-            icon="icons/spy.gif"
-            category="org.eclipse.core.tools.runtime"
-            class="org.eclipse.core.tools.runtime.EventsView"
-            id="org.eclipse.core.tools.runtime.EventsView"/>
-   </extension>
-   	<extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.core.tools.nls.testing.contribution"
-            objectClass="org.eclipse.jdt.core.ICompilationUnit">
-         <action
-               label="Convert to NLS Messages"
-               class="org.eclipse.core.tools.nls.ConvertMessageBundleAction"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.core.tools.nls.ConvertMessageBundleAction">
-         </action>
-         <action
-               label="Remove Unused Messages"
-               class="org.eclipse.core.tools.nls.RemoveUnusedMessagesAction"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.core.tools.nls.RemoveUnusedMessagesAction">
-         </action>
-      </objectContribution>
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.core.tools.contribution2"
-            objectClass="org.eclipse.jdt.core.IJavaElement">
-         <action
-               label="Find Unreferenced Members"
-               class="org.eclipse.core.tools.search.FindUnusedMembersAction"
-               menubarPath="additions"
-               enablesFor="*"
-               id="org.eclipse.core.tools.search.FindUnusedMembersAction">
-         </action>
-      </objectContribution>
-   </extension>
-</plugin>
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/AbstractCopySelectionAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/AbstractCopySelectionAction.java
deleted file mode 100644
index b0686a0..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/AbstractCopySelectionAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.dnd.*;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * A base abstract implementation for "copy selection" actions.
- */
-
-public abstract class AbstractCopySelectionAction extends GlobalAction {
-
-	/**
-	 * The selection provider.
-	 */
-	protected ISelectionProvider selectionProvider;
-
-	/**
-	 * Sets action's text and tool tip text.
-	 * 
-	 * @param selectionProvider the selection provider
-	 */
-	public AbstractCopySelectionAction(ISelectionProvider selectionProvider) {
-		super("&Copy"); //$NON-NLS-1$
-		this.selectionProvider = selectionProvider;
-	}
-
-	/**
-	 * Copies the currently selected contents to the clipboard. The meaning of the 
-	 * currently selected contents is defined by overriding the getContents() 
-	 * method.
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		// puts that content in the clipboard
-		Clipboard clipboard = new Clipboard(Display.getCurrent());
-		clipboard.setContents(new Object[] {getContents()}, new Transfer[] {TextTransfer.getInstance()});
-		clipboard.dispose();
-	}
-
-	/**
-	 * Registers this action as a global action handler.
-	 * 
-	 * @param actionBars the action bars where this action will be registered.
-	 * @see org.eclipse.core.tools.GlobalAction#registerAsGlobalAction(
-	 * org.eclipse.ui.IActionBars)
-	 */
-	public void registerAsGlobalAction(IActionBars actionBars) {
-		actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), this);
-	}
-
-	/**
-	 * Returns the currently selected contents as a String object.
-	 * 
-	 * @return the selected contents as string.
-	 */
-	protected abstract String getContents();
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/AbstractTreeContentProvider.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/AbstractTreeContentProvider.java
deleted file mode 100644
index cfc005d..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/AbstractTreeContentProvider.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * An abstract base class for hierarchical content providers. Uses  
- * <code>TreeContentProviderNode</code> objects to keep a hierarchical
- * data model. Subclasses must provide an implementation for the 
- * <code>#rebuild(Object)</code> operation in order to define how the data model
- * will be built upon a given input provided by the viewer. 
- */
-
-public abstract class AbstractTreeContentProvider implements ITreeContentProvider {
-
-	/**
-	 * Flag for omitting the root or not when providing the contents. 
-	 */
-	private boolean omitRoot;
-
-	/**
-	 * The root node.
-	 */
-	private TreeContentProviderNode rootNode;
-
-	/**
-	 * Constructs a AbstractTreeContentProvider. 
-	 *
-	 * @param omitRoot if true, the root node will be omitted when providing 
-	 * contents. 
-	 */
-	protected AbstractTreeContentProvider(boolean omitRoot) {
-		this.omitRoot = omitRoot;
-	}
-
-	/**
-	 * Constructs a AbstractTreeContentProvider that will omit the root node when 
-	 * providing contents.
-	 * 
-	 * @see #AbstractTreeContentProvider(boolean)
-	 */
-	protected AbstractTreeContentProvider() {
-		this(true);
-	}
-
-	/**
-	 * Returns the child elements of the given parent element.
-	 * 
-	 * @return an array containing <code>parentElement</code>'s children.  
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(
-	 * java.lang.Object)
-	 * @see org.eclipse.core.tools.TreeContentProviderNode#getChildren() 
-	 */
-	public Object[] getChildren(Object parentElement) {
-		if (!(parentElement instanceof TreeContentProviderNode))
-			return null;
-
-		TreeContentProviderNode treeNode = (TreeContentProviderNode) parentElement;
-		return treeNode.getChildren();
-	}
-
-	/**
-	 * Returns the parent for the given element, or <code>null</code> 
-	 * indicating that the parent can't be computed. 
-	 *
-	 * @return <coded>element</code>'s parent node or null, if it is a root node 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(
-	 * java.lang.Object)
-	 * @see org.eclipse.core.tools.TreeContentProviderNode#getParent()
-	 */
-	public Object getParent(Object element) {
-		if (!(element instanceof TreeContentProviderNode))
-			return null;
-
-		TreeContentProviderNode treeNode = (TreeContentProviderNode) element;
-		return treeNode.getParent();
-	}
-
-	/**
-	 * Returns whether the given element has children.
-	 *
-	 * @return true, if <code>element</code> has children, false otherwise 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(
-	 * java.lang.Object)
-	 * @see org.eclipse.core.tools.TreeContentProviderNode#hasChildren() *  
-	 */
-	public boolean hasChildren(Object element) {
-		return element instanceof TreeContentProviderNode && ((TreeContentProviderNode) element).hasChildren();
-	}
-
-	/**
-	 * Returns the elements to display in the viewer 
-	 * when its input is set to the given element. 
-	 * 
-	 * @return this content provider root element's children
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(
-	 * java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		if (rootNode == null)
-			return new Object[0];
-
-		return omitRoot ? rootNode.getChildren() : new Object[] {rootNode};
-	}
-
-	/**
-	 * Disposes of this content provider.  
-	 * This is called by the viewer when it is disposed.
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		rootNode = null;
-	}
-
-	/**
-	 * Helper method that creates a root node given a node name and value.
-	 * 
-	 * @param name the name of the node
-	 * @param value the value of the node. May be null.
-	 * @return the tree node created
-	 * @see TreeContentProviderNode#TreeContentProviderNode(String, Object) 
-	 */
-	protected TreeContentProviderNode createNode(String name, Object value) {
-		return new TreeContentProviderNode(name, value);
-	}
-
-	/**
-	 * Helper method that creates a root node given a node name and no value.
-	 * 
-	 * @param name the name of the node
-	 * @return the tree node created
-	 * @see TreeContentProviderNode#TreeContentProviderNode(String) 
-	 */
-	protected TreeContentProviderNode createNode(String name) {
-		return new TreeContentProviderNode(name);
-	}
-
-	/**
-	 * Notifies this content provider that the given viewer's input
-	 * has been switched to a different element.
-	 * Rebuilds this content provider's state from a given resource.
-	 * 
-	 * @param viewer the viewer
-	 * @param oldInput ignored
-	 * @param input the new input. If null, clears this content provider. If not,
-	 * is passed in a call to <code>rebuild(Object)</code>. 
-	 * @see 
-	 * org.eclipse.jface.viewers.IContentProvider#inputChanged(
-	 * org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 * @see #rebuild(Viewer, Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, final Object input) {
-		if (input == null) {
-			rootNode = createNode("root"); //$NON-NLS-1$
-			return;
-		}
-
-		if (!acceptInput(input))
-			return;
-
-		rootNode = createNode("root"); //$NON-NLS-1$	    
-		rebuild(viewer, input);
-	}
-
-	/**
-	 * Reconstructs this content provider data model upon the provided input object.
-	 *  
-	 * @param input the new input object - must not be null
-	 * @param viewer the corresponding viewer
-	 */
-	protected abstract void rebuild(Viewer viewer, Object input);
-
-	/**
-	 * Returns true if the provided input is accepted by this content provider.
-	 * 
-	 * @param input an input object
-	 * @return boolean true if the provided object is accepted, false otherwise
-	 */
-	protected abstract boolean acceptInput(Object input);
-
-	/**
-	 * Returns the rootNode.
-	 * 
-	 * @return this content provider root node
-	 */
-	protected TreeContentProviderNode getRootNode() {
-		return rootNode;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/BaseTextView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/BaseTextView.java
deleted file mode 100644
index d151dd6..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/BaseTextView.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.part.ViewPart;
-
-public class BaseTextView extends ViewPart {
-	protected TextViewer viewer;
-
-	public BaseTextView() {
-		super();
-	}
-
-	public void createPartControl(Composite parent) {
-		viewer = new TextViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY);
-		viewer.setDocument(new Document());
-
-		IActionBars bars = getViewSite().getActionBars();
-
-		GlobalAction selectAllAction = new SelectAllAction(viewer);
-		selectAllAction.registerAsGlobalAction(bars);
-
-		GlobalAction copyAction = new CopyTextSelectionAction(viewer);
-		copyAction.registerAsGlobalAction(bars);
-
-		bars.updateActionBars();
-
-		// creates a context menu with actions and adds it to the viewer control
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.add(copyAction);
-		menuMgr.add(selectAllAction);
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-	}
-
-	public void setFocus() {
-		// do nothing
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ByteUtil.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ByteUtil.java
deleted file mode 100644
index a8987b8..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ByteUtil.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-/**
- * A set of utility methods for dealing with byte arrays.
- */
-public class ByteUtil {
-
-	/**
-	 * Helper method that creates a string representation for a byte array.
-	 * 
-	 * @param byteArray a byte array to be represented as string
-	 * @param max a maximum number of bytes to be considered - if zero, there is 
-	 * no maximum. 
-	 * @return a byte array string representation
-	 */
-	public static String byteArrayToString(byte[] byteArray, int max) {
-		StringBuffer result = new StringBuffer(byteArray.length * 2 + 2);
-		int bytesToBeShown = (max > 0) ? (Math.min(max, byteArray.length)) : byteArray.length;
-		result.append('[');
-		for (int i = 0; i < bytesToBeShown; i++) {
-			result.append(byteArray[i]);
-			result.append(',');
-		}
-		// adds an ellipsis if there is too much bytes to show
-		if (max > 0 && max < byteArray.length)
-			result.append("..."); //$NON-NLS-1$
-		// or remove the trailing comma
-		else
-			result.deleteCharAt(result.length() - 1);
-		result.append(']');
-		return result.toString();
-	}
-
-	/**
-	 * Calls <code>byteArrayToString()</code> with no limit for array lenght.
-	 * 
-	 * @see #byteArrayToString(byte[], int) 
-	 * @param byteArray the array to be converted to string
-	 * @return a string representation for the array 
-	 */
-	public static String byteArrayToString(byte[] byteArray) {
-		return byteArrayToString(byteArray, 0);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ClearTextAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ClearTextAction.java
deleted file mode 100644
index 1d4af80..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ClearTextAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-/**
- * Generic "clear contents" action. Sets action's text, tool tip text and icon.
- */
-
-public class ClearTextAction extends GlobalAction {
-
-	/**
-	 * The document on which this action performs its duty.
-	 */
-	private IDocument document;
-
-	/**
-	 * Constructs a ClearTextAction action with the provided document. 
-	 * 
-	 * @param document the document to be cleared when this action is run.
-	 */
-	public ClearTextAction(IDocument document) {
-		super("Cle&ar Contents"); //$NON-NLS-1$
-		this.setToolTipText("Clear contents"); //$NON-NLS-1$
-		this.document = document;
-		// the delete key is not captured by the workbench
-		// then we need to provide an action definition id
-		// so clients can register this action in their key binding services
-		this.setActionDefinitionId(IWorkbenchActionDefinitionIds.DELETE);
-		this.setImageDescriptor(CoreToolsPlugin.createImageDescriptor("clear.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Executes this action (clears associated document's contents).
-	 */
-	public void run() {
-		document.set(""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Registers this action as a global action handler.
-	 * 
-	 * @param actionBars the action bars where this action will be registered.
-	 * @see GlobalAction#registerAsGlobalAction(org.eclipse.ui.IActionBars)
-	 */
-	public void registerAsGlobalAction(IActionBars actionBars) {
-		actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), this);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CollapseAllAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CollapseAllAction.java
deleted file mode 100644
index 9ec3b24..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CollapseAllAction.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.TreeViewer;
-
-/**
- * @since 3.0
- */
-public class CollapseAllAction extends Action implements IAction {
-
-	private static final String label = "Collapse All"; //$NON-NLS-1$
-	private static final String imageName = "collapseall.gif"; //$NON-NLS-1$
-	private TreeViewer viewer;
-
-	public CollapseAllAction(TreeViewer viewer) {
-		super(label);
-		this.setToolTipText(label);
-		this.viewer = viewer;
-		this.setImageDescriptor(CoreToolsPlugin.createImageDescriptor(imageName));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		viewer.collapseAll();
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CopyStructuredSelectionAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CopyStructuredSelectionAction.java
deleted file mode 100644
index ccd394a..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CopyStructuredSelectionAction.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import java.util.Iterator;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * A concrete implementation for <code>AbstractCopySelectionAction</code> that 
- * supports structured selections.
- * 
- * @see org.eclipse.jface.viewers.IStructuredSelection
- */
-public class CopyStructuredSelectionAction extends AbstractCopySelectionAction {
-
-	/** 
-	 * @see org.eclipse.core.tools.AbstractCopySelectionAction#AbstractCopySelectionAction(ISelectionProvider)
-	 */
-	public CopyStructuredSelectionAction(ISelectionProvider selectionProvider) {
-		super(selectionProvider);
-	}
-
-	/**
-	 * Returns the current structured selection as a string object where each 
-	 * node is followed by a line terminator char.  This method depends on the
-	 * toString() method of each node to define a reasonably formatted string
-	 * for display.
-	 * 
-	 * @return a string containing the currently selected elements separated by
-	 * line terminators 
-	 * @see org.eclipse.core.tools.AbstractCopySelectionAction#getContents()
-	 */
-	public String getContents() {
-		// retrieves the selected contents from the selection provider
-		IStructuredSelection selection = (IStructuredSelection) selectionProvider.getSelection();
-		StringBuffer content = new StringBuffer();
-		for (Iterator selectionIter = selection.iterator(); selectionIter.hasNext();) {
-			content.append(selectionIter.next());
-			content.append('\n');
-		}
-		return content.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CopyTextSelectionAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CopyTextSelectionAction.java
deleted file mode 100644
index 6e813a1..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CopyTextSelectionAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-
-/**
- * A concrete implementation for <code>AbstractCopySelectionAction</code> that 
- * supports text selections.
- * 
- * @see org.eclipse.jface.text.ITextSelection
- */
-public class CopyTextSelectionAction extends AbstractCopySelectionAction {
-
-	/**
-	 * @see AbstractCopySelectionAction#AbstractCopySelectionAction
-	 * (ISelectionProvider)
-	 */
-	public CopyTextSelectionAction(ISelectionProvider selectionProvider) {
-		super(selectionProvider);
-	}
-
-	/**
-	 * Returns the current text selection.
-	 * 
-	 * @return a string containing the currently selected text
-	 * @see org.eclipse.core.tools.AbstractCopySelectionAction#getContents()
-	 */
-	protected String getContents() {
-		return ((ITextSelection) selectionProvider.getSelection()).getText();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CoreToolsPlugin.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CoreToolsPlugin.java
deleted file mode 100644
index 26725ba..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/CoreToolsPlugin.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import java.net.URL;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.internal.stats.ClassloaderStats;
-import org.eclipse.core.runtime.internal.stats.StatsManager;
-import org.eclipse.core.tools.runtime.VMClassInfo;
-import org.eclipse.core.tools.runtime.VMClassloaderInfo;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-public class CoreToolsPlugin extends AbstractUIPlugin {
-	private static CoreToolsPlugin instance;
-	public static String PLUGIN_ID = "org.eclipse.core.tools"; //$NON-NLS-1$
-	private BundleContext context;
-
-	static {
-		if (StatsManager.MONITOR_ACTIVATION)
-			initializeBootClasses();
-	}
-
-	public static CoreToolsPlugin getDefault() {
-		return instance;
-	}
-
-	private static void initializeBootClasses() {
-		if (!VMClassloaderInfo.hasNatives)
-			return;
-		ClassloaderStats loader = ClassloaderStats.getLoader("org.eclipse.osgi"); //$NON-NLS-1$
-		//class loading trace option not enabled
-		if (loader == null)
-			return;
-		VMClassInfo[] classes = VMClassloaderInfo.getBaseClasses();
-		String[] names = new String[classes.length];
-		for (int i = 0; i < classes.length; i++)
-			names[i] = classes[i].getName();
-		loader.addBaseClasses(names);
-	}
-
-	/**
-	 * find an icon - caller must dispose of it
-	 */
-	public static ImageDescriptor createImageDescriptor(String imageName) {
-		URL url = getDefault().getBundle().getEntry("icons/" + imageName); //$NON-NLS-1$
-		if (url != null)
-			return ImageDescriptor.createFromURL(url);
-		return ImageDescriptor.getMissingImageDescriptor();
-	}
-
-	public CoreToolsPlugin() {
-		super();
-		instance = this;
-	}
-
-	public void start(BundleContext bundleContext) throws Exception {
-		super.start(bundleContext);
-		this.context = bundleContext;
-	}
-
-	public BundleContext getContext() {
-		return context;
-	}
-	
-	public void log(String message, Throwable exception) {
-		getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, 0, message, exception));
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/DeepSize.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/DeepSize.java
deleted file mode 100644
index 8c8dbfa..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/DeepSize.java
+++ /dev/null
@@ -1,237 +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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.*;
-
-/**
- * How to use DeepSize:
- * DeepSize result= DeepSize.deepSize(anObject);
- * int size= result.getSize(); // accumulated size of transitive closure of anObject
- * Hashtable sizes= result.getSizes(); // hashtable of internal results: class name-> sum of shallowsize of instances of class
- * Hashtable counts= result.getCounts(); // hashtable of internal results: class name -> instances of class
- * Additional function
- * DeepSize d= new DeepSize();
- * d.setIgnoreTypeNames(aSet); // don't consider instances of classes named in aSet as part of the size
- * d.ignore(anObject); // don't consider anObject as part of the size
- * d.deepCompute(anObject); // advanced compute method - computes the size given the additional ignore configuration
- */
-public class DeepSize {
-	/**
-	 * Used as keys to track sets of non-identical objects.
-	 */
-	public static class ObjectWrapper {
-		private Object object;
-
-		public ObjectWrapper(Object object) {
-			this.object = object;
-		}
-
-		public boolean equals(Object o) {
-			if (o.getClass() != ObjectWrapper.class)
-				return false;
-			return object == ((ObjectWrapper) o).object;
-		}
-
-		public int hashCode() {
-			return object == null ? 1 : object.hashCode();
-		}
-
-		public String toString() {
-			return "ObjectWrapper(" + object + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	public static final int ARRAY_HEADER_SIZE = 12;
-
-	public static final int HEADER_SIZE = 8;
-	static final HashSet ignoreSet = new HashSet();
-	public static final int OBJECT_HEADER_SIZE = HEADER_SIZE;
-	public static final int POINTER_SIZE = 4;
-	int byteSize;
-	final Map counts = new HashMap();
-
-	Set ignoreTypeNames = null;
-	final Map sizes = new HashMap();
-
-	/**
-	 * Adds an object to the ignore set. Returns true if the object
-	 * has already been ignored previously, and false otherwise.
-	 */
-	public static boolean ignore(Object o) {
-		return !ignoreSet.add(new ObjectWrapper(o));
-	}
-
-	public static void reset() {
-		ignoreSet.clear();
-	}
-
-	private void count(Class c, int size) {
-		Object accumulatedSizes = sizes.get(c);
-		int existingSize = (accumulatedSizes == null) ? 0 : ((Integer) accumulatedSizes).intValue();
-		sizes.put(c, new Integer(existingSize + size));
-
-		Object accumulatedCounts = counts.get(c);
-		int existingCount = (accumulatedCounts == null) ? 0 : ((Integer) accumulatedCounts).intValue();
-		counts.put(c, new Integer(existingCount + 1));
-	}
-
-	public void deepSize(Object o) {
-		byteSize += sizeOf(o);
-	}
-
-	public Map getCounts() {
-		return counts;
-	}
-
-	Set getDefaultIgnoreTypeNames() {
-		Set ignored = new HashSet();
-		String[] ignore = {"org.eclipse.core.runtime.Plugin", "java.lang.ClassLoader", "org.eclipse.team.internal.ccvs.core.CVSTeamProvider", "org.eclipse.core.internal.events.BuilderPersistentInfo", "org.eclipse.core.internal.resources.Workspace", "org.eclipse.core.internal.events.EventStats"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-6$
-		for (int i = 0; i < ignore.length; i++) {
-			ignored.add(ignore[i]);
-		}
-		return ignored;
-	}
-
-	private Object getFieldObject(Field f, Object o) {
-		try {
-			f.setAccessible(true);
-			return f.get(o);
-		} catch (IllegalAccessException e) {
-			throw new Error(e.toString());
-		}
-	}
-
-	public int getSize() {
-		return byteSize;
-	}
-
-	public Map getSizes() {
-		return sizes;
-	}
-
-	private boolean isStaticField(Field f) {
-		return (Modifier.STATIC & f.getModifiers()) != 0;
-	}
-	
-	/**
-	 * Prints a detailed report of memory usage by type to standard output
-	 */
-	public void printSizeReport() {
-		System.out.println("*** Begin DeepSize report ***"); //$NON-NLS-1$
-		for (Iterator it = sizes.keySet().iterator(); it.hasNext();) {
-			Class clazz = (Class) it.next();
-			int size = ((Integer)sizes.get(clazz)).intValue();
-			System.out.println('\t' + clazz.getName() + " size: " + size); //$NON-NLS-1$
-			System.out.println("Total size of all objects: " + getSize()); //$NON-NLS-1$
-		}
-		System.out.println("*** End DeepSize report ***"); //$NON-NLS-1$
-	}
-
-	void setIgnoreTypeNames(Set ignore) {
-		ignoreTypeNames = ignore;
-	}
-
-	private boolean shouldIgnoreType(Class clazz) {
-		if (ignoreTypeNames == null) {
-			ignoreTypeNames = getDefaultIgnoreTypeNames();
-		}
-		while (clazz != null) {
-			if (ignoreTypeNames.contains(clazz.getName()))
-				return true;
-			clazz = clazz.getSuperclass();
-		}
-		return false;
-	}
-
-	private int sizeOf(Object o) {
-		if (o == null)
-			return 0;
-		if (ignore(o))
-			return 0;
-		Class clazz = o.getClass();
-		if (shouldIgnoreType(clazz))
-			return 0;
-		return clazz.isArray() ? sizeOfArray(clazz, o) : sizeOfObject(clazz, o);
-	}
-
-	private int sizeOfArray(Class type, Object array) {
-
-		int size = ARRAY_HEADER_SIZE;
-		Class componentType = type.getComponentType();
-		if (componentType.isPrimitive()) {
-
-			if (componentType == char.class) {
-				char[] a = (char[]) array;
-				size += a.length * 2;
-			} else if (componentType == int.class) {
-				int[] a = (int[]) array;
-				size += a.length * 4;
-			} else if (componentType == byte.class) {
-				byte[] a = (byte[]) array;
-				size += a.length;
-			} else if (componentType == short.class) {
-				short[] a = (short[]) array;
-				size += a.length * 2;
-			} else if (componentType == long.class) {
-				long[] a = (long[]) array;
-				size += a.length * 8;
-			} else {
-				//TODO: primitive arrays
-				System.out.println(componentType);
-			}
-			count(type, size);
-			return size;
-		}
-		Object[] a = (Object[]) array;
-		for (int i = 0; i < a.length; i++) {
-			size += POINTER_SIZE + sizeOf(a[i]);
-		}
-		count(type, ARRAY_HEADER_SIZE + POINTER_SIZE * a.length);
-		return size;
-
-	}
-
-	private int sizeOfObject(Class type, Object o) {
-
-		int internalSize = 0; // size of referenced objects
-		int shallowSize = OBJECT_HEADER_SIZE;
-		Class clazz = type;
-		while (clazz != null) {
-			Field[] fields = clazz.getDeclaredFields();
-			for (int i = 0; i < fields.length; i++) {
-				Field f = fields[i];
-				if (!isStaticField(f)) {
-					Class fieldType = f.getType();
-					if (fieldType.isPrimitive()) {
-						shallowSize += sizeOfPrimitiveField(fieldType);
-					} else {
-						shallowSize += POINTER_SIZE;
-						internalSize += sizeOf(getFieldObject(f, o));
-					}
-				}
-			}
-			clazz = clazz.getSuperclass();
-		}
-		count(type, shallowSize);
-		return shallowSize + internalSize;
-
-	}
-
-	private int sizeOfPrimitiveField(Class type) {
-		if (type == long.class || type == double.class)
-			return 8;
-		return 4;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ErrorUtil.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ErrorUtil.java
deleted file mode 100644
index 72b3116..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ErrorUtil.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A helper class that supports error report and logging for 
- * Spy plug-in classes. 
- */
-public class ErrorUtil {
-
-	/**
-	 * Logs the provided exception and user message in Spy plug-in's log.
-	 * 
-	 * @param exception the exception to be logged
-	 * @param userMessage an optional  higher-level explanation for the exception
-	 */
-	public static void logException(Exception exception, String userMessage) {
-		String pluginID = CoreToolsPlugin.PLUGIN_ID;
-		if (userMessage == null)
-			userMessage = exception.getMessage();
-		IStatus status = new Status(IStatus.ERROR, pluginID, -1, userMessage, exception);
-		CoreToolsPlugin.getDefault().getLog().log(status);
-	}
-
-	/**
-	 * Shows the provided message using a MessageDialog.
-	 * 
-	 * @param message
-	 * @param title
-	 * @see org.eclipse.jface.dialogs.MessageDialog#openError(Shell,String,String)
-	 */
-	public static void showErrorMessage(String message, String title) {
-		Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-		if (title == null)
-			title = "Error in Spy plug-in"; //$NON-NLS-1$
-		MessageDialog.openError(shell, title, message);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/GlobalAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/GlobalAction.java
deleted file mode 100644
index f3e66e8..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/GlobalAction.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.IActionBars;
-
-/**
- * An abstract base class for global actions. Global actions
- * are able to register themselves in a view's action bars. 
- */
-public abstract class GlobalAction extends Action {
-	/**
-	 * Constructs an action.
-	 * 
-	 * @param text the action description
-	 */
-	GlobalAction(String text) {
-		super(text);
-		setToolTipText(text);
-	}
-
-	/**
-	 * Registers this action as a global action handler.
-	 * 
-	 * @param actionBars the action bars where this action will be registered.
-	 * @see IActionBars#updateActionBars()
-	 */
-	public abstract void registerAsGlobalAction(IActionBars actionBars);
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/IFlattable.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/IFlattable.java
deleted file mode 100644
index b3c812b..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/IFlattable.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-/**
- * Interface indicating if a view (normally a tree) support a flat display
- */
-public interface IFlattable {
-	public void setFlat(boolean mode);
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ISorter.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ISorter.java
deleted file mode 100644
index 9541980..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ISorter.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-public interface ISorter {
-	public boolean isReversed();
-
-	public void setReversed(boolean value);
-
-	public int getColumnNumber();
-
-	public int states();
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ITreeNodeVisitor.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ITreeNodeVisitor.java
deleted file mode 100644
index 148f2ea..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/ITreeNodeVisitor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-/** 
- * This interface is implemented by objects that visit trees made of
- * <code>TreeContentProviderNode</code> objects.
- *
- * @see org.eclipse.core.tools.TreeContentProviderNode#accept(ITreeNodeVisitor)
- */
-public interface ITreeNodeVisitor {
-	/** 
-	 * Visits the given node.
-	 *
-	 * @param node the node to visit
-	 * @return <code>true</code> if the node's child nodes  should  be visited;
-	 * <code>false</code> if they should be skipped
-	 */
-	public boolean visit(TreeContentProviderNode node);
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/Messages.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/Messages.java
deleted file mode 100644
index 17e819b..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/Messages.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.core.tools.messages";//$NON-NLS-1$
-
-	// Stats View
-	public static String stats_eventHeader;
-	public static String stats_blameHeader;
-	public static String stats_contextHeader;
-	public static String stats_countHeader;
-	public static String stats_timeHeader;
-
-	public static String stats_badStat;
-	public static String stats_badColumn;
-	public static String stats_pluginid;
-
-	// Resource Spy
-	public static String resource_error_unknown_resource_impl;
-
-	public static String resource_file;
-	public static String resource_folder;
-	public static String resource_project;
-	public static String resource_root;
-	public static String resource_full_path;
-	public static String resource_content_id;
-	public static String resource_type;
-	public static String resource_node_id;
-	public static String resource_local_sync_info;
-
-	public static String resource_persistent_properties;
-	public static String resource_error_stored_properties;
-
-	public static String resource_session_properties;
-
-	public static String resource_flags;
-	public static String resource_open;
-	public static String resource_local_exists;
-	public static String resource_phantom;
-	public static String resource_used;
-	public static String resource_derived;
-	public static String resource_team_private;
-	public static String resource_markers_snap_dirty;
-	public static String resource_sync_info_snap_dirty;
-	public static String resource_no_content_description;
-	public static String resource_default_content_description;
-
-	public static String resource_content_description;
-	public static String resource_error_content_description;
-	public static String resource_content_description_from_cache;
-
-	public static String resource_markers;
-	public static String resource_error_marker;
-
-	public static String resource_sync_info;
-
-	public static String depend_noInformation;
-	public static String depend_noParentPlugins;
-	public static String depend_requiredBy;
-	public static String depend_noChildrenPlugins;
-	public static String depend_requires;
-	public static String depend_badPluginId;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/Policy.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/Policy.java
deleted file mode 100644
index 08fe8f3..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/Policy.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.core.runtime.*;
-
-public class Policy {
-
-	public static IProgressMonitor monitorFor(IProgressMonitor monitor) {
-		if (monitor == null)
-			return new NullProgressMonitor();
-		return monitor;
-	}
-
-	public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks) {
-		if (monitor == null)
-			return new NullProgressMonitor();
-		if (monitor instanceof NullProgressMonitor)
-			return monitor;
-		return new SubProgressMonitor(monitor, ticks);
-	}
-
-	public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks, int style) {
-		if (monitor == null)
-			return new NullProgressMonitor();
-		if (monitor instanceof NullProgressMonitor)
-			return monitor;
-		return new SubProgressMonitor(monitor, ticks, style);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/SelectAllAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/SelectAllAction.java
deleted file mode 100644
index 27a0dfa..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/SelectAllAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionFactory;
-
-public class SelectAllAction extends GlobalAction {
-
-	private ITextOperationTarget target;
-
-	public SelectAllAction(ITextOperationTarget target) {
-		super("Select &All"); //$NON-NLS-1$
-		this.target = target;
-	}
-
-	/**
-	 * Registers this action as a global action handler.
-	 * 
-	 * @param actionBars the action bars where this action will be registered.
-	 * @see org.eclipse.core.tools.GlobalAction#registerAsGlobalAction(org.eclipse.ui.IActionBars)
-	 */
-	public void registerAsGlobalAction(IActionBars actionBars) {
-		actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		target.doOperation(ITextOperationTarget.SELECT_ALL);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/SpyView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/SpyView.java
deleted file mode 100644
index 41694cb..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/SpyView.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.ui.part.ViewPart;
-
-/** 
- * A common base class for all Spy Plug-in views
- */
-public abstract class SpyView extends ViewPart {
-	/**
-	 * SpyView constructor comment.
-	 */
-	public SpyView() {
-		super();
-	}
-
-	/**
-	 * Asks this part to take focus within the workbench. Does nothing.
-	 */
-	public void setFocus() {
-		// do nothing
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TableSelectionProviderDecorator.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TableSelectionProviderDecorator.java
deleted file mode 100644
index aab013f..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TableSelectionProviderDecorator.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of 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.tools;
-
-import java.util.Iterator;
-import org.eclipse.core.runtime.PerformanceStats;
-import org.eclipse.jface.viewers.*;
-
-/**
- * This class provides a decorator for ISelectionProviders that use
- * TableViewer as their viewer and PluginStats as the basis for their data
- * model. The only affected method is <code>getSelection()</code>, which will
- * return a string that closely resembles the table view of this object.
- * 
- */
-public class TableSelectionProviderDecorator implements ISelectionProvider {
-
-	/** The decorated selection provider. */
-	private ISelectionProvider selectionProvider;
-
-	/** 
-	 * Constructs a <code>TableSelectionProviderDecorator</code> having
-	 * the given selection provider as its decorated object.
-	 * 
-	 * @param selectionProvider the selection provider to be decorated
-	 */
-	public TableSelectionProviderDecorator(ISelectionProvider selectionProvider) {
-		this.selectionProvider = selectionProvider;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionProvider.addSelectionChangedListener(listener);
-	}
-
-	/**
-	 * Returns the current selection for this provider. If the selection is a
-	 * structured selection made of <code>PluginStats</code> elements, this method
-	 * will return a structured selection of strings that resemble the table view
-	 * of this data.
-	 * 
-	 * @return the current selection, printed in table view format
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		// gets the original selection object 
-		ISelection selection = selectionProvider.getSelection();
-
-		// in these cases the original selection will be returned
-		if (selection == null || selection.isEmpty() || !(selection instanceof IStructuredSelection))
-			return selection;
-
-		// constructs a list with the selected elements 
-		IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-
-		StringBuffer copyText = new StringBuffer();
-		copyText.append(headerPluginStats());
-		copyText.append('\n');
-		for (Iterator selectionIter = structuredSelection.iterator(); selectionIter.hasNext();) {
-			Object obj = selectionIter.next();
-			if (obj instanceof PerformanceStats) {
-				copyText.append(prettyPluginStats((PerformanceStats) obj));
-				copyText.append('\n');
-			}
-		}
-		return new StructuredSelection(copyText);
-
-	}
-
-	private String headerPluginStats() {
-		String retString = ""; //$NON-NLS-1$
-		retString += Messages.stats_eventHeader + "\t"; //$NON-NLS-1$
-		retString += Messages.stats_blameHeader + "\t"; //$NON-NLS-1$
-		retString += Messages.stats_contextHeader + "\t"; //$NON-NLS-1$
-		retString += Messages.stats_countHeader + "\t"; //$NON-NLS-1$
-		retString += Messages.stats_timeHeader + "\t"; //$NON-NLS-1$
-		return retString;
-	}
-
-	private String prettyPluginStats(PerformanceStats stats) {
-		String retString = ""; //$NON-NLS-1$
-		retString += stats.getEvent() + "\t\t"; //$NON-NLS-1$
-		retString += stats.getBlameString() + "\t\t"; //$NON-NLS-1$
-		retString += stats.getContext() + "\t\t"; //$NON-NLS-1$
-		retString += stats.getRunCount() + "\t"; //$NON-NLS-1$
-		retString += stats.getRunningTime() + "\t"; //$NON-NLS-1$
-		return retString;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionProvider.removeSelectionChangedListener(listener);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		selectionProvider.setSelection(selection);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TableWithTotalView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TableWithTotalView.java
deleted file mode 100644
index d53624c..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TableWithTotalView.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import java.util.Iterator;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableTree;
-import org.eclipse.swt.dnd.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * Abstract class representing a view made of two tables.
- * The first one is used to display data and the second to display totals of the
- * data showed in the first table.
- */
-public abstract class TableWithTotalView extends ViewPart implements ISelectionProvider {
-	protected TableTreeViewer viewer; // Table tree viewer used to contain all the data but the total
-	protected TableTree tableTree; // The table tree that will populate the viewer
-	protected Table totalTable; // The table used to display the totals
-	protected boolean flat; // Flag indicating the view mode 
-	protected Clipboard clipboard;
-	protected Action copyAction;
-	protected Action selectAllAction;
-
-	abstract protected String[] getColumnHeaders();
-
-	abstract protected ColumnLayoutData[] getColumnLayout();
-
-	abstract protected void createActions();
-
-	abstract protected void createToolbar();
-
-	abstract protected void createContextMenu();
-
-	private SelectionListener getColumnListener() {
-		return new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent event) {
-				// do nothing
-			}
-
-			public void widgetSelected(SelectionEvent event) {
-				// column selected - need to sort
-				int column = viewer.getTableTree().getTable().indexOf((TableColumn) event.widget);
-
-				ISorter oldSorter = (ISorter) viewer.getSorter();
-				boolean threeState = oldSorter.states() == 3;
-				ISelection selection = viewer.getSelection();
-
-				// first check to see if we are changing sort columns.
-				// If so, set flatness and get a new sorter
-				if (oldSorter == null || !threeState || column != oldSorter.getColumnNumber()) {
-					flat = column != 0; // default for column 0 is NOT flat
-					viewer.setSorter(getSorter(column));
-				} else {
-					// Not changing sorters so we have to cycle through states for the columns
-					// Three state sort for column 0.  !flat/!reverse -> flat/!reverse -> flat/reverse
-					if (column == 0) {
-						if (flat) {
-							if (oldSorter.isReversed())
-								flat = false;
-							oldSorter.setReversed(!oldSorter.isReversed());
-						} else {
-							flat = true;
-							oldSorter.setReversed(false);
-						}
-					} else { // for all other columns flatten and simply reverse
-						flat = true;
-						oldSorter.setReversed(!oldSorter.isReversed());
-					}
-				}
-				if (viewer.getContentProvider() instanceof IFlattable)
-					((IFlattable) viewer.getContentProvider()).setFlat(flat);
-				viewer.refresh();
-				viewer.setSelection(selection);
-			}
-		};
-	}
-
-	protected ControlListener getColumnResizeListener() {
-		return new ControlListener() {
-			public void controlMoved(ControlEvent event) {
-				// do nothing
-			}
-
-			public void controlResized(ControlEvent event) {
-				TableColumn column = (TableColumn) event.widget;
-				int columnNumber = viewer.getTableTree().getTable().indexOf(column);
-				totalTable.getColumn(columnNumber).setWidth(column.getWidth());
-			}
-		};
-	}
-
-	private void createTables(Composite parent) {
-		// create a first table, that will display all the data
-		tableTree = new TableTree(parent, SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
-		tableTree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		Table table = tableTree.getTable();
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout tableLayout = new TableLayout();
-		table.setLayout(tableLayout);
-
-		SelectionListener headerListener = getColumnListener();
-
-		// create a second table for totals
-		totalTable = new Table(parent, 0);
-		GridData gridInfo = new GridData(GridData.FILL_HORIZONTAL);
-		gridInfo.heightHint = totalTable.getItemHeight();
-		totalTable.setLayoutData(gridInfo);
-		totalTable.setHeaderVisible(false);
-		totalTable.setLinesVisible(true);
-		TableLayout totalLayout = new TableLayout();
-		totalTable.setLayout(totalLayout);
-
-		ControlListener columnResizeListener = getColumnResizeListener();
-		//create the columns for the two tables
-		ColumnLayoutData[] columnLayout = getColumnLayout();
-		String[] headers = getColumnHeaders();
-		for (int i = 0; i < getColumnHeaders().length; i++) {
-			// column for the first table
-			tableLayout.addColumnData(columnLayout[i]);
-			TableColumn column = new TableColumn(table, SWT.NONE, i);
-			column.setResizable(true);
-			column.setText(headers[i]);
-			column.addSelectionListener(headerListener);
-			// "connect" the two tables so the width of their column evolve simultaneously
-			// more precisely here, only the resize of the first table will trigger a resize of the second one
-			column.addControlListener(columnResizeListener);
-
-			// column for the second table
-			totalLayout.addColumnData(columnLayout[i]);
-			column = new TableColumn(totalTable, SWT.NONE, i);
-			column.setResizable(true);
-		}
-	}
-
-	protected abstract ITreeContentProvider getContentProvider();
-
-	protected abstract ITableLabelProvider getLabelProvider();
-
-	protected abstract ViewerSorter getSorter(int column);
-
-	protected abstract String getStatusLineMessage(Object element);
-
-	public void createPartControl(Composite parent) {
-		Composite composite = new Composite(parent, 0);
-		// crete a grid layout of one column
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		composite.setLayout(layout);
-
-		createTables(composite);
-
-		clipboard = new Clipboard(parent.getDisplay());
-		//create the viewer
-		viewer = new TableTreeViewer(tableTree);
-		viewer.setContentProvider(getContentProvider());
-		viewer.setLabelProvider(getLabelProvider());
-		viewer.setSorter(getSorter(0));
-		viewer.addSelectionChangedListener(getTableListener());
-
-		createCommonActions();
-		createActions();
-		createToolbar();
-		createContextMenu();
-	}
-
-	abstract protected String[] computeTotalLine(Iterator elements);
-
-	private void createCommonActions() {
-		copyAction = new Action() {
-			public void run() {
-				IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-				String result = ""; //$NON-NLS-1$
-				String[] columnHeaders = getColumnHeaders();
-				for (int i = 0; i < columnHeaders.length; i++)
-					result += columnHeaders[i] + ","; //$NON-NLS-1$
-				result += "\n\n"; //$NON-NLS-1$
-
-				ITableLabelProvider labelProvider = (ITableLabelProvider) viewer.getLabelProvider();
-				for (Iterator iterator = selection.iterator(); iterator.hasNext();) {
-					Object selectedItem = iterator.next();
-					for (int i = 0; i < columnHeaders.length; i++)
-						result += labelProvider.getColumnText(selectedItem, i) + ","; //$NON-NLS-1$
-					result += "\n"; //$NON-NLS-1$
-				}
-				clipboard.setContents(new Object[] {result}, new Transfer[] {TextTransfer.getInstance()});
-			}
-		};
-		IActionBars actionBars = getViewSite().getActionBars();
-		actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
-
-		selectAllAction = new Action() {
-			public void run() {
-				tableTree.selectAll();
-				// force viewer selection change
-				viewer.setSelection(viewer.getSelection());
-			}
-		};
-		actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), selectAllAction);
-	}
-
-	protected ISelectionChangedListener getTableListener() {
-		return new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) e.getSelection();
-				copyAction.setEnabled(!selection.isEmpty());
-				if (selection.size() == 1) {
-					String message = getStatusLineMessage(selection.getFirstElement());
-					getViewSite().getActionBars().getStatusLineManager().setMessage(message);
-				}
-				totalTable.removeAll();
-				updateTotals();
-			}
-		};
-	}
-
-	public void updateTotals() {
-		IStructuredSelection selection = (IStructuredSelection) getSelection();
-		TableItem item = new TableItem(totalTable, 0);
-		item.setText(computeTotalLine(selection.iterator()));
-	}
-
-	public ISelection getSelection() {
-		return viewer.getSelection();
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		// do nothing
-	}
-
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-		// do nothing
-	}
-
-	public void setSelection(ISelection selection) {
-		// do nothing
-	}
-
-	public void setFocus() {
-		if (tableTree != null)
-			tableTree.setFocus();
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TreeContentProviderNode.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TreeContentProviderNode.java
deleted file mode 100644
index 96801e5..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TreeContentProviderNode.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import java.util.*;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Represents a node (possibly containing children) in a tree content 
- * provider model. Every node has a name and optionally a value.
- */
-public class TreeContentProviderNode implements Comparable, IAdaptable {
-
-	/**
-	 * A list containing this node's children. 
-	 */
-	private List children;
-
-	/**
-	 * This node's name (may be null).
-	 */
-	private String name;
-
-	/** 
-	 * This node's value (may be null).
-	 */
-	private Object value;
-
-	/**
-	 * This node's parent node.
-	 */
-	private TreeContentProviderNode parent;
-
-	/**
-	 * Constructs a TreeContentProviderNode with the given name and value.
-	 * 
-	 * @param name this node's name (may be null, if value is not null)
-	 * @param value this node's value (may be null, if name is not null)
-	 */
-	public TreeContentProviderNode(String name, Object value) {
-		this.name = name;
-		this.value = value;
-	}
-
-	/**
-	 * Constructs a TreeContentProviderNode with the given name.
-	 * 
-	 * @param name this node's name (may not be null). 
-	 */
-	public TreeContentProviderNode(String name) {
-		this(name, null);
-	}
-
-	/**
-	 * Sets this node's parent.
-	 * 
-	 * @param parent this node's new parent
-	 */
-	private void setParent(TreeContentProviderNode parent) {
-		this.parent = parent;
-	}
-
-	/**
-	 * Adds a new child. If the child is a TreeContentProviderNode, sets its parent
-	 * to this object.
-	 * 
-	 * @param child a new child to be added.
-	 */
-	public void addChild(Object child) {
-		// lazilly instantiates the children's list
-		if (this.children == null) {
-			this.children = new ArrayList();
-		}
-		this.children.add(child);
-		if (child instanceof TreeContentProviderNode) {
-			TreeContentProviderNode childNode = (TreeContentProviderNode) child;
-			childNode.setParent(this);
-		}
-	}
-
-	/**
-	 * Returns an array containing all children this node has. If this node 
-	 * has no children, returns an empty array.
-	 * 
-	 * @return an array containing this node's children.
-	 */
-	public Object[] getChildren() {
-		return children == null ? new Object[0] : children.toArray();
-	}
-
-	/**
-	 * Returns a boolean indicating if this node has any children.
-	 * 
-	 * @return true, if this node has children, false otherwise
-	 */
-	public boolean hasChildren() {
-		return children != null && !children.isEmpty();
-	}
-
-	/**
-	 * Returns a string representation of the object.
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		if (name == null)
-			return value.toString();
-		if (value == null)
-			return name;
-		return name + " = " + value; //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns this node's parent node.
-	 * 
-	 * @return this node's parent node or null, if this node is a root
-	 */
-	public TreeContentProviderNode getParent() {
-		return parent;
-	}
-
-	/**
-	 * Returns this node's value (may be null).
-	 * 
-	 * @return this node's value
-	 */
-	public Object getValue() {
-		return value;
-	}
-
-	/**
-	 * Returns a boolean indicating if this node is root or not.
-	 * 
-	 * @return true if this node is root, false otherwise
-	 */
-	public boolean isRoot() {
-		return parent == null;
-	}
-
-	/**
-	 * Removes all child nodes (if any) from this node. This operation affects
-	 * only this node. No changes are made to the child nodes. 
-	 */
-	public void removeAllChildren() {
-		if (children == null)
-			return;
-
-		children.clear();
-	}
-
-	/**
-	 * Sorts this node's children list in ascending order. The children are 
-	 * ordered by name. Any changes in the children list will potentially 
-	 * invalidate the ordering. All children must be instances of 
-	 * <code>TreeContentProviderNode</code>. 
-	 */
-	public void sort() {
-		if (children == null)
-			return;
-		Collections.sort(children);
-	}
-
-	/**
-	 * Compares this node with another node. 
-	 * 
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public int compareTo(Object other) {
-		TreeContentProviderNode otherNode = (TreeContentProviderNode) other;
-		return this.name.compareTo(otherNode.name);
-	}
-
-	/**
-	 * Accepts the given visitor. The visitor's <code>visit</code> method is called
-	 * with this node. If the visitor returns <code>true</code>, this method visits
-	 * this node's child nodes.
-	 *
-	 * @param visitor the visitor
-	 * @see ITreeNodeVisitor#visit
-	 */
-	public void accept(ITreeNodeVisitor visitor) {
-		if (!visitor.visit(this))
-			return;
-		if (children == null)
-			return;
-		for (Iterator childrenIter = children.iterator(); childrenIter.hasNext();) {
-			Object child = childrenIter.next();
-			// child nodes don't need to be TreeContentProviderNodes
-			if (child instanceof TreeContentProviderNode)
-				((TreeContentProviderNode) child).accept(visitor);
-		}
-	}
-
-	/**
-	 * Returns this node's tree root node. If this node is a root node, returns itself.
-	 * 
-	 * @return this node's tree root node
-	 */
-	public TreeContentProviderNode getRoot() {
-		return this.getParent() == null ? this : this.getParent().getRoot();
-	}
-
-	/**
-	 * Returns this node's immediate child that has the given value.
-	 * 
-	 * @return a tree node, or <code>null</code>
-	 */
-	public TreeContentProviderNode findNode(Object obj) {
-		if (obj.equals(this.value))
-			return this;
-		if (children == null || children.isEmpty())
-			return null;
-		for (Iterator i = children.iterator(); i.hasNext();) {
-			TreeContentProviderNode found = ((TreeContentProviderNode) i.next()).findNode(obj);
-			if (found != null)
-				return found;
-		}
-		return null;
-	}
-
-	/**
-	 * Returns this node's name.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	public Object getAdapter(Class adapter) {
-		return value instanceof IAdaptable ? ((IAdaptable) value).getAdapter(adapter) : null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TreeSelectionProviderDecorator.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TreeSelectionProviderDecorator.java
deleted file mode 100644
index 113e231..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TreeSelectionProviderDecorator.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import java.util.*;
-import org.eclipse.jface.viewers.*;
-
-/**
- * This class provides a decorator for ISelectionProviders that use
- * TreeContentProviderNode as the basis for their data model.
- * The only affected method is <code>getSelection()</code>, which will return a
- * selection object that provides selected elements in the same order they
- * appear in the tree.
- * 
- * <p>This class is an workaround to the SWT's <code>Tree.getSelection()</code>
- * method, which returns an array of selected elements without preserving the
- * order they appear in the tree widget.</p>
- */
-public class TreeSelectionProviderDecorator implements ISelectionProvider {
-
-	/** The decorated selection provider. */
-	private ISelectionProvider selectionProvider;
-
-	/** 
-	 * Constructs a <code>TreeSelectionProviderDecorator</code> having the given 
-	 * selection provider as its decorated object.
-	 * 
-	 * @param selectionProvider the selection provider to be decorated
-	 */
-	public TreeSelectionProviderDecorator(ISelectionProvider selectionProvider) {
-		this.selectionProvider = selectionProvider;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionProvider.addSelectionChangedListener(listener);
-	}
-
-	/**
-	 * Returns the current selection for this provider. If the selection is a
-	 * structured selection made of <code>TreeContentProviderNode</code>
-	 * elements, this method will return a structured selection where the order of
-	 * elements is the same order the elements appear in the tree (only for tree
-	 * elements that are instances of <code>TreeContentProviderNode</code>).
-	 * 
-	 * @return the current selection, ordered in the same sequence they appear in
-	 * the tree
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		// gets the original selection object 
-		ISelection selection = selectionProvider.getSelection();
-
-		// in these cases the original selection will be returned
-		if (selection == null || selection.isEmpty() || !(selection instanceof IStructuredSelection))
-			return selection;
-
-		// constructs a list with the selected elements 
-		IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-		final List selectedElements = new ArrayList(structuredSelection.toList());
-
-		// tries to find a TreeContentProviderNode between the selected elements
-		TreeContentProviderNode anyNode = findNodeElement(selectedElements);
-
-		// if there is no TreeContentProviderNodes, there is nothing to do
-		if (anyNode == null)
-			return selection;
-
-		// otherwise, we will move the elements to a new list in the same order
-		// we find them in the tree.
-		final List orderedElements = new LinkedList();
-
-		// uses a visitor to traverse the whole tree
-		// when a visited node is the selected list, it is moved to the ordered list  
-		anyNode.getRoot().accept(new ITreeNodeVisitor() {
-			public boolean visit(TreeContentProviderNode node) {
-				int elementIndex = selectedElements.indexOf(node);
-
-				if (selectedElements.contains(node))
-					orderedElements.add(selectedElements.remove(elementIndex));
-
-				return true;
-			}
-		});
-
-		// any remaining elements in the list (probably they are not tree nodes)
-		// are copied to the end of the ordered list    
-		orderedElements.addAll(selectedElements);
-		return new StructuredSelection(orderedElements);
-	}
-
-	/** 
-	 * Returns the first element in the list that is instance of 
-	 * <code>TreeContentProviderNode</code>.
-	 * 
-	 * @return the first element that is a tree node or null, if none is found.
-	 */
-	private TreeContentProviderNode findNodeElement(List elements) {
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof TreeContentProviderNode)
-				return (TreeContentProviderNode) element;
-		}
-
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionProvider.removeSelectionChangedListener(listener);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		selectionProvider.setSelection(selection);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TreeTextOperationTarget.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TreeTextOperationTarget.java
deleted file mode 100644
index ebb876b..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/TreeTextOperationTarget.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools;
-
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.swt.widgets.Tree;
-
-public class TreeTextOperationTarget implements ITextOperationTarget {
-
-	private Tree tree;
-
-	public TreeTextOperationTarget(Tree tree) {
-		this.tree = tree;
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.ITextOperationTarget#canDoOperation(int)
-	 */
-	public boolean canDoOperation(int operation) {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.ITextOperationTarget#doOperation(int)
-	 */
-	public void doOperation(int operation) {
-		//TODO: add support to other operations
-		switch (operation) {
-			case ITextOperationTarget.SELECT_ALL :
-				tree.selectAll();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/messages.properties b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/messages.properties
deleted file mode 100644
index 3c822a7..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/messages.properties
+++ /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
-###############################################################################
-### Spy message catalog
-
-
-### Stats View
-stats_eventHeader = Event
-stats_blameHeader = Blame
-stats_contextHeader = Context
-stats_countHeader = Count
-stats_timeHeader = Time
-
-stats_badStat = Not an EventStats
-stats_badColumn = Invalid Column
-stats_pluginid = Plug-in Identifier: {0}
-
-### Resource Spy
-resource_error_unknown_resource_impl = Error: unknown IResource implementation: {0}
-
-resource_file = File
-resource_folder = Folder
-resource_project = Project
-resource_root = Root
-resource_full_path = Full Path
-resource_content_id = Content ID
-resource_type = Type
-resource_node_id = Node ID
-resource_local_sync_info = Local Sync Info
-
-resource_persistent_properties = Persistent Properties
-resource_error_stored_properties = Error getting resource's stored properties: {0}
-
-resource_session_properties = Session Properties
-
-resource_flags = Flags
-resource_open = Open
-resource_local_exists = Local exists
-resource_phantom = Phantom
-resource_used = Used
-resource_derived = Derived
-resource_team_private = Team private
-resource_markers_snap_dirty = Marker snapshot is dirty
-resource_sync_info_snap_dirty = Sync info snapshot is dirty
-resource_no_content_description = No content description
-resource_default_content_description = Default content description
-
-resource_content_description = Content description
-resource_error_content_description = Error getting file's content description: {0}
-resource_content_description_from_cache = cached: {0}
-
-resource_markers = Markers
-resource_error_marker = Error getting marker information: {0}
-
-resource_sync_info = Sync information
-
-### Plug-in Dependency Spy
-depend_noInformation = Unable to find information for {0}.
-depend_noParentPlugins = Not required by any plug-ins.
-depend_requiredBy = Required by:
-depend_noChildrenPlugins = Requires no plug-ins.
-depend_requires = Requires:
-depend_badPluginId = Invalid plug-in id
-
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/AbstractDumper.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/AbstractDumper.java
deleted file mode 100644
index ffd879c..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/AbstractDumper.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.*;
-
-/**
- * An abstract implementation for dumpers that generate bare text dumps by 
- * sequentially reading input streams.
- */
-public abstract class AbstractDumper implements IDumper {
-
-	/**
-	 * Reads a given file and produces a dump object. Provides a template implementation for 
-	 * <code>IDumper.dump(java.io.File)</code>. 
-	 * <p>Subclasses must implement 
-	 * <code>getStringDumpingStrategy(InputStream)</code> in order to select the 
-	 * real dumping behaviour. This method will call 
-	 * <code>IStringDumpingStrategy#dumpStringContents(DataInputStream)</code> on 
-	 * the returned strategy. If, after calling that method,  there are still bytes 
-	 * to be read in the input stream, 
-	 * <code>getStringDumpingStrategy(InputStream)</code> will be called again in 
-	 * order to select another strategy to read the remaining contents, and so on.
-	 * </p> 
-	 *
-	 * <p>Subclasses can also select which type of low-level InputStream will be 
-	 * used to read the file to be dumped by overriding
-	 * <code>openInputStream(File)</code>.</p> 
-	 * 
-	 * @param file the file to be dumped
-	 * @return a dump object representing the contents of the dumped file
-	 * @see org.eclipse.core.tools.metadata.IDumper#dump(java.io.File)
-	 * @see IStringDumpingStrategy#dumpStringContents(DataInputStream)
-	 * @see #openInputStream(File)
-	 */
-	public IDump dump(File file) {
-		DataInputStream dataInput = null;
-		MeteredInputStream meteredInput = null;
-		Dump dump = new Dump();
-		dump.setFile(file);
-		StringBuffer contents = new StringBuffer(40);
-		try {
-			//uses a metered input stream in order to count the number of bytes read
-			meteredInput = new MeteredInputStream(openInputStream(file));
-			dumpContents(meteredInput, contents); //$NON-NLS-1$
-		} catch (PartialDumpException pde) {
-			// ensure we remember any partial contents
-			if (pde.getPartialContents() != null)
-				contents.append(pde.getPartialContents());
-			dump.setFailureReason(pde);
-		} catch (Exception e) {
-			dump.setFailureReason(e);
-		} finally {
-			if (dataInput != null)
-				try {
-					dataInput.close();
-				} catch (IOException ioe) {
-					if (!dump.isFailed())
-						dump.setFailureReason(ioe);
-				}
-		}
-		dump.setContents(contents.toString());
-		if (meteredInput != null)
-			dump.setOffset(meteredInput.getOffset());
-		return dump;
-	}
-
-	/**
-	 * Does the actual  work. Subclasses must implement this method to define
-	 * dumping behavior. The results are added to the <code>contents</code>
-	 * string buffer.
-	 *  
-	 * @param input
-	 * @param contents
-	 * @throws IOException
-	 * @throws Exception
-	 * @throws DumpException
-	 */
-	protected abstract void dumpContents(PushbackInputStream input, StringBuffer contents) throws IOException, Exception, DumpException;
-
-	/**
-	 * Opens an input stream connected to the file object provided. Provides an 
-	 * opportunity for subclasses to select a different input stream class. By 
-	 * default, returns a <code>FileInputStream</code> object.
-	 * 
-	 * @param file the file to be opened
-	 * @return an input stream connected to the file provided as 
-	 * argument
-	 * @throws IOException if an exception happens while opening the inpuut stream
-	 */
-	protected InputStream openInputStream(File file) throws IOException {
-		return new FileInputStream(file);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/Dump.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/Dump.java
deleted file mode 100644
index cbaf37d..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/Dump.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.File;
-
-/**
- * Default implementation for <code>IDump</code>. 
- * 
- * @see IDump
- */
-public class Dump implements IDump {
-	/**
-	 * The file processed in order to produce this dump
-	 */
-	private File file;
-	/**
-	 * The failure flag for this dump object.
-	 */
-	private boolean failed;
-	/**
-	 * The exception that caused the failure (may be null) 
-	 */
-	private Exception failureReason;
-	/**
-	 * An object that represents the dump contents.
-	 */
-	private Object contents;
-	/**
-	 * The offset where the dumper stopped when reading the dumped file.
-	 */
-	private long offset;
-
-	/**
-	 * Constructs a Dump object to be initialized using the setter methods.
-	 */
-	public Dump() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.metadata.IDump#getFile()
-	 */
-	public File getFile() {
-		return file;
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.metadata.IDump#isFailed()
-	 */
-	public boolean isFailed() {
-		return failed || this.failureReason != null;
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.metadata.IDump#getFailureReason()
-	 */
-	public Exception getFailureReason() {
-		return failureReason;
-	}
-
-	/**
-	 * Sets this dump object failed flag.
-	 * 
-	 * @param failed The value of the failed flag for this dump object
-	 */
-	public void setFailed(boolean failed) {
-		this.failed = failed;
-	}
-
-	/**
-	 * Sets the failure reason.
-	 * 
-	 * @param failureReason The failure reason for this dump object
-	 */
-	public void setFailureReason(Exception failureReason) {
-		this.failureReason = failureReason;
-	}
-
-	/**
-	 * Sets the file.
-	 * 
-	 * @param file The file for this dump object
-	 */
-	public void setFile(File file) {
-		this.file = file;
-	}
-
-	/**
-	 * @see IDump#getContents()
-	 */
-	public Object getContents() {
-		return contents;
-	}
-
-	/**
-	 * Sets the contents.
-	 * 
-	 * @param contents The contents for this dump object
-	 */
-	public void setContents(Object contents) {
-		this.contents = contents;
-	}
-
-	/**
-	 * Sets the offset.
-	 * 
-	 * @param offset The offset for this dump object
-	 */
-	public void setOffset(long offset) {
-		this.offset = offset;
-	}
-
-	/**
-	 * @see IDump#getOffset()
-	 */
-	public long getOffset() {
-		return offset;
-	}
-
-	/**
-	 * Returns a human-readable representation for this dump object (for 
-	 * debugging purposes).
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "File: " + getFile() + "\n" + "Contents: \n******\n" + getContents() + "\n******\n" + "Failed: " + failed + "\n" + "Reason: " + failureReason + "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpContentsView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpContentsView.java
deleted file mode 100644
index 0b423ce..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpContentsView.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.File;
-import org.eclipse.core.tools.*;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-/**
- * Dump Contents Spy view. This view shows the contents resulting of a dumping
- * process.
- */
-public class DumpContentsView extends SpyView {
-
-	/** Stores the initially assigned view title. */
-	private String initialTitle;
-
-	/** The JFace widget that shows the current selected file dump contents. */
-	protected TextViewer viewer;
-
-	/** The file names registered in the DumperFactory. */
-	protected String[] registeredFileNames;
-
-	/** The dumper factory used to instantiate dumpers. */
-	private DumperFactory dumperFactory;
-
-	/** The current selected file. */
-	private File currentFile;
-
-	/** The id by which this view is known in the plug-in registry */
-	public static final String VIEW_ID = DumpContentsView.class.getName();
-
-	/**
-	 * Constructs a DumpContentsView. 
-	 */
-	public DumpContentsView() {
-		dumperFactory = DumperFactory.getInstance();
-		this.registeredFileNames = dumperFactory.getRegisteredFileNames();
-	}
-
-	/**
-	 * Creates this view widget and actions.
-	 * 
-	 * @param parent the parent control
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(final Composite parent) {
-		// creates a read-only text viewer
-		viewer = new TextViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-		viewer.setDocument(new Document());
-		viewer.setEditable(false);
-
-		// creates the actions
-		final IAction loadFileAction = new LoadFileAction();
-		final IAction copySelectionAction = new CopyTextSelectionAction(viewer);
-		final IAction clearContentsAction = new ClearTextAction(viewer.getDocument());
-
-		// adds actions to the menu bar
-		IMenuManager barMenuManager = getViewSite().getActionBars().getMenuManager();
-		barMenuManager.add(loadFileAction);
-		barMenuManager.add(copySelectionAction);
-		barMenuManager.add(clearContentsAction);
-
-		// creates a context menu with actions and adds it to the viewer control
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.add(loadFileAction);
-		menuMgr.add(copySelectionAction);
-		menuMgr.add(clearContentsAction);
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-	}
-
-	/**
-	 * Sets the file to be dumped. The view state will be updated to reflect
-	 * changes.
-	 * 
-	 * @param file the file to be dumped
-	 */
-	public void setFile(File file) {
-		IDumper dumper = null;
-
-		// tries to get the associated file dumper
-		try {
-			dumper = dumperFactory.getDumper(file.getName());
-		} catch (DumpException de) {
-			ErrorUtil.logException(de, null);
-			ErrorUtil.showErrorMessage(de.getMessage(), "Error creating file dumper"); //$NON-NLS-1$
-			return;
-		}
-
-		// dumps file        
-		IDump dump = dumper.dump(file);
-		if (dump.isFailed()) {
-			CoreToolsPlugin.getDefault().log("Error during file dump", dump.getFailureReason()); //$NON-NLS-1$
-			String message = "File dumping did not complete successfully. Reason: " + dump.getFailureReason(); //$NON-NLS-1$
-			ErrorUtil.showErrorMessage(message, "Error during file dump"); //$NON-NLS-1$		
-		}
-
-		// loads the new dump object
-		load(dump);
-	}
-
-	/**
-	 * Rebuilds the view with the dump object provided.
-	 * 
-	 * @param dump a dump object to be shown on this view 
-	 */
-	private void load(IDump dump) {
-
-		this.currentFile = dump.getFile();
-
-		// now it is safe to get the part title 
-		// (during createPartControl it gets Workbench window title)
-		if (initialTitle == null)
-			this.initialTitle = this.getTitle();
-
-		// updates title and title tool tip
-		this.setContentDescription(initialTitle + " : " + this.currentFile.getName()); //$NON-NLS-1$
-		this.setTitleToolTip("Dump contents for " + this.currentFile.getAbsolutePath()); //$NON-NLS-1$
-
-		// updates viewer
-		viewer.getDocument().set(dump.getContents().toString());
-
-		// tries to show summary information in Dump Summary view
-		IWorkbenchPage page = this.getSite().getPage();
-		String summaryId = DumpSummaryView.VIEW_ID;
-
-		// maybe the summary view is already open
-		DumpSummaryView summaryView = (DumpSummaryView) page.findView(summaryId);
-
-		// if it is not the case and the dump failed, tries to open it
-		if (summaryView == null && dump.isFailed())
-			try {
-				summaryView = (DumpSummaryView) page.showView(summaryId);
-			} catch (PartInitException pie) {
-				ErrorUtil.logException(pie, "Error opening view"); //$NON-NLS-1$
-			}
-
-		// if the Dump Summary view is available, updates it 
-		if (summaryView != null)
-			summaryView.load(dump);
-	}
-
-	/** 
-	 * File load action implementation.
-	 */
-	private class LoadFileAction extends Action {
-		/** Sets action text and tool tip. */
-		LoadFileAction() {
-			this.setText("Load File..."); //$NON-NLS-1$
-			this.setToolTipText("Load file..."); //$NON-NLS-1$
-		}
-
-		/** 
-		 * Executes this action, opening a file dialog so the user can select the 
-		 * file to be dumped. If a file is successfully selected, opens it by
-		 * calling <code>#setFile(File)</code>.
-		 * 
-		 * @see DumpContentsView#setFile
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			// opens a file dialog
-			FileDialog fileDialog = new FileDialog(viewer.getControl().getShell(), SWT.OPEN);
-			fileDialog.setText("Please choose a metadata file to view"); //$NON-NLS-1$
-			fileDialog.setFilterExtensions(DumpContentsView.this.registeredFileNames);
-
-			// if a file hasn't been selected, ignore
-			String filePath = fileDialog.open();
-			if (filePath == null)
-				return;
-
-			// opens the selected file
-			DumpContentsView.this.setFile(new File(filePath));
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpException.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpException.java
deleted file mode 100644
index f253158..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpException.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
-/**
- A high-level exception class to be used by <code>IDumper</code>s. It is 
- intended to be used as a wrapper for low-level exceptions. A method for 
- accessing the low-level exception that caused this 
- <code>DumpException</code> is provided.  
- */
-public class DumpException extends Exception {
-
-	private static final long serialVersionUID = 1L;
-	/**
-	 * The low-level exception that caused this <coed>DumpException</code>. May be 
-	 * null.
-	 */
-	private Throwable cause;
-
-	/**
-	 * Constructs a <code>DumpException</code> with the provided message.
-	 * 
-	 * @param msg the message
-	 */
-	public DumpException(String msg) {
-		super(msg);
-	}
-
-	/**
-	 * Constructs a <code>DumpException</code> with the provided message and cause.
-	 * 
-	 * @param msg the message 
-	 * @param cause the exception that caused this <code>DumpException</code>
-	 */
-	public DumpException(String msg, Throwable cause) {
-		super(msg);
-		this.cause = cause;
-	}
-
-	/**
-	 * Returns the cause for this <code>DumpException</code>. May be null.
-	 * 
-	 * @return the cause for this <code>DumpException</code>.
-	 */
-	public Throwable getCause() {
-		return cause;
-	}
-
-	/**
-	 * Returns this exception message (including the cause message, if there is a 
-	 * cause exception).
-	 * 
-	 * @return the error message string
-	 * @see java.lang.Throwable#getMessage()
-	 */
-	public String getMessage() {
-		return super.getMessage() + ((cause != null) ? (" caused by " + cause.toString()) : ""); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Prints this <code>DumpException</code> message and its backtrace to the 
-	 * specified print stream. 
-	 * 
-	 * @param output the <code>java.io.PrintStream</code> object where to print
-	 * @see java.lang.Throwable#printStackTrace(java.io.PrintStream)
-	 */
-	public void printStackTrace(PrintStream output) {
-		super.printStackTrace(output);
-		if (cause == null)
-			return;
-		output.println("*** Caused by:"); //$NON-NLS-1$
-		cause.printStackTrace(output);
-	}
-
-	/**
-	 * Prints this <code>DumpException</code> message and its backtrace to the 
-	 * specified print writer. 
-	 * 
-	 * @param output the <code>java.io.PrintWriter</code> object where to print
-	 * @see java.lang.Throwable#printStackTrace(java.io.PrintWriter)
-	 */
-	public void printStackTrace(PrintWriter output) {
-		super.printStackTrace(output);
-		if (cause == null)
-			return;
-		output.println("*** Caused by:"); //$NON-NLS-1$
-		cause.printStackTrace(output);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpSummaryView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpSummaryView.java
deleted file mode 100644
index 6fc7f01..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpSummaryView.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.File;
-import org.eclipse.core.tools.*;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * Dump Summary Spy view. This view shows the outcome of a dumping.
- */
-public class DumpSummaryView extends SpyView {
-
-	/** Stores the initially assigned view title. */
-	private String initialTitle;
-
-	/** The JFace widget that shows the current selected file dump summary */
-	private TextViewer viewer;
-
-	/** The id by which this view is known in the plug-in registry */
-	public static final String VIEW_ID = DumpSummaryView.class.getName();
-
-	/**
-	 * Creates this view widget and actions.
-	 * 
-	 * @param parent the parent control
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl
-	 * (org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(final Composite parent) {
-
-		// creates a read-only text viewer
-		viewer = new TextViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-		viewer.setDocument(new Document());
-		viewer.setEditable(false);
-
-		final IAction copySelectionAction = new CopyTextSelectionAction(viewer);
-		final IAction clearContentsAction = new ClearTextAction(viewer.getDocument());
-
-		// adds actions to the menu bar
-		IMenuManager barMenuManager = getViewSite().getActionBars().getMenuManager();
-		barMenuManager.add(copySelectionAction);
-		barMenuManager.add(clearContentsAction);
-
-		// creates a context menu with actions and adds it to the viewer control
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.add(copySelectionAction);
-		menuMgr.add(clearContentsAction);
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-	}
-
-	/**
-	 * Rebuilds the view with the dump object provided. Only summary information
-	 * is made available.
-	 * 
-	 * @param dump a dump object describing the result of a dumping process. 
-	 */
-	void load(IDump dump) {
-
-		// now is safe to get the part title
-		if (initialTitle == null)
-			this.initialTitle = this.getTitle();
-
-		// sets title and tool tip
-		File file = dump.getFile();
-		this.setContentDescription(initialTitle + " : " + file.getName()); //$NON-NLS-1$
-		this.setTitleToolTip("Dump summary for file " + file.getAbsolutePath()); //$NON-NLS-1$
-
-		// generates text to be shown on this view
-		StringBuffer output = new StringBuffer();
-		if (dump.isFailed())
-			output.append(dump.getFailureReason().toString());
-		else
-			output.append("No errors. "); //$NON-NLS-1$
-		output.append(dump.getOffset());
-		output.append('/');
-		output.append(dump.getFile().length());
-		output.append(" byte(s) read"); //$NON-NLS-1$
-		
-
-		// updates the view contents 
-		viewer.getDocument().set(output.toString());
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpTool.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpTool.java
deleted file mode 100644
index cd2c1b8..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumpTool.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.File;
-import org.eclipse.core.runtime.IPlatformRunnable;
-
-/**
- * A command-line interface for running dumpers on metadata files.
- * This application requires the name of the file to be dumped as its unique
- * argument.  
- */
-public class DumpTool implements IPlatformRunnable {
-
-	/**
-	 * Dumps a given file using the associated dumper, sending its contents to the 
-	 * standard output. 
-	 * 
-	 * @param args the command-line arguments
-	 * @see DumperFactory#getDumper(String)
-	 */	
-	public Object run(Object args) throws Exception {		
-		String fileName = System.getProperty("dump.file"); //$NON-NLS-1$
-		if (fileName == null) {
-			System.err.println("Use \"dump.file\" system property to point to the metadata file to be dumped"); //$NON-NLS-1$			
-			return new Integer(0);
-		}
-
-		File toDump = new File(fileName);
-		if (!toDump.isFile()) {
-			System.err.println("File \"" + toDump.getAbsolutePath() + "\" does not exist or is not a file"); //$NON-NLS-1$ //$NON-NLS-2$			
-			return new Integer(1);
-		}
-
-		IDumper dumper = null;
-		try {
-			dumper = DumperFactory.getInstance().getDumper(fileName);
-		} catch (DumpException de) {
-			System.err.println("Error: \n" + de); //$NON-NLS-1$
-			return new Integer(1);
-		}
-		IDump dump = dumper.dump(new File(fileName));
-		System.out.print("Dump for file: "); //$NON-NLS-1$
-		System.out.println(dump.getFile().getAbsolutePath());
-		System.out.print("Contents: "); //$NON-NLS-1$
-		System.out.println(dump.getContents());
-		if (dump.isFailed()) {
-			System.out.print("*** Dump failed. Reason: "); //$NON-NLS-1$
-			System.out.print(dump.getFailureReason());
-		} else {
-			System.out.print(">>> File is ok"); //$NON-NLS-1$
-		}
-		System.out.print(". Bytes read: "); //$NON-NLS-1$
-		System.out.print(dump.getOffset());
-		System.out.print(" / Total: "); //$NON-NLS-1$
-		System.out.println(dump.getFile().length());
-		return new Integer(0);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumperFactory.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumperFactory.java
deleted file mode 100644
index 9a4f457..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/DumperFactory.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.File;
-import java.util.Properties;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.tools.CoreToolsPlugin;
-
-/**
- * A dumper factory creates a dumper object given a file name.
- */
-public class DumperFactory {
-
-	private static final String ELEM_DUMPER = "dumper"; //$NON-NLS-1$
-	private static final String ATTR_FILE_NAME = "file-name"; //$NON-NLS-1$
-	private static final String PT_METADATA_DUMPERS = "metadataDumpers"; //$NON-NLS-1$
-	/**
-	 * The <code>DumperFactory</code> singleton reference.
-	 */
-	private static DumperFactory ref;
-
-	/**
-	 * This dumper factory mappings configuration.
-	 */
-	private Properties configuration = new Properties();
-
-	/**
-	 * Provides access to a DumperFactory instance.
-	 * 
-	 * @return a <code>DumperFactory</code> instance
-	 */
-	public synchronized static DumperFactory getInstance() {
-		// currently we allow only one instance for this class
-		if (ref == null)
-			ref = new DumperFactory();
-		return ref;
-	}
-
-	/**
-	 * Constructs a dumper factory, reading dumper definitions from the 
-	 * extension registry. Forbids instantiation from outside this class. 
-	 */
-	private DumperFactory() {
-		loadDumpers();
-	}
-
-	private void loadDumpers() {
-		IExtensionPoint dumpersPoint = Platform.getExtensionRegistry().getExtensionPoint(CoreToolsPlugin.PLUGIN_ID, PT_METADATA_DUMPERS);
-		IConfigurationElement[] dumperDefinitions = dumpersPoint.getConfigurationElements();
-		for (int i = 0; i < dumperDefinitions.length; i++)
-			if (dumperDefinitions[i].getName().equals(ELEM_DUMPER))
-				configuration.put(dumperDefinitions[i].getAttributeAsIs(ATTR_FILE_NAME), dumperDefinitions[i]);
-	}
-
-	/**
-	 * Returns an array containing all known file names.
-	 * 
-	 * @return an array containing file names registered in this factory. 
-	 */
-	public String[] getRegisteredFileNames() {
-		String[] fileNames = new String[configuration.size()];
-		return (String[]) configuration.keySet().toArray(fileNames);
-	}
-
-	/**
-	 * Returns an instance of the dumper class registered for the provided file name. 
-	 * If there is no dumper class registered for the provided file name, raises an 
-	 * exception.
-	 * 
-	 * @param fileName the file to be dumped's name
-	 * @return a <code>IDumper</code> that knows how to read the file
-	 * @throws DumpException if there is no dumper class registered for the 
-	 * provided file name
-	 */
-	public IDumper getDumper(String fileName) throws DumpException {
-		fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
-
-		Object dumper = configuration.get(fileName);
-
-		if (dumper == null)
-			throw new DumpException("There is no dumper class for <" + fileName + "> files"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		// legacy-style definition (from the properties file)
-		if (dumper instanceof String)
-			try {
-				return (IDumper) Class.forName((String) dumper).newInstance();
-			} catch (Exception e) {
-				throw new DumpException("Error instantiating dumper for <" + fileName + "> file", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		// dumper defined through extension mechanism	
-		try {
-			return (IDumper) ((IConfigurationElement) dumper).createExecutableExtension("class"); //$NON-NLS-1$
-		} catch (CoreException ce) {
-			throw new DumpException("Error instantiating dumper for <" + fileName + "> file", ce); //$NON-NLS-1$ //$NON-NLS-2$		
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/IDump.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/IDump.java
deleted file mode 100644
index cd17695..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/IDump.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.File;
-
-/**
- * Represents an object produced by dumping a given file. 
- */
-public interface IDump {
-
-	/**
-	 * Returns the file processed in order to produce this dump.
-	 * 
-	 * @return the file processed
-	 */
-	File getFile();
-
-	/**
-	 * Returns the dump contents. Dump contents objects must have a 
-	 * <code>toString()</code>
-	 * implementation that returns meaningful, human-readable, representation for 
-	 * the contents.
-	 * 
-	 * @return an object representing the contents of the dumped file.
-	 */
-	Object getContents();
-
-	/**
-	 * Returns true if the file reading process ended due to a failure. If 
-	 * <code>getFailureReason()</code> does not return <code>null</code>, this 
-	 * method must return <code>true</code>.
-	 * 
-	 * @return true if the dumping process terminated due to a failure
-	 */
-	boolean isFailed();
-
-	/**
-	 * Returns the exception that caused the failure, or null if a failure did not 
-	 * happen.
-	 * 
-	 * @return the exception that caused the failure, or null if a 
-	 * failure did not happen.
-	 */
-	Exception getFailureReason();
-
-	/**
-	 * Returns the offset where dumper stopped reading the dumped file. Optionally 
-	 * implemented.
-	 * 
-	 * @return the number of bytes read
-	 */
-	long getOffset();
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/IDumper.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/IDumper.java
deleted file mode 100644
index eabd369..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/IDumper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.File;
-
-/**
- * A dumper is an object that knows how to process a given kind of file,
- * translating it to a human-readable form.
- */
-public interface IDumper {
-
-	/** 
-	 * Reads a given file and produces a dump object. Any exception that 
-	 * may occur during file processing must be caught and stored as 
-	 * failure reason in the IDump object returned.
-	 * 
-	 * @param file the file to be dumped
-	 * @return a dump object representing the contents of the file dumped
-	 */
-	IDump dump(File file);
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/IStringDumpingStrategy.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/IStringDumpingStrategy.java
deleted file mode 100644
index 8faf31f..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/IStringDumpingStrategy.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-
-/**
- * A dumping strategy defines how a input stream will be dumped as a string.
- * A given dumper may use different strategies for reading different versions of 
- * a file it understands, or may even use different strategies for reading 
- * different segments of a same file.
- * 
- * @see org.eclipse.core.tools.metadata.AbstractDumper
- */
-public interface IStringDumpingStrategy {
-	/**
-	 * Dumps contents read from the provided stream.
-	 * Concrete implementations should not catch any exceptions. 
-	 * Concrete implementations should not close the input stream.
-	 * This method may read the entire input stream contents, or just part of it.
-	 * 
-	 * @param input the input stream where to dump contents from 
-	 * @return the contents read in string format, or null if no further reading should occur
-	 * @throws IOException an exception occurred while dumping the input stream 
-	 * @throws DumpException an exception occurred while dumping the input stream 
-	 */
-	public String dumpStringContents(DataInputStream input) throws IOException, DumpException;
-
-	/**
-	 * Returns a high-level description for the file format understood by this 
-	 * strategy.
-	 * 
-	 * @return a string describing the file format this strategy understands.
-	 */
-	public String getFormatDescription();
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MetadataPerspective.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MetadataPerspective.java
deleted file mode 100644
index 8e69af7..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MetadataPerspective.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import org.eclipse.ui.*;
-
-/**
- * A perspective for working with metadata files.
- */
-public class MetadataPerspective implements IPerspectiveFactory {
-	/**
-	 * Creates a layout containing the following views: Metadata Tree, Dump Contents
-	 * and Dump Summary, with no editor area.
-	 * 
-	 * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(
-	 * org.eclipse.ui.IPageLayout)
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		String editorAreaId = layout.getEditorArea();
-
-		layout.setEditorAreaVisible(false);
-
-		IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, (float) 0.30, editorAreaId); //$NON-NLS-1$
-		left.addView(MetadataTreeView.VIEW_ID);
-
-		IFolderLayout right = layout.createFolder("right", IPageLayout.RIGHT, (float) 0.5, editorAreaId); //$NON-NLS-1$
-		right.addView(DumpContentsView.VIEW_ID);
-
-		IFolderLayout bottom = layout.createFolder("bottom", IPageLayout.BOTTOM, (float) 0.70, "right"); //$NON-NLS-1$ //$NON-NLS-2$
-		bottom.addView(DumpSummaryView.VIEW_ID);
-
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MetadataTreeContentProvider.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MetadataTreeContentProvider.java
deleted file mode 100644
index 5b4b63f..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MetadataTreeContentProvider.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.util.Arrays;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.tools.AbstractTreeContentProvider;
-import org.eclipse.core.tools.TreeContentProviderNode;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * A tree content provider for Metadata view. Its input is a metadata directory,
- * the root directory from which Eclipse metadata files 
- * will be searched. The result is a tree containing directory that contains 
- * (any directories that contain) metadata files and the metadata files 
- * themselves.<br>
- * This content provider mantains its contents using 
- * <code>TreeContentProviderNode</code>
- * objects.
- * 
- * @see org.eclipse.core.tools.TreeContentProviderNode
- */
-public class MetadataTreeContentProvider extends AbstractTreeContentProvider {
-	/** 
-	 * The file filter. 
-	 * 
-	 * @see MetadataFileFilter
-	 */
-	private FileFilter fileFilter;
-
-	/** 
-	 * The directory filter. 
-	 * 
-	 * @see DirectoryFilter
-	 */
-	private FileFilter directoryFilter;
-
-	private MetadataTreeRebuilder treeRebuilder;
-
-	/**
-	 * Constructs a new content provider. 
-	 * 
-	 * @param registeredFileNames an array containing all metadata file names known 
-	 */
-	public MetadataTreeContentProvider(String[] registeredFileNames) {
-		super(true);
-		this.fileFilter = new MetadataFileFilter(registeredFileNames);
-		this.directoryFilter = new DirectoryFilter();
-		this.treeRebuilder = new MetadataTreeRebuilder();
-	}
-
-	/**
-	 * Returns true if the input is a <code>File</code> object pointing to 
-	 * a directory.
-	 * 
-	 * @return true if this input object is a <code>File</code> pointing to a 
-	 * directory.
-	 * @param input an input object 
-	 * @see org.eclipse.core.tools.AbstractTreeContentProvider#acceptInput(java.lang.Object)
-	 */
-	protected boolean acceptInput(Object input) {
-		return (input instanceof File) && ((File) input).isDirectory(); //$NON-NLS-1$
-	}
-
-	/**
-	 * Updates the data model for this content provider upon the provided input.
-	 * 
-	 * @param input a File object pointing to a metadata directory.
-	 * 
-	 * @see org.eclipse.core.tools.AbstractTreeContentProvider#rebuild(Viewer, Object)
-	 */
-	protected void rebuild(final Viewer viewer, final Object input) {
-		final File metadataRootDir = (File) input;
-		final TreeContentProviderNode metadataRootNode = makeNode(metadataRootDir);
-		getRootNode().addChild(metadataRootNode);
-		treeRebuilder.rebuild(viewer, metadataRootDir, metadataRootNode);
-	}
-
-	private class MetadataTreeRebuilder extends Job {
-		private File rootDir;
-		private TreeContentProviderNode rootNode;
-		private Viewer viewer;
-
-		public MetadataTreeRebuilder() {
-			super("Updating metadata tree"); //$NON-NLS-1$
-		}
-
-		protected IStatus run(IProgressMonitor monitor) {
-			try {
-				extractInfo(rootDir, rootNode, monitor);
-				return Status.OK_STATUS;
-			} finally {
-				final Viewer tmpViewer = viewer;
-				if (!tmpViewer.getControl().isDisposed())
-					tmpViewer.getControl().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							tmpViewer.refresh();
-						}
-					});
-			}
-		}
-
-		public synchronized void rebuild(Viewer viewer, File rootDir, TreeContentProviderNode rootNode) {
-			this.rootDir = rootDir;
-			this.rootNode = rootNode;
-			this.viewer = viewer;
-			cancel();
-			setName("Loading metadata tree from " + rootDir); //$NON-NLS-1$
-			schedule();
-		}
-	}
-
-	/**
-	 * Builds this content provider data model from a given root directory. This 
-	 * method operates recursively, adding a tree node for each file of a registered 
-	 * type it finds and for each directory that contains (any directories that 
-	 * contain) a file of a registered type. This method returns a boolean value 
-	 * indicating that it (or at least one of its sub dirs) contains files with one 
-	 * of the registered types (so its parent will include it too).
-	 * 
-	 * @param dir a directory potentially containing known metadata files.
-	 * @param dirNode the node corresponding to that directory 
-	 * @return true if the provided dir (or at least one of its sub dirs) 
-	 * contains files with one of the registered types, false otherwise
-	 */
-	boolean extractInfo(File dir, TreeContentProviderNode dirNode, IProgressMonitor monitor) {
-
-		if (monitor.isCanceled())
-			return false;
-
-		TreeContentProviderNode childNode;
-
-		monitor.beginTask("Scanning dir " + dir, 100); //$NON-NLS-1$
-		try {
-			// looks for files of registered types in this directory	
-			File[] selectedFiles = dir.listFiles(fileFilter);
-			monitor.worked(1);
-			Arrays.sort(selectedFiles);
-			for (int i = 0; i < selectedFiles.length; i++) {
-				childNode = makeNode(selectedFiles[i]);
-				dirNode.addChild(childNode);
-			}
-			// looks for files of registered types in its subdirectories
-			File[] subDirs = dir.listFiles(directoryFilter);
-			monitor.worked(1);
-			Arrays.sort(subDirs);
-
-			for (int i = 0; i < subDirs.length; i++) {
-				// constructs a node for each subdir...
-				childNode = makeNode(subDirs[i]);
-				if (extractInfo(subDirs[i], childNode, new SubProgressMonitor(monitor, 98 / subDirs.length)))
-					// ...but only adds them if they have files of registered types
-					dirNode.addChild(childNode);
-			}
-			// returns true if this dir has any file of any registered type
-			return selectedFiles.length > 0 || dirNode.hasChildren();
-		} finally {
-			monitor.done();
-		}
-	}
-
-	/**
-	 * Helper method that creates a new TreeContentroviderNode object given a File 
-	 * object.
-	 * 
-	 * @param file the file a node will created for
-	 * @return a <code>TreeContentProviderNode</code> 
-	 */
-	private TreeContentProviderNode makeNode(final File file) {
-		return new TreeContentProviderNode(file.getName(), file) {
-			// redefines toString so the root shows the full path while any other 
-			// node shows only the file / directory name
-			public String toString() {
-				return isRoot() ? file.getAbsolutePath() : file.getName();
-			}
-		};
-	}
-
-	/**
-	 * Filters accepted files (the ones who are registered in the DumperFactory).
-	 * 
-	 * @see MetadataTreeContentProvider#MetadataTreeContentProvider(String[]) 
-	 * @see java.io.FileFilter
-	 */
-	private class MetadataFileFilter implements FileFilter {
-		private String[] fileNames;
-
-		private MetadataFileFilter(String[] fileNames) {
-			this.fileNames = fileNames;
-			Arrays.sort(this.fileNames);
-		}
-
-		/**
-		 * @see java.io.FileFilter#accept(java.io.File)
-		 */
-		public boolean accept(File file) {
-			return file.isFile() && Arrays.binarySearch(fileNames, file.getName()) >= 0;
-		}
-	}
-
-	/**
-	 * Filters directories entries.
-	 * 
-	 * @see java.io.FileFilter
-	 */
-	private class DirectoryFilter implements FileFilter {
-		/**
-		 * @see java.io.FileFilter#accept(java.io.File)
-		 */
-		public boolean accept(File file) {
-			return file.isDirectory();
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MetadataTreeView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MetadataTreeView.java
deleted file mode 100644
index c930109..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MetadataTreeView.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.File;
-import org.eclipse.core.tools.*;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Implements the Metadata Spy view. This view allows the user to browse the
- * known files under a specified directory. "Known files" are those whose names
- * are known by the DumperFactory, thus they can be dumped.
- */
-public class MetadataTreeView extends SpyView {
-
-	/** 
-	 * A JFace widget used to display a tree corresponding to the metadata
-	 * directory structure (containing only files of known types). 
-	 */
-	protected AbstractTreeViewer viewer;
-
-	/** The currently selected metadata dir. */
-	protected File metadataPath;
-
-	/** The id by which this view is known in the plug-in registry */
-	public static final String VIEW_ID = MetadataTreeView.class.getName();
-
-	/**
-	 * Dump file action implementation.
-	 */
-	private class DumpFileAction extends Action {
-		/**
-		 * Constructs a DumpFileAction, initializing text and tool tip text.
-		 */
-		DumpFileAction() {
-			this.setText("Dump Selected File"); //$NON-NLS-1$
-			this.setToolTipText("Dump selected file"); //$NON-NLS-1$
-		}
-
-		/**
-		 * This action activates the Dump Contents view with the current selected
-		 * file in this view (if any)
-		 *
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			IStructuredSelection sel = (IStructuredSelection) MetadataTreeView.this.viewer.getSelection();
-			if (sel == null || sel.isEmpty())
-				return;
-
-			TreeContentProviderNode fileNode = (TreeContentProviderNode) sel.getFirstElement();
-
-			File file = (File) fileNode.getValue();
-			// we have no interest in directories
-			if (!file.isFile())
-				return;
-
-			try {
-				DumpContentsView dumpView = (DumpContentsView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(DumpContentsView.VIEW_ID);
-				dumpView.setFile(file);
-			} catch (PartInitException e) {
-				ErrorUtil.showErrorMessage(e.getMessage(), "Error opening view"); //$NON-NLS-1$
-				ErrorUtil.logException(e, "Error opening view"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * Select metadata root action implementation.
-	 */
-	private class SelectMetadataLocationAction extends Action {
-		/**
-		 * Initializes action's text and tool tip text.
-		 */
-		SelectMetadataLocationAction() {
-			this.setText("Select metadata location..."); //$NON-NLS-1$
-			this.setToolTipText("Select metadata location..."); //$NON-NLS-1$
-		}
-
-		/**
-		 * Executes action, opening a file dialog so the user can select which
-		 * metadata directory will be browsed.
-		 *
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			DirectoryDialog dirDialog = new DirectoryDialog(viewer.getControl().getShell());
-
-			dirDialog.setText("Open a metadata directory"); //$NON-NLS-1$
-			dirDialog.setMessage("Please choose a directory where to look for metadata files"); //$NON-NLS-1$
-			if (metadataPath != null)
-				dirDialog.setFilterPath(metadataPath.getAbsolutePath());
-
-			String dirPath = dirDialog.open();
-
-			if (dirPath == null)
-				return;
-
-			setMetadataRoot(new File(dirPath));
-		}
-	}
-
-	/**
-	 * Creates this view widget and actions.
-	 * 
-	 * @param parent the parent control
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TreeViewer(parent);
-
-		// sets a content provider for the viewer
-		DumperFactory factory = DumperFactory.getInstance();
-		String[] fileNames = factory.getRegisteredFileNames();
-		viewer.setContentProvider(new MetadataTreeContentProvider(fileNames));
-
-		// creates actions
-		final IAction dumpFileAction = new DumpFileAction();
-		final IAction selectMetadataLocationAction = new SelectMetadataLocationAction();
-
-		// adds actions to the menu bar
-		IMenuManager barMenuManager = getViewSite().getActionBars().getMenuManager();
-		barMenuManager.add(selectMetadataLocationAction);
-		barMenuManager.add(dumpFileAction);
-
-		// creates a context menu with actions and adds it to the viewer control
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.add(selectMetadataLocationAction);
-		menuMgr.add(dumpFileAction);
-
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-
-		// associates double-click to dump file action
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				dumpFileAction.run();
-			}
-		});
-	}
-
-	/**
-	 * Rebuilds the viewer content provider.
-	 * 
-	 * @param file
-	 * @see WorkspaceContentProvider#inputChanged(Viewer, Object, Object)
-	 */
-	protected void setMetadataRoot(final File file) {
-		if (file == null)
-			return;
-		if (!file.isDirectory()) {
-			ErrorUtil.showErrorMessage("Selected item is not a directory", "Error selecting metadata location"); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		metadataPath = file;
-		viewer.setInput(file);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MeteredInputStream.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MeteredInputStream.java
deleted file mode 100644
index 2776d38..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MeteredInputStream.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.*;
-
-/**
- * An input stream that counts how many bytes have been read.
- */
-public class MeteredInputStream extends PushbackInputStream {
-
-	/** The current number of bytes read. */
-	private long offset;
-
-	/**
-	 * Constructs a metered input stream chained to the given source input stream.
-	 * 
-	 * @param in the input stream from where to read data
-	 */
-	public MeteredInputStream(InputStream in) {
-		super(in);
-	}
-
-	/**
-	 * Forwards the call to the super class, incrementing the offset if a 
-	 * byte is successfully read.
-	 * 
-	 * @return the next byte or <code>-1</code> if there is more data to be read.
-	 * @throws IOException if a failure occurs while reading the input stream 
-	 * @see java.io.PushbackInputStream#read()
-	 */
-	public int read() throws IOException {
-		int byteRead = super.read();
-		if (byteRead >= 0)
-			offset++;
-		return byteRead;
-	}
-
-	/**
-	 * Forwards the call to the super class, incrementing the current offset
-	 * by the number of bytes read.
-	 * 
-	 * @param b an array containing bytes to be read 
-	 * @return the number of bytes read.
-	 * @throws IOException if a failure occurs while reading the input stream
-	 * @see java.io.PushbackInputStream#read(byte[])
-	 */
-	public int read(byte[] b) throws IOException {
-		return read(b, 0, b.length);
-	}
-
-	/**
-	 * Forwards the call to the super class, incrementing the current offset
-	 * by the number of bytes read.
-	 * 
-	 * @param b an array containing bytes to be read
-	 * @param off the array offset where bytes will be read to
-	 * @param len the number of bytes to be read 
-	 * @return the number of bytes read
-	 * @throws IOException if a failure occurs while reading the input stream
-	 * @see java.io.PushbackInputStream#read(byte[], int, int)
-	 */
-	public int read(byte[] b, int off, int len) throws IOException {
-		int read = super.read(b, off, len);
-		if (read > 0)
-			offset += read;
-		return read;
-	}
-
-	/**
-	 * Returns the current offset value.
-	 * 
-	 * @return long the current number of bytes read
-	 */
-	public long getOffset() {
-		return offset;
-	}
-
-	/**
-	 * Forwards the call to the underlying input stream, decrementing the offset by
-	 * the number of bytes unread.
-	 * 
-	 * @param b an array containing bytes to be unread 
-	 * @throws IOException if a failure occurs
-	 * @see java.io.PushbackInputStream#unread(byte)
-	 */
-	public void unread(byte[] b) throws IOException {
-		super.unread(b);
-		offset -= b.length;
-	}
-
-	/**
-	 * Forwards the call to the underlying input stream, decrementing the offset by
-	 * the number of bytes unread.
-	 * 
-	 * @param b an array containing bytes to be unread
-	 * @param off the array offset from where bytes will be unread
-	 * @param len the number of bytes to be unread 
-	 * @throws IOException if a failure occurs
-	 * @see PushbackInputStream#unread(byte[], int, int)
-	 */
-	public void unread(byte[] b, int off, int len) throws IOException {
-		super.unread(b, off, len);
-		offset -= len;
-	}
-
-	/**
-	 * Forwards the call to the underlying push back input stream, decrementing the 
-	 * offset if a 
-	 * byte is successfully unread.
-	 * 
-	 * @param b the byte to be unread
-	 * @throws IOException if a failure occurs
-	 * @see PushbackInputStream#unread(byte[])
-	 */
-	public void unread(int b) throws IOException {
-		super.unread(b);
-		offset--;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MultiStrategyDumper.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MultiStrategyDumper.java
deleted file mode 100644
index 89c4705..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/MultiStrategyDumper.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.*;
-
-/**
- * Subclasses must provide a concrete 
- * implementation for <code>getStringDumpingStrategy(InputStream)</code> method.
- */
-public abstract class MultiStrategyDumper extends AbstractDumper {
-
-	/**
-	 * <p>Subclasses must implement 
-	 * <code>getStringDumpingStrategy(InputStream)</code> in order to select the 
-	 * real dumping behaviour. This method will call 
-	 * <code>IStringDumpingStrategy#dumpStringContents(DataInputStream)</code> on 
-	 * the returned strategy. If, after calling that method,  there are still bytes 
-	 * to be read in the input stream, 
-	 * <code>getStringDumpingStrategy(InputStream)</code> will be called again in 
-	 * order to select another strategy to read the remaining contents, and so on.
-	 * </p> 
-	 * 
-	 * @param file the file to be dumped
-	 * @return a dump object representing the contents of the dumped file
-	 * @see org.eclipse.core.tools.metadata.IDumper#dump(java.io.File)
-	 * @see #getStringDumpingStrategy(DataInputStream)
-	 * @see IStringDumpingStrategy#dumpStringContents(DataInputStream)
-	 * @see #openInputStream(File)
-	 */
-	protected final void dumpContents(PushbackInputStream input, StringBuffer contents) throws IOException, Exception, DumpException {
-		DataInputStream dataInput = new DataInputStream(input);
-		int c;
-		while ((c = input.read()) != -1) {
-			input.unread(c);
-			IStringDumpingStrategy strategy = getStringDumpingStrategy(dataInput);
-			String dumpedContents = strategy.dumpStringContents(dataInput);
-			if (dumpedContents == null)
-				break;
-			contents.append("Format: "); //$NON-NLS-1$
-			contents.append(strategy.getFormatDescription());
-			contents.append("\n\n"); //$NON-NLS-1$
-			contents.append(dumpedContents);
-			contents.append("\n"); //$NON-NLS-1$                          
-		}
-		if (contents.length() == 0)
-			contents.append("No contents\n"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns a <code>IStringDumpingStrategy</code> object. Subclasses must provide 
-	 * a concrete implementation for this method. The input stream is connected to 
-	 * the file being dumped. If needed, implementations may consume the input 
-	 * stream in order to choose a strategy.
-	 * 
-	 * @param input the input stream being read
-	 * @return  a <code>IStringDumpingStrategy</code> object
-	 * @throws Exception any exceptions occurred during input stream reading must 
-	 * NOT be caught
-	 */
-	protected abstract IStringDumpingStrategy getStringDumpingStrategy(DataInputStream input) throws Exception;
-
-	/**
-	 * Opens an input stream connected to the file object provided. Provides an 
-	 * opportunity for subclasses to select a different input stream class. By 
-	 * default, returns a <code>FileInputStream</code> object.
-	 * 
-	 * @param file the file to be opened
-	 * @return an input stream connected to the file provided as 
-	 * argument
-	 * @throws IOException if an exception happens while opening the inpuut stream
-	 */
-	protected InputStream openInputStream(File file) throws IOException {
-		return new FileInputStream(file);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/PartialDumpException.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/PartialDumpException.java
deleted file mode 100644
index fa33e77..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/PartialDumpException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-public class PartialDumpException extends DumpException {
-
-	private static final long serialVersionUID = 1L;
-	/**
-	 * Data read when the error happened. May be 
-	 * null. 
-	 */
-	private Object partialContents;
-
-	public PartialDumpException(String msg, Object partialContents) {
-		super(msg);
-		this.partialContents = partialContents;
-	}
-
-	public PartialDumpException(String msg, Throwable cause, Object partialContents) {
-		super(msg, cause);
-		this.partialContents = partialContents;
-	}
-
-	/**
-	 * Returns the contents partially read when this exception occurred. May 
-	 * return <code>null</code>.
-	 * 
-	 * @return the contents partially read, or <code>null</code> 
-	 */
-	public Object getPartialContents() {
-		return partialContents;
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/StateDumper.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/StateDumper.java
deleted file mode 100644
index a1b3d3d..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/metadata/StateDumper.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.metadata;
-
-import java.io.*;
-import java.io.IOException;
-import java.io.PushbackInputStream;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.osgi.service.resolver.*;
-
-public class StateDumper extends AbstractDumper {
-
-	protected void dumpContents(PushbackInputStream input, StringBuffer contents) throws IOException, Exception, DumpException {
-		PlatformAdmin admin = Platform.getPlatformAdmin();
-		// use the deprecated API to support running against a 3.0 Eclipse
-		State state = admin.getFactory().readState(new DataInputStream(input));
-		contents.append("State resolved: "); //$NON-NLS-1$
-		contents.append(state.isResolved());
-		contents.append("\n"); //$NON-NLS-1$
-		BundleDescription[] allBundles = state.getBundles();
-		admin.getStateHelper().sortBundles(allBundles);
-		for (int i = 0; i < allBundles.length; i++)
-			dumpBundle(allBundles[i], contents);
-	}
-
-	private void dumpBundle(BundleDescription bundle, StringBuffer contents) {
-		contents.append("\n"); //$NON-NLS-1$
-		contents.append("Bundle: "); //$NON-NLS-1$
-		contents.append(bundle.getSymbolicName());
-		contents.append('_');
-		contents.append(bundle.getVersion());
-		contents.append(" ("); //$NON-NLS-1$
-		contents.append(bundle.isResolved() ? "resolved" : "unresolved"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (bundle.isSingleton())
-			contents.append(", singleton"); //$NON-NLS-1$
-		contents.append(")\n"); //$NON-NLS-1$
-		HostSpecification host = bundle.getHost();
-		if (host != null)
-			dumpHost(host, contents);
-		BundleSpecification[] required = bundle.getRequiredBundles();
-		for (int i = 0; i < required.length; i++)
-			dumpRequired(required[i], contents);
-	}
-
-	private void dumpRequired(BundleSpecification required, StringBuffer contents) {
-		contents.append("\tRequired: "); //$NON-NLS-1$
-		contents.append(required.getName());
-		contents.append(" - Version: "); //$NON-NLS-1$
-		contents.append(required.getVersionRange());
-		contents.append(" ("); //$NON-NLS-1$
-		contents.append(required.isResolved() ? ("actual: "+ required.getSupplier().getVersion().toString()) : "unresolved"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (required.isOptional())
-			contents.append(", optional"); //$NON-NLS-1$
-		contents.append(')');		
-		contents.append('\n');
-	}
-
-	private void dumpHost(HostSpecification host, StringBuffer contents) {
-		contents.append("\tHost: "); //$NON-NLS-1$
-		contents.append(host.getName());
-		contents.append(" - Version: "); //$NON-NLS-1$
-		contents.append(host.getVersionRange());
-		contents.append(" ("); //$NON-NLS-1$
-		contents.append(host.isResolved() ? ("actual: "+ host.getSupplier().getVersion().toString()) : "unresolved");		 //$NON-NLS-1$ //$NON-NLS-2$
-		contents.append(')');
-		contents.append('\n');
-	}
-
-	public String getFormatDescription() {
-		return "Framework state"; //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/ConvertMessageBundleAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/ConvertMessageBundleAction.java
deleted file mode 100644
index 3040b24..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/ConvertMessageBundleAction.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.nls;
-
-import java.lang.reflect.InvocationTargetException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.internal.ui.actions.WorkbenchRunnableAdapter;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ltk.core.refactoring.CheckConditionsOperation;
-import org.eclipse.ltk.core.refactoring.PerformRefactoringOperation;
-import org.eclipse.ui.*;
-
-public class ConvertMessageBundleAction implements IObjectActionDelegate {
-
-	private ICompilationUnit fAccessorUnit;
-	private IWorkbenchPart fPart;
-
-	public void setActivePart(IAction action, IWorkbenchPart part) {
-		fPart = part;
-	}
-
-	public void run(IAction action) {
-		if (fAccessorUnit == null)
-			return;
-		try {
-			final GotoResourceAction pAction = new GotoResourceAction(fPart);
-			IRunnableWithProgress runnable = new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) {
-					pAction.run();
-				}
-			};
-			PlatformUI.getWorkbench().getProgressService().run(false, false, runnable);
-			IFile propertiesFile = (IFile) pAction.getResource();
-			if (propertiesFile == null)
-				return;
-			MessageBundleRefactoring refactoring = new MessageBundleRefactoring(fAccessorUnit.getTypes()[0], propertiesFile);
-			PerformRefactoringOperation op = new PerformRefactoringOperation(refactoring, CheckConditionsOperation.ALL_CONDITIONS);
-			PlatformUI.getWorkbench().getProgressService().run(false, false, new WorkbenchRunnableAdapter(op));
-		} catch (CoreException e) {
-			throw new RuntimeException(e);
-		} catch (InterruptedException e) {
-			throw new RuntimeException(e);
-		} catch (InvocationTargetException e) {
-			throw new RuntimeException(e);
-		}
-
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		Object element = ((IStructuredSelection) selection).getFirstElement();
-		if (element instanceof ICompilationUnit) {
-			fAccessorUnit = (ICompilationUnit) element;
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/GotoResourceAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/GotoResourceAction.java
deleted file mode 100644
index 2b1c05e..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/GotoResourceAction.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.nls;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.dialogs.ResourceListSelectionDialog;
-
-public class GotoResourceAction extends Action {
-	IResource selectedResource;
-	IWorkbenchPart part;
-
-	private static class GotoResourceDialog extends ResourceListSelectionDialog {
-		private IJavaModel fJavaModel;
-
-		public GotoResourceDialog(Shell parentShell, IContainer container) {
-			super(parentShell, container, IResource.FILE | IResource.FOLDER | IResource.PROJECT);
-			fJavaModel = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
-			setTitle("Select the corresponding properties file:"); //$NON-NLS-1$
-		}
-
-		protected boolean select(IResource resource) {
-			IProject project = resource.getProject();
-			try {
-				if (project.getNature(JavaCore.NATURE_ID) != null)
-					return fJavaModel.contains(resource);
-			} catch (CoreException e) {
-				// do nothing. Consider resource;
-			}
-			return true;
-		}
-	}
-
-	public IResource getResource() {
-		return selectedResource;
-	}
-
-	public GotoResourceAction(IWorkbenchPart part) {
-		this.part = part;
-		setText("Select the corresponding properties file:"); //$NON-NLS-1$
-	}
-
-	public void run() {
-		GotoResourceDialog dialog = new GotoResourceDialog(part.getSite().getShell(), ResourcesPlugin.getWorkspace().getRoot());
-		dialog.open();
-		Object[] result = dialog.getResult();
-		if (result == null || result.length == 0 || !(result[0] instanceof IResource))
-			return;
-		selectedResource = (IResource) result[0];
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/IntegerMap.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/IntegerMap.java
deleted file mode 100644
index b23507e..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/IntegerMap.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.nls;
-
-public class IntegerMap {
-
-	private static final int DEFAULT = 0;
-	private static final int GROW_SIZE = 10;
-
-	private int[] keys;
-	private int[] values;
-
-	public IntegerMap(int size) {
-		super();
-		keys = new int[size];
-		values = new int[size];
-	}
-
-	public int get(int key) {
-		for (int i = 0; i < keys.length; i++) {
-			int current = keys[i];
-			if (current != 0 && current == key)
-				return values[i];
-		}
-		return DEFAULT;
-	}
-
-	public void put(int key, int value) {
-
-		// replace if exists
-		int emptySlot = -1;
-		for (int i = 0; i < keys.length; i++) {
-			int current = keys[i];
-			if (current == 0) {
-				emptySlot = i;
-				continue;
-			} else if (current == key) {
-				values[i] = value;
-				return;
-			}
-		}
-
-		// grow if needed, then fill the empty slot
-		if (emptySlot == -1)
-			emptySlot = grow();
-		keys[emptySlot] = key;
-		values[emptySlot] = value;
-	}
-
-	private int grow() {
-		int size = keys.length;
-		int[] tempKeys = new int[size + GROW_SIZE];
-		System.arraycopy(keys, 0, tempKeys, 0, size);
-		keys = tempKeys;
-		int[] tempValues = new int[size + GROW_SIZE];
-		System.arraycopy(values, 0, tempValues, 0, size);
-		values = tempValues;
-		return size;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/MessageBundleRefactoring.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/MessageBundleRefactoring.java
deleted file mode 100644
index 1ffcbab..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/MessageBundleRefactoring.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.nls;
-
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.core.filebuffers.*;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jdt.core.*;
-import org.eclipse.jdt.core.dom.*;
-import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.internal.corext.dom.Bindings;
-import org.eclipse.jdt.internal.corext.refactoring.RefactoringScopeFactory;
-import org.eclipse.jdt.internal.corext.refactoring.RefactoringSearchEngine;
-import org.eclipse.jdt.internal.corext.refactoring.changes.CompilationUnitChange;
-import org.eclipse.jdt.internal.corext.refactoring.util.RefactoringASTParser;
-import org.eclipse.jdt.internal.corext.refactoring.util.RefactoringFileBuffers;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ltk.core.refactoring.*;
-
-public class MessageBundleRefactoring extends Refactoring {
-
-	IType fAccessorClass;
-	IFile fPropertiesFile;
-	CompositeChange fChange;
-	ITypeBinding fAccessorTypeBinding;
-
-	public MessageBundleRefactoring(IType accessorClass, IFile propertiesFile) {
-		super();
-		fAccessorClass = accessorClass;
-		fPropertiesFile = propertiesFile;
-	}
-
-	public String getName() {
-		return "Message Bundle Refactoring";
-	}
-
-	public RefactoringStatus checkInitialConditions(IProgressMonitor monitor) throws CoreException, OperationCanceledException {
-		return new RefactoringStatus();
-	}
-
-	public RefactoringStatus checkFinalConditions(IProgressMonitor monitor) throws CoreException, OperationCanceledException {
-		RefactoringStatus result = new RefactoringStatus();
-		fAccessorTypeBinding = computeAccessorClassBinding(new SubProgressMonitor(monitor, 1));
-		if (fAccessorTypeBinding == null) {
-			result.addFatalError("Couldn't resolve accessor class");
-			return result;
-		}
-		fChange = new CompositeChange("Accessor Class Changes");
-		ICompilationUnit[] affectedUnits = RefactoringSearchEngine.findAffectedCompilationUnits(SearchPattern.createPattern(fAccessorClass, IJavaSearchConstants.REFERENCES), RefactoringScopeFactory.create(fAccessorClass), new SubProgressMonitor(monitor, 5), result);
-		monitor.beginTask("", affectedUnits.length + 1);
-		for (int i = 0; i < affectedUnits.length; i++) {
-			ICompilationUnit unit = affectedUnits[i];
-			if (unit.equals(fAccessorClass.getCompilationUnit()))
-				continue;
-			processCompilationUnit(result, unit, new SubProgressMonitor(monitor, 1));
-		}
-		processPropertiesFile(result, new SubProgressMonitor(monitor, 1));
-		return result;
-	}
-
-	private void processPropertiesFile(RefactoringStatus result, IProgressMonitor monitor) throws CoreException {
-		// TODO need to roll the changes to the properties file into a text edit that we can hook into
-		// the "Undo -> Refactoring" framework
-		try {
-			ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager();
-			try {
-				manager.connect(fPropertiesFile.getFullPath(), null);
-				manager.connect(fAccessorClass.getCompilationUnit().getCorrespondingResource().getFullPath(), null);
-				fChange.addAll(new PropertyFileConverter().convertFile(fAccessorClass, fPropertiesFile));
-			} finally {
-				manager.disconnect(fPropertiesFile.getFullPath(), null);
-				manager.disconnect(fAccessorClass.getCompilationUnit().getCorrespondingResource().getFullPath(), null);
-			}
-		} catch (IOException e) {
-			throw new CoreException(new Status(IStatus.ERROR, NLSPlugin.PI_NLS, IStatus.ERROR, e.getMessage(), e));
-		}
-	}
-
-	private void processCompilationUnit(RefactoringStatus result, ICompilationUnit unit, IProgressMonitor monitor) throws CoreException {
-		monitor.beginTask("", 2);
-		CompilationUnit root = new RefactoringASTParser(AST.JLS3).parse(unit, true, new SubProgressMonitor(monitor, 1));
-		ASTRewrite rewriter = ASTRewrite.create(root.getAST());
-
-		processAST(result, root, rewriter, new SubProgressMonitor(monitor, 1));
-
-		CompilationUnitChange change = new CompilationUnitChange(unit.getElementName(), unit);
-		try {
-			ITextFileBuffer buffer = RefactoringFileBuffers.acquire(unit);
-			IDocument document = buffer.getDocument();
-			change.setEdit(rewriter.rewriteAST(document, null));
-		} finally {
-			RefactoringFileBuffers.release(unit);
-		}
-		fChange.add(change);
-		monitor.done();
-	}
-
-	private void processAST(RefactoringStatus result, final CompilationUnit root, final ASTRewrite rewriter, SubProgressMonitor monitor) {
-		// keep track of the number of changes we make per line so we can get rid of the NLS comments.
-		final IntegerMap map = new IntegerMap(10);
-		ASTVisitor visitor = new ASTVisitor() {
-			public boolean visit(MethodInvocation node) {
-				Name messageBundleName = getMessageBundleReceiver(node);
-				if (messageBundleName == null)
-					return true;
-				IMethodBinding method = node.resolveMethodBinding();
-				// TODO here we have to do some checks whether the called method on the
-				// resource bundle is something we have to rewrite. This depends on
-				// the kind of the bundle and needs some AI.
-				ITypeBinding[] params = method.getParameterTypes();
-				if (params.length == 0)
-					return true;
-				if (!"java.lang.String".equals(params[0].getQualifiedName()))
-					return true;
-				List args = node.arguments();
-				if (args.size() != 1)
-					return true;
-				Object obj = args.get(0);
-				if (!(obj instanceof StringLiteral))
-					return true;
-				// compute the key of the message property
-				StringLiteral string = (StringLiteral) obj;
-				String key = PropertyFileConverter.convertToJavaIdentifier(string.getLiteralValue());
-
-				// create the field access object
-				FieldAccess fieldAccess = root.getAST().newFieldAccess();
-				fieldAccess.setExpression((Expression) rewriter.createCopyTarget(messageBundleName));
-				fieldAccess.setName(root.getAST().newSimpleName(key));
-
-				// replace the method invocation with the field access
-				rewriter.replace(node, fieldAccess, null);
-				int line = 11;
-				int value = map.get(line);
-				value++;
-				map.put(line, value);
-				return true;
-			}
-
-			private Name getMessageBundleReceiver(MethodInvocation node) {
-				Expression expression = node.getExpression();
-				if (expression == null)
-					return null;
-				if (expression instanceof Name && Bindings.equals(fAccessorTypeBinding, ((Name) expression).resolveBinding())) {
-					return (Name) expression;
-				}
-				return null;
-			}
-		};
-		root.accept(visitor);
-
-		// create another visitor to trim the //$NON-NLS-N$ comments
-		//		visitor = new ASTVisitor() {
-		//			public boolean visit(LineComment node) {
-		//				return true;
-		//			}
-		//		};
-		//		root.accept(visitor);
-	}
-
-	public Change createChange(IProgressMonitor monitor) throws CoreException, OperationCanceledException {
-		return fChange;
-	}
-
-	private ITypeBinding computeAccessorClassBinding(IProgressMonitor monitor) {
-		ASTParser parser = ASTParser.newParser(AST.JLS3);
-		parser.setProject(fAccessorClass.getJavaProject());
-		return (ITypeBinding) parser.createBindings(new IJavaElement[] {fAccessorClass}, monitor)[0];
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/NLSFileChange.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/NLSFileChange.java
deleted file mode 100644
index 8ba958f..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/NLSFileChange.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.core.tools.nls;
-
-import java.io.*;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.TextFileChange;
-
-public class NLSFileChange extends TextFileChange {
-	private IFile file;
-	private String contents;
-
-	public NLSFileChange(IFile file) {
-		super("Message bundle properties file change", file); //$NON-NLS-1$
-		this.file = file;
-		setTextType("text"); //$NON-NLS-1$
-	}
-
-	public RefactoringStatus isValid(IProgressMonitor pm) throws OperationCanceledException {
-		return RefactoringStatus.create(Status.OK_STATUS);
-	}
-
-	void setContents(String text) {
-		this.contents = text;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.TextFileChange#commit(org.eclipse.jface.text.IDocument, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected void commit(IDocument document, IProgressMonitor monitor) throws CoreException {
-		if (contents == null) {
-			System.err.println("Cannot write null contents to file: " + file); //$NON-NLS-1$
-			return;
-		}
-		byte[] bytes = null;
-		try {
-			bytes = contents.getBytes(file.getCharset(true));
-		} catch (UnsupportedEncodingException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		if (bytes == null)
-			bytes = contents.getBytes();
-		InputStream input = new BufferedInputStream(new ByteArrayInputStream(bytes));
-		file.setContents(input, IResource.FORCE, null);
-	}
-
-	/* (non-Javadoc)
-	 * @see Change#getModifiedElement()
-	 */
-	public Object getModifiedElement() {
-		return file;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/NLSPlugin.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/NLSPlugin.java
deleted file mode 100644
index 5502911..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/NLSPlugin.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.core.tools.nls;
-
-import org.eclipse.ui.plugin.*;
-import org.osgi.framework.BundleContext;
-import java.util.*;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class NLSPlugin extends AbstractUIPlugin {
-	//The shared instance.
-	private static NLSPlugin plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-	
-	public static final String PI_NLS = "com.example.nls"; //$NON-NLS-1$
-	
-	/**
-	 * The constructor.
-	 */
-	public NLSPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-		resourceBundle = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static NLSPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle,
-	 * or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = NLSPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		try {
-			if (resourceBundle == null)
-				resourceBundle = ResourceBundle.getBundle("com.example.nls.NlsPluginResources");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-		return resourceBundle;
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/PropertyFileConverter.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/PropertyFileConverter.java
deleted file mode 100644
index 66c186f..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/PropertyFileConverter.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.core.tools.nls;
-
-import java.io.*;
-import java.util.HashSet;
-import java.util.List;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.ltk.core.refactoring.Change;
-
-/**
- * Converts a message bundle file to the new format, and generates a Java
- * file with fields for each key in the bundle.
- */
-public class PropertyFileConverter {
-
-	private static final HashSet keywords = new HashSet();
-
-	static {
-		keywords.add("abstract"); //$NON-NLS-1$
-		keywords.add("assert"); //$NON-NLS-1$
-		keywords.add("break"); //$NON-NLS-1$
-		keywords.add("case"); //$NON-NLS-1$
-		keywords.add("catch"); //$NON-NLS-1$
-		keywords.add("class"); //$NON-NLS-1$
-		keywords.add("continue"); //$NON-NLS-1$
-		keywords.add("default"); //$NON-NLS-1$
-		keywords.add("do"); //$NON-NLS-1$
-		keywords.add("else"); //$NON-NLS-1$
-		keywords.add("extends"); //$NON-NLS-1$
-		keywords.add("final"); //$NON-NLS-1$
-		keywords.add("finally"); //$NON-NLS-1$
-		keywords.add("for"); //$NON-NLS-1$
-		keywords.add("if"); //$NON-NLS-1$
-		keywords.add("implements"); //$NON-NLS-1$
-		keywords.add("import"); //$NON-NLS-1$
-		keywords.add("instanceof"); //$NON-NLS-1$
-		keywords.add("interface"); //$NON-NLS-1$
-		keywords.add("native"); //$NON-NLS-1$
-		keywords.add("new"); //$NON-NLS-1$
-		keywords.add("package"); //$NON-NLS-1$
-		keywords.add("private"); //$NON-NLS-1$
-		keywords.add("protected"); //$NON-NLS-1$
-		keywords.add("public"); //$NON-NLS-1$
-		keywords.add("return"); //$NON-NLS-1$
-		keywords.add("static"); //$NON-NLS-1$
-		keywords.add("strictfp"); //$NON-NLS-1$
-		keywords.add("super"); //$NON-NLS-1$
-		keywords.add("switch"); //$NON-NLS-1$
-		keywords.add("synchronized"); //$NON-NLS-1$
-		keywords.add("this"); //$NON-NLS-1$
-		keywords.add("throw"); //$NON-NLS-1$
-		keywords.add("throws"); //$NON-NLS-1$
-		keywords.add("transient"); //$NON-NLS-1$
-		keywords.add("try"); //$NON-NLS-1$
-		keywords.add("volatile"); //$NON-NLS-1$
-		keywords.add("while"); //$NON-NLS-1$
-		keywords.add("true"); //$NON-NLS-1$
-		keywords.add("false"); //$NON-NLS-1$
-		keywords.add("null"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Appends the text to put at the end of each Java messages file.
-	 */
-	private void appendPostText(StringBuffer buffer, String bundlePath, String typeName) {
-		buffer.append("\n\tstatic {\n"); //$NON-NLS-1$
-		buffer.append("\t\t// load message values from bundle file\n"); //$NON-NLS-1$
-		buffer.append("\t\tNLS.initializeMessages(BUNDLE_NAME, "); //$NON-NLS-1$
-		buffer.append(typeName);
-		buffer.append(".class"); //$NON-NLS-1$
-		buffer.append(");\n"); //$NON-NLS-1$
-		buffer.append("\t}\n"); //$NON-NLS-1$
-		buffer.append("}"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Appends the text to put at the beginning of each Java messages file.
-	 */
-	private void appendPreText(StringBuffer buffer, String pkgName, String bundleName, String typeName) {
-		//if this text had typos, would it be a false pretext?
-		buffer.append("/**********************************************************************\n"); //$NON-NLS-1$
-		buffer.append(" * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This\n"); //$NON-NLS-1$
-		buffer.append(" * program and the accompanying materials are made available under the terms of\n"); //$NON-NLS-1$
-		buffer.append(" * the Eclipse Public License v1.0 which accompanies this distribution, and is\n"); //$NON-NLS-1$
-		buffer.append(" * available at http://www.eclipse.org/legal/epl-v10.html\n"); //$NON-NLS-1$
-		buffer.append(" * \n"); //$NON-NLS-1$
-		buffer.append(" * Contributors: \n"); //$NON-NLS-1$
-		buffer.append(" * IBM - Initial API and implementation\n"); //$NON-NLS-1$
-		buffer.append(" **********************************************************************/\n"); //$NON-NLS-1$
-		buffer.append("package "); //$NON-NLS-1$
-		buffer.append(pkgName);
-		buffer.append(";\n\n"); //$NON-NLS-1$
-
-		buffer.append("import org.eclipse.osgi.util.NLS;\n\n"); //$NON-NLS-1$
-		buffer.append("public class "); //$NON-NLS-1$
-		buffer.append(typeName);
-		buffer.append(" extends NLS {\n"); //$NON-NLS-1$
-		buffer.append("\tprivate static final String BUNDLE_NAME = \"" + pkgName + '.' + bundleName + "\";//$NON-NLS-1$\n"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/*
-	 * Remove the properties in the specified list from the file.
-	 */
-	public Change trim(IFile propertiesFile, List toDelete) throws IOException, CoreException {
-		if (toDelete == null || toDelete.isEmpty())
-			return null;
-		BufferedReader reader = new BufferedReader(new InputStreamReader(propertiesFile.getContents()));
-		StringBuffer bundle = new StringBuffer();
-
-		try {
-			String line;
-			boolean isContinued = false;
-			boolean wasDeleted = false;
-			while ((line = reader.readLine()) != null) {
-				line = line.trim();
-				// just add comments directly to the output
-				if (skipLine(line)) {
-					bundle.append(line);
-					bundle.append("\r\n"); //$NON-NLS-1$
-					continue;
-				}
-
-				boolean wasContinued = isContinued;
-				isContinued = isContinued(line);
-				// if we are continued from the previous line...
-				if (wasContinued) {
-					// if the previous line was deleted then...
-					if (wasDeleted) {
-						// skip this line
-					} else {
-						// otherwise write it out
-						bundle.append(line);
-						bundle.append("\r\n"); //$NON-NLS-1$
-					}
-				} else {
-					// we weren't continued from the previous line
-					String key = extractKey(line);
-					boolean shouldDelete = toDelete.contains(key);
-					// if the key was in our skip list then don't write it out
-					if (shouldDelete) {
-						wasDeleted = true;
-					} else {
-						wasDeleted = false;
-						bundle.append(line);
-						bundle.append("\r\n"); //$NON-NLS-1$
-					}
-				}
-
-			}
-		} finally {
-			if (reader != null)
-				reader.close();
-		}
-		NLSFileChange pChange = new NLSFileChange(propertiesFile);
-		pChange.setContents(bundle.toString());
-		return pChange;
-	}
-
-	/**
-	 * Reads an old properties file, and creates a new properties file and corresponding
-	 * Java messages file.
-	 */
-	public Change[] convertFile(IType accessorType, IFile propertiesFile) throws IOException, CoreException {
-		String pkgName = accessorType.getPackageFragment().getElementName();
-		IFile accessorFile = (IFile) accessorType.getCompilationUnit().getCorrespondingResource();
-		String typeName = accessorFile.getFullPath().removeFileExtension().lastSegment();
-		BufferedReader reader = new BufferedReader(new InputStreamReader(propertiesFile.getContents()));
-		String bundleName = propertiesFile.getName();
-		StringBuffer clazz = new StringBuffer();
-		// convert the bundle resource (messages.properties) to the simple name (messages)
-		String simpleBundleName = new Path(bundleName).removeFileExtension().toString();
-		appendPreText(clazz, pkgName, simpleBundleName, typeName);
-		StringBuffer bundle = new StringBuffer();
-		int savings = 0;
-		try {
-			String line;
-			boolean isContinued = false;
-			while ((line = reader.readLine()) != null) {
-				line = line.trim();
-				boolean wasContinued = isContinued;
-				isContinued = isContinued(line);
-				if (!wasContinued) {
-					if (skipLine(line)) {
-						clazz.append(convertToComment(line));
-					} else {
-						String key = extractKey(line);
-						savings += 88 + 4 * key.length();
-						String identifier = convertToJavaIdentifier(key);
-						clazz.append("\tpublic static String "); //$NON-NLS-1$
-						clazz.append(identifier);
-						clazz.append(";\n"); //$NON-NLS-1$
-						//convert the bundle file line to use the Java identifier
-						line = identifier + line.substring(key.length());
-					}
-				}
-				//write the line out to the new bundle file
-				bundle.append(line);
-				bundle.append("\r\n"); //$NON-NLS-1$
-			}
-		} finally {
-			if (reader != null)
-				reader.close();
-		}
-		System.out.println("Memory saved by converting to field-based keys: " + savings);
-		appendPostText(clazz, pkgName + '.' + bundleName, typeName);
-
-		NLSFileChange pChange = new NLSFileChange(propertiesFile);
-		pChange.setContents(bundle.toString());
-
-		NLSFileChange cChange = new NLSFileChange(accessorFile);
-		cChange.setContents(clazz.toString());
-
-		return new Change[] {pChange, cChange};
-	}
-
-	/**
-	 * Writes the given line as a comment int the provided class buffer.
-	 * Blank lines are preserved.
-	 */
-	private String convertToComment(String line) {
-		StringBuffer comment = new StringBuffer();
-		if (line.trim().length() > 0) {
-			comment.append("\t//"); //$NON-NLS-1$
-		}
-		int offset = 0;
-		//skip leading comment characters
-		while (offset < line.length()) {
-			char c = line.charAt(offset);
-			if (c != '!' && c != '#')
-				break;
-			offset++;
-		}
-		comment.append(line.substring(offset));
-		comment.append('\n');
-		return comment.toString();
-	}
-
-	/**
-	 * Converts an arbitrary string into a string that represents a valid
-	 * Java identifier.
-	 */
-	public static String convertToJavaIdentifier(String key) {
-		String string = key.trim();
-		int len = string.length();
-		if (len == 0)
-			return string;
-		StringBuffer result = new StringBuffer();
-		char c = string.charAt(0);
-		if (Character.isJavaIdentifierStart(c))
-			result.append(c);
-		else {
-			//if it's a valid part, just add an underscore first but keep the character
-			result.append('_');
-			if (Character.isJavaIdentifierPart(c))
-				result.append(c);
-		}
-		for (int i = 1; i < len; i++) {
-			c = string.charAt(i);
-			if (Character.isJavaIdentifierPart(c))
-				result.append(c);
-			else
-				result.append('_');
-		}
-		//preserve trailing space
-		if (key.endsWith(" ")) //$NON-NLS-1$
-			result.append(' ');
-		return makeUnique(result.toString());
-	}
-
-	/**
-	 * Given a key converted to a Java identifier, ensure it is unique.
-	 * @return A unique key
-	 */
-	private static String makeUnique(String originalKey) {
-		String attempt = originalKey;
-		int counter = 0;
-		while (keywords.contains(attempt))
-			attempt = originalKey + counter++;
-		return attempt;
-	}
-
-	/**
-	 * Extracts and returns the property key from the given property file line.
-	 * The provided line contains no leading or trailing whitespace.
-	 */
-	private String extractKey(String line) {
-		int len = line.length();
-		StringBuffer key = new StringBuffer();
-		for (int i = 0; i < len; i++) {
-			char c = line.charAt(i);
-			//whitespace, colon, or equals characters represent key separators
-			if (Character.isWhitespace(c) || c == ':' || c == '=')
-				break;
-			key.append(c);
-		}
-		return key.toString();
-	}
-
-	/**
-	 * Returns whether the property value on this line will be continued onto the next.
-	 */
-	private boolean isContinued(String line) {
-		//note that literal escaped slash characters at the end of a line are not
-		//treated as continuation markers.
-		boolean continuation = false;
-		for (int i = line.length() - 1; (i >= 0) && (line.charAt(i) == '\\'); i--)
-			continuation = !continuation;
-		return continuation;
-	}
-
-	/**
-	 * Returns whether the given line contains a key that needs to be converted.
-	 */
-	private boolean skipLine(String line) {
-		if (line.length() == 0)
-			return true;
-		char first = line.charAt(0);
-		return first == '#' || first == '!';
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/RemoveUnusedMessages.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/RemoveUnusedMessages.java
deleted file mode 100644
index ab3abe9..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/RemoveUnusedMessages.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.nls;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.core.filebuffers.*;
-import org.eclipse.core.filebuffers.ITextFileBuffer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jdt.core.*;
-import org.eclipse.jdt.core.dom.*;
-import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.internal.corext.refactoring.RefactoringScopeFactory;
-import org.eclipse.jdt.internal.corext.refactoring.RefactoringSearchEngine;
-import org.eclipse.jdt.internal.corext.refactoring.changes.CompilationUnitChange;
-import org.eclipse.jdt.internal.corext.refactoring.util.RefactoringASTParser;
-import org.eclipse.jdt.internal.corext.refactoring.util.RefactoringFileBuffers;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ltk.core.refactoring.*;
-
-/*
- * Class that removes field declarations which aren't referenced.
- */
-public class RemoveUnusedMessages extends Refactoring {
-
-	IType accessorClass;
-	IFile propertiesFile;
-	CompositeChange change;
-
-	public RemoveUnusedMessages(IType accessorClass, IFile propertiesFile) {
-		super();
-		this.accessorClass = accessorClass;
-		this.propertiesFile = propertiesFile;
-	}
-
-	public String getName() {
-		return "Fix NLS References";
-	}
-
-	public RefactoringStatus checkInitialConditions(IProgressMonitor monitor) {
-		return new RefactoringStatus();
-	}
-
-	public RefactoringStatus checkFinalConditions(IProgressMonitor monitor) throws CoreException, OperationCanceledException {
-		if (monitor == null)
-			monitor = new NullProgressMonitor();
-		change = new CompositeChange("Accessor Class Changes");
-		RefactoringStatus result = new RefactoringStatus();
-		ICompilationUnit unit = JavaCore.createCompilationUnitFrom((IFile) accessorClass.getResource());
-		CompilationUnit root = new RefactoringASTParser(AST.JLS3).parse(unit, true, null);
-		ASTRewrite rewriter = ASTRewrite.create(root.getAST());
-
-		// Search for references
-		IField[] fields = accessorClass.getFields();
-		ArrayList toDelete = new ArrayList();
-		// 10 units of work for modifying the properties file and AST
-		monitor.beginTask("Searching for references.", fields.length + 10);
-		try {
-			for (int i = 0; i < fields.length; i++) {
-				if (monitor.isCanceled())
-					throw new OperationCanceledException();
-				IField field = fields[i];
-				String fieldName = field.getElementName();
-				monitor.subTask("Searching for references to: " + fieldName);
-				int flags = field.getFlags();
-				// only want to look at the public static String fields
-				if (!(Flags.isPublic(flags) && Flags.isStatic(flags)))
-					continue;
-				// search for references
-				ICompilationUnit[] affectedUnits = RefactoringSearchEngine.findAffectedCompilationUnits(SearchPattern.createPattern(field, IJavaSearchConstants.REFERENCES), RefactoringScopeFactory.create(accessorClass), new SubProgressMonitor(monitor, 1), result);
-				// there are references so go to the next field
-				if (affectedUnits.length > 0)
-					continue;
-				System.out.println("Found unused field: " + fieldName);
-				toDelete.add(fieldName);
-			}
-			System.out.println("Analysis of " + fields.length + " messages found " + toDelete.size() + " unused messages");
-
-			// any work to do?
-			if (toDelete.isEmpty())
-				return result;
-
-			if (monitor.isCanceled())
-				throw new OperationCanceledException();
-
-			// remove the field and its corresponding entry in the messages.properties file
-			processAST(root, rewriter, toDelete);
-			monitor.worked(5);
-			processPropertiesFile(toDelete);
-			monitor.worked(5);
-
-			CompilationUnitChange cuChange = new CompilationUnitChange(unit.getElementName(), unit);
-			try {
-				ITextFileBuffer buffer = RefactoringFileBuffers.acquire(unit);
-				IDocument document = buffer.getDocument();
-				cuChange.setEdit(rewriter.rewriteAST(document, null));
-			} finally {
-				RefactoringFileBuffers.release(unit);
-			}
-			change.add(cuChange);
-
-		} finally {
-			monitor.done();
-		}
-
-		// return the result
-		return result;
-	}
-
-	private void processAST(final CompilationUnit root, final ASTRewrite rewriter, final List toDelete) {
-		ASTVisitor visitor = new ASTVisitor() {
-			public boolean visit(VariableDeclarationFragment node) {
-				// check to see if its in our list of fields to delete
-				if (!toDelete.contains(node.getName().toString()))
-					return true;
-				rewriter.remove(node.getParent(), null);
-				return true;
-			}
-		};
-		root.accept(visitor);
-	}
-
-	private void processPropertiesFile(List list) throws CoreException {
-		try {
-			ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager();
-			try {
-				manager.connect(propertiesFile.getFullPath(), null);
-				manager.connect(accessorClass.getCompilationUnit().getCorrespondingResource().getFullPath(), null);
-				change.add(new PropertyFileConverter().trim(propertiesFile, list));
-			} finally {
-				manager.disconnect(propertiesFile.getFullPath(), null);
-				manager.disconnect(accessorClass.getCompilationUnit().getCorrespondingResource().getFullPath(), null);
-			}
-		} catch (IOException e) {
-			throw new CoreException(new Status(IStatus.ERROR, NLSPlugin.PI_NLS, IStatus.ERROR, e.getMessage(), e));
-		}
-	}
-
-	public Change createChange(IProgressMonitor monitor) {
-		return change;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/RemoveUnusedMessagesAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/RemoveUnusedMessagesAction.java
deleted file mode 100644
index 700577a..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/nls/RemoveUnusedMessagesAction.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.nls;
-
-import java.lang.reflect.InvocationTargetException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.internal.ui.actions.WorkbenchRunnableAdapter;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ltk.core.refactoring.CheckConditionsOperation;
-import org.eclipse.ltk.core.refactoring.PerformRefactoringOperation;
-import org.eclipse.ui.*;
-
-public class RemoveUnusedMessagesAction implements IObjectActionDelegate {
-
-	private ICompilationUnit fAccessorUnit;
-	private IWorkbenchPart fPart;
-
-	public void setActivePart(IAction action, IWorkbenchPart part) {
-		fPart = part;
-	}
-
-	public void run(IAction action) {
-		if (fAccessorUnit == null)
-			return;
-		try {
-			final GotoResourceAction pAction = new GotoResourceAction(fPart);
-			IRunnableWithProgress runnable = new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) {
-					pAction.run();
-				}
-			};
-			PlatformUI.getWorkbench().getProgressService().run(false, false, runnable);
-			IFile propertiesFile = (IFile) pAction.getResource();
-			if (propertiesFile == null)
-				return;
-			RemoveUnusedMessages refactoring = new RemoveUnusedMessages(fAccessorUnit.getTypes()[0], propertiesFile);
-			PerformRefactoringOperation op = new PerformRefactoringOperation(refactoring, CheckConditionsOperation.ALL_CONDITIONS);
-			PlatformUI.getWorkbench().getProgressService().run(false, true, new WorkbenchRunnableAdapter(op));
-		} catch (CoreException e) {
-			throw new RuntimeException(e);
-		} catch (InterruptedException e) {
-			throw new RuntimeException(e);
-		} catch (InvocationTargetException e) {
-			throw new RuntimeException(e);
-		}
-
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		Object element = ((IStructuredSelection) selection).getFirstElement();
-		if (element instanceof ICompilationUnit) {
-			fAccessorUnit = (ICompilationUnit) element;
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsView.java
deleted file mode 100644
index 0cae472..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsView.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import org.eclipse.core.runtime.internal.stats.BundleStats;
-import org.eclipse.core.runtime.internal.stats.StatsManager;
-import org.eclipse.core.tools.CoreToolsPlugin;
-import org.eclipse.core.tools.TableWithTotalView;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * View used to display the activated plugins 
- */
-public class ActivePluginsView extends TableWithTotalView {
-	private Action refreshAction;
-	private Action displayClassesInfoAction;
-	private Action displayStackAction;
-
-	public static String VIEW_ID = ActivePluginsView.class.getName();
-	private static String columnHeaders[] = {"Plug-in", "Classes", "Alloc", "Used", "Startup time", "Order", "Timestamp", "Class load time", "Startup method time", "RAM Alloc", "RAM Used", "ROM Alloc", "ROM Used"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$
-	private static int columnWidths[] = {500, 150, 200, 200, 150, 100, 0, 0, 0, 0, 0, 0, 0};
-
-	protected String[] getColumnHeaders() {
-		return columnHeaders;
-	}
-
-	protected ColumnLayoutData[] getColumnLayout() {
-		ColumnLayoutData[] result = new ColumnLayoutData[columnWidths.length];
-		for (int i = 0; i < columnWidths.length; i++) {
-			int width = columnWidths[i];
-			result[i] = width == 0 ? (ColumnLayoutData) new ColumnPixelData(width) : (ColumnLayoutData) new ColumnWeightData(width);
-		}
-		return result;
-	}
-
-	protected void createToolbar() {
-		IActionBars actionBars = getViewSite().getActionBars();
-		IToolBarManager manager = actionBars.getToolBarManager();
-		manager.add(refreshAction);
-		manager.add(displayClassesInfoAction);
-		manager.add(displayStackAction);
-	}
-
-	protected void createContextMenu() {
-		// Create menu manager.
-		MenuManager manager = new MenuManager();
-		manager.setRemoveAllWhenShown(true);
-		manager.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager mgr) {
-				fillContextMenu(mgr);
-			}
-		});
-
-		// Create menu.
-		Menu menu = manager.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-
-		// Register menu for extension.
-		getSite().registerContextMenu(manager, viewer);
-	}
-
-	protected void fillContextMenu(IMenuManager manager) {
-		manager.add(refreshAction);
-		manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-		manager.add(new Separator());
-		manager.add(displayClassesInfoAction);
-		manager.add(displayStackAction);
-	}
-
-	protected String[] computeTotalLine(Iterator iterator) {
-		int sumOfClasses = 0;
-		int sumOfMemoryUsed = 0;
-		int sumOfMemoryAlloc = 0;
-		long sumOfStartupTime = 0;
-		long sumOfClassloadtime = 0;
-		int sumOfRAMAlloc = 0;
-		int sumOfRAMUsed = 0;
-		long sumOfStartupMethodTime = 0;
-		int sumOfROMAlloc = 0;
-		int sumOfROMUsed = 0;
-		int count = 0;
-		if (!iterator.hasNext()) {
-			Object[] elements = ((ITreeContentProvider) viewer.getContentProvider()).getElements(viewer.getInput());
-			iterator = Arrays.asList(elements).iterator();
-		}
-		for (; iterator.hasNext();) {
-			BundleStats element = (BundleStats) iterator.next();
-			if (element != null) {
-				VMClassloaderInfo vmInfo = VMClassloaderInfo.getClassloader(element.getSymbolicName());
-				sumOfClasses += element.getClassLoadCount();
-				sumOfMemoryUsed += (vmInfo.getUsedRAM() + vmInfo.getUsedROM());
-				sumOfMemoryAlloc += (vmInfo.getAllocRAM() + vmInfo.getAllocROM());
-				sumOfStartupTime = sumOfStartupTime + element.getStartupTime();
-				sumOfClassloadtime = sumOfClassloadtime + element.getClassLoadTime();
-				sumOfStartupMethodTime = sumOfStartupMethodTime + element.getStartupMethodTime();
-				sumOfRAMAlloc += vmInfo.getAllocRAM();
-				sumOfRAMUsed += vmInfo.getUsedRAM();
-				sumOfROMAlloc += vmInfo.getAllocROM();
-				sumOfROMUsed += vmInfo.getUsedROM();
-				count++;
-			}
-		}
-		String[] totalLine = new String[getColumnHeaders().length];
-		totalLine[0] = "Total: " + count; //$NON-NLS-1$
-		totalLine[1] = "" + sumOfClasses; //$NON-NLS-1$
-		totalLine[2] = "" + sumOfMemoryAlloc; //$NON-NLS-1$
-		totalLine[3] = "" + sumOfMemoryUsed; //$NON-NLS-1$
-		totalLine[4] = "" + sumOfStartupTime; //$NON-NLS-1$
-		totalLine[8] = "" + sumOfStartupMethodTime; //$NON-NLS-1$
-		totalLine[9] = "" + sumOfRAMAlloc; //$NON-NLS-1$
-		totalLine[10] = "" + sumOfRAMUsed; //$NON-NLS-1$
-		totalLine[11] = "" + sumOfROMAlloc; //$NON-NLS-1$
-		totalLine[12] = "" + sumOfROMUsed; //$NON-NLS-1$
-		return totalLine;
-	}
-
-	public void createPartControl(Composite parent) {
-		if (!StatsManager.MONITOR_ACTIVATION) {
-			Text text = new Text(parent, 0);
-			text.setText("Plug-in monitoring is not enabled"); //$NON-NLS-1$
-			return;
-		}
-		super.createPartControl(parent);
-		viewer.setInput(BundleStats.class);
-		getSite().setSelectionProvider(viewer);
-		viewer.setSelection(StructuredSelection.EMPTY);
-	}
-
-	protected void createActions() {
-		refreshAction = new Action("Refresh") { //$NON-NLS-1$
-			public void run() {
-				VMClassloaderInfo.refreshInfos();
-				getViewer().refresh();
-			}
-		};
-		refreshAction.setImageDescriptor(CoreToolsPlugin.createImageDescriptor("refresh.gif")); //$NON-NLS-1$
-		refreshAction.setToolTipText("Refresh the data"); //$NON-NLS-1$
-		IActionBars actionBars = getViewSite().getActionBars();
-		actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), refreshAction);
-
-		displayClassesInfoAction = new Action("Classes") { //$NON-NLS-1$
-			public void run() {
-				try {
-					LoadedClassesView view = (LoadedClassesView) getSite().getPage().showView(LoadedClassesView.VIEW_ID);
-					IStructuredSelection selection = ((IStructuredSelection) getViewer().getSelection());
-					if (selection == null)
-						return;
-
-					view.setInput(selection.toArray());
-
-				} catch (PartInitException e) {
-					e.printStackTrace();
-				}
-			}
-		};
-		displayClassesInfoAction.setToolTipText("Display classes loaded by the selected plug-in"); //$NON-NLS-1$
-		displayClassesInfoAction.setImageDescriptor(CoreToolsPlugin.createImageDescriptor("classes.gif")); //$NON-NLS-1$
-
-		displayStackAction = new Action("Stack &Trace") { //$NON-NLS-1$
-			public void run() {
-				try {
-					StackTraceView view = (StackTraceView) getSite().getPage().showView(StackTraceView.VIEW_ID);
-					BundleStats info = (BundleStats) ((IStructuredSelection) getViewer().getSelection()).getFirstElement();
-					if (info == null)
-						return;
-					view.setInput(StatsManager.TRACE_FILENAME, info.getTraceStart(), info.getTraceEnd());
-				} catch (PartInitException e) {
-					e.printStackTrace();
-				}
-			}
-		};
-		displayStackAction.setToolTipText("Display the plug-in activation stack trace"); //$NON-NLS-1$
-		displayStackAction.setImageDescriptor(CoreToolsPlugin.createImageDescriptor("trace.gif")); //$NON-NLS-1$
-	}
-
-	protected ITreeContentProvider getContentProvider() {
-		return new ActivePluginsViewContentProvider();
-	}
-
-	protected ITableLabelProvider getLabelProvider() {
-		return new ActivePluginsViewLabelProvider();
-	}
-
-	protected ViewerSorter getSorter(int column) {
-		return new ActivePluginsViewSorter(column);
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#getStatusLineMessage(Object)
-	 */
-	protected String getStatusLineMessage(Object element) {
-		return ""; //$NON-NLS-1$
-	}
-
-	protected TableTreeViewer getViewer() {
-		return viewer;
-	}
-
-	public void dispose() {
-		// if there is no viewer then we were not monitoring so there
-		// is nothing to dispose.
-		if (viewer == null)
-			return;
-		refreshAction.setImageDescriptor(null);
-		displayClassesInfoAction.setImageDescriptor(null);
-		displayStackAction.setImageDescriptor(null);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsViewContentProvider.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsViewContentProvider.java
deleted file mode 100644
index 76512c6..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsViewContentProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.util.ArrayList;
-import org.eclipse.core.runtime.internal.stats.BundleStats;
-import org.eclipse.core.runtime.internal.stats.StatsManager;
-import org.eclipse.core.tools.IFlattable;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Content provider for the ActivePluginsView
- */
-public class ActivePluginsViewContentProvider implements ITreeContentProvider, IFlattable {
-	private boolean flat;
-
-	public void setFlat(boolean mode) {
-		flat = mode;
-	}
-
-	public void dispose() {
-		// do nothing
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		// do nothing
-	}
-
-	public Object[] getChildren(Object element) {
-		if (flat || !(element instanceof BundleStats))
-			return new Object[0];
-		if (element == null)
-			return null;
-		ArrayList stats = ((BundleStats) element).getBundlesActivated();
-		return stats.toArray(new Object[stats.size()]);
-	}
-
-	public Object getParent(Object element) {
-		if (flat || !(element instanceof BundleStats))
-			return null;
-		if (element == null)
-			return null;
-		return ((BundleStats) element).getActivatedBy().getSymbolicName();
-	}
-
-	public boolean hasChildren(Object element) {
-		if (flat || !(element instanceof BundleStats))
-			return false;
-		return element == null ? false : ((BundleStats) element).getBundlesActivated().size() > 0;
-	}
-
-	public Object[] getElements(Object inputElement) {
-		if (!StatsManager.MONITOR_ACTIVATION || inputElement != BundleStats.class)
-			return null;
-
-		BundleStats[] active = StatsManager.getDefault().getBundles();
-		ArrayList result = new ArrayList(active.length);
-		for (int i = 0; i < active.length; i++) {
-			if (flat || active[i].getActivatedBy() == null)
-				result.add(active[i]);
-		}
-		return result.toArray(new BundleStats[result.size()]);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsViewLabelProvider.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsViewLabelProvider.java
deleted file mode 100644
index 1e0fc38..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsViewLabelProvider.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import org.eclipse.core.runtime.internal.stats.BundleStats;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Label provider for the ActivePluginsView
- *
- */
-public class ActivePluginsViewLabelProvider extends LabelProvider implements ITableLabelProvider {
-
-	public void addListener(ILabelProviderListener listener) {
-		// do nothing
-	}
-
-	public void dispose() {
-		// do nothing
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		return false;
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-		// do nothing
-	}
-
-	public Image getColumnImage(Object element, int columnIndex) {
-		return null;
-	}
-
-	public String getColumnText(Object element, int columnIndex) {
-		if (!(element instanceof BundleStats))
-			return "not a plug-in"; //$NON-NLS-1$
-		BundleStats info = (BundleStats) element;
-		if (info == null)
-			return "no info for plug-in"; //$NON-NLS-1$
-		VMClassloaderInfo loaderInfo = VMClassloaderInfo.getClassloader(info.getSymbolicName());
-		switch (columnIndex) {
-			case 0 : /* id */
-				return info.getSymbolicName() + (info.isStartupBundle() ? "*" : ""); //$NON-NLS-1$ //$NON-NLS-2$
-			case 1 : /* class load count */
-				return "" + info.getClassLoadCount(); //$NON-NLS-1$
-			case 2 : /* Total Mem Alloc */
-				return "" + (loaderInfo.getAllocRAM() + loaderInfo.getAllocROM()); //$NON-NLS-1$
-			case 3 : /* Total Mem Used */
-				return "" + (loaderInfo.getUsedRAM() + loaderInfo.getUsedROM()); //$NON-NLS-1$
-			case 4 : /* startup time */
-				return "" + (info.getStartupTime()); //$NON-NLS-1$
-			case 5 : /* activation order */
-				return "" + info.getActivationOrder(); //$NON-NLS-1$
-			case 6 : /* activation time */
-				return "" + (int) (info.getTimestamp()); //$NON-NLS-1$
-			case 7 : /* class load time*/
-				return "" + (int) (info.getClassLoadTime()); //$NON-NLS-1$
-			case 8 : /* startup method time */
-				return "" + (int) (info.getStartupMethodTime()); //$NON-NLS-1$
-			case 9 : /* RAM alloc */
-				return "" + loaderInfo.getAllocRAM(); //$NON-NLS-1$
-			case 10 : /* RAM used */
-				return "" + loaderInfo.getUsedRAM(); //$NON-NLS-1$
-			case 11 : /* ROM alloc */
-				return "" + loaderInfo.getAllocROM(); //$NON-NLS-1$
-			case 12 : /* ROM used */
-				return "" + loaderInfo.getUsedROM(); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsViewSorter.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsViewSorter.java
deleted file mode 100644
index 0b1f48c..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ActivePluginsViewSorter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.text.Collator;
-import org.eclipse.core.runtime.internal.stats.BundleStats;
-import org.eclipse.core.tools.ISorter;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-/**
- * Sorter used in the ActivePluginsView
- */
-public class ActivePluginsViewSorter extends ViewerSorter implements ISorter {
-	private boolean reversed = true;
-	private int columnNumber;
-	private Collator collator = Collator.getInstance();
-
-	// column headings: "Plug-in", "Classes", "Alloc", "Used", "Startup time", "Order", "Timestamp", "Class load time", "Startup method time", "RAM Alloc", "RAM Used", "ROM Alloc", "ROM Used" };
-	private int[][] SORT_ORDERS_BY_COLUMN = { //
-	{0}, /* Plugin */{1, 0}, /* Count */{2, 0}, /* Alloc */{3, 0}, /* Used */{4, 0}, /* Startup time */{5, 0}, /* Order */{6, 0}, /* timestamp */{7, 0}, /* Class load time */{8, 0}, /* Startup method time */{9, 0}, /* RAM Alloc */{10, 0}, /* RAM Used */{11, 0}, /*	ROM Alloc */{12, 0} /* ROM Used */
-	};
-
-	public ActivePluginsViewSorter(int columnNumber) {
-		this.columnNumber = columnNumber;
-		if (columnNumber == 0)
-			reversed = false;
-	}
-
-	/**
-	 * Compares two stats objects, sorting first by the main column of this sorter,
-	 * then by subsequent columns, depending on the column sort order.
-	 */
-	public int compare(Viewer viewer, Object o1, Object o2) {
-		BundleStats info1 = (BundleStats) o1;
-		BundleStats info2 = (BundleStats) o2;
-		int[] columnSortOrder = SORT_ORDERS_BY_COLUMN[columnNumber];
-		int result = 0;
-		for (int i = 0; i < columnSortOrder.length; ++i) {
-			result = compareColumnValue(columnSortOrder[i], info1, info2);
-			if (result != 0)
-				break;
-		}
-		return reversed ? -result : result;
-	}
-
-	/**
-	 * Compares two markers, based only on the value of the specified column.
-	 */
-	int compareColumnValue(int column, BundleStats info1, BundleStats info2) {
-		VMClassloaderInfo loaderInfo1 = VMClassloaderInfo.getClassloader(info1.getSymbolicName());
-		VMClassloaderInfo loaderInfo2 = VMClassloaderInfo.getClassloader(info2.getSymbolicName());
-		switch (column) {
-			case 0 : /* id */
-				return collator.compare(info1.getSymbolicName(), info2.getSymbolicName());
-			case 1 : /* Number Of classes loaded */
-				return info1.getClassLoadCount() - info2.getClassLoadCount();
-			case 2 : /* Total Mem Alloc */
-				return (loaderInfo1.getAllocRAM() + loaderInfo1.getAllocROM()) - (loaderInfo2.getAllocRAM() + loaderInfo2.getAllocROM());
-			case 3 : /* Total Mem Used */
-				return (loaderInfo1.getUsedRAM() + loaderInfo1.getUsedROM()) - (loaderInfo2.getUsedRAM() + loaderInfo2.getUsedROM());
-			case 4 : /* startup time */
-				return (int) (info1.getStartupTime() - info2.getStartupTime());
-			case 5 : /* actionvation order */
-				return info1.getActivationOrder() - info2.getActivationOrder();
-			case 6 : /* Activation time */
-				return (int) (info1.getTimestamp() - info2.getTimestamp());
-			case 7 : /* Class load time */
-				return (int) (info1.getClassLoadTime() - info2.getClassLoadTime());
-			case 8 : /* Startup method time */
-				return (int) (info1.getStartupMethodTime() - info2.getStartupMethodTime());
-			case 9 : /* RAM Alloc */
-				return loaderInfo1.getAllocRAM() - loaderInfo2.getAllocRAM();
-			case 10 : /* RAM Alloc */
-				return loaderInfo1.getUsedRAM() - loaderInfo2.getUsedRAM();
-			case 11 :
-				return loaderInfo1.getAllocROM() - loaderInfo2.getAllocROM();
-			case 12 :
-				return loaderInfo1.getUsedROM() - loaderInfo2.getUsedROM();
-		}
-		return 0;
-	}
-
-	public int getColumnNumber() {
-		return columnNumber;
-	}
-
-	public boolean isReversed() {
-		return reversed;
-	}
-
-	public void setReversed(boolean value) {
-		reversed = value;
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.ISorter#states()
-	 */
-	public int states() {
-		return 3;
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ContentTypePropertySource.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ContentTypePropertySource.java
deleted file mode 100644
index 44b7380..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ContentTypePropertySource.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2003, 2004 Geoff Longman and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * Geoff Longman - Initial API and implementation
- * IBM - Tightening integration with existing Platform
- **********************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.ui.views.properties.*;
-
-/**
- * A read-only IPropertySource for Marker attributes.
- */
-public class ContentTypePropertySource implements IPropertySource, IAdaptable {
-	final static IPropertyDescriptor UNIQUE_ID = new TextPropertyDescriptor("id", "Unique ID");
-	final static IPropertyDescriptor NAME = new TextPropertyDescriptor("name", "Name");
-	final static IPropertyDescriptor PARENT_ID = new TextPropertyDescriptor("parent", "Parent ID");
-	final static IPropertyDescriptor FILE_NAMES = new TextPropertyDescriptor("file-names", "Associated file names");
-	final static IPropertyDescriptor FILE_EXTENSIONS = new TextPropertyDescriptor("file-extensions", "Associated file extensions");
-	final static IPropertyDescriptor DEFAULT_CHARSET = new TextPropertyDescriptor("charset", "Default charset");
-
-	final static IPropertyDescriptor[] PROPERTY_DESCRIPTORS = {UNIQUE_ID, NAME, PARENT_ID, FILE_NAMES, FILE_EXTENSIONS, DEFAULT_CHARSET};
-
-	protected IContentType type;
-
-	public ContentTypePropertySource(IContentType type) {
-		this.type = type;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
-	 */
-	public Object getEditableValue() {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
-	 */
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		return PROPERTY_DESCRIPTORS;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(Object)
-	 */
-	public Object getPropertyValue(Object id) {
-		if (id.equals(UNIQUE_ID.getId()))
-			return type.getId();
-		if (id.equals(NAME.getId()))
-			return type.getName();
-		if (id.equals(PARENT_ID.getId())) {
-			IContentType baseType = type.getBaseType();
-			return baseType == null ? null : baseType.getId();
-		}
-		if (id.equals(FILE_NAMES.getId()))
-			return toString(type.getFileSpecs(IContentType.FILE_NAME_SPEC));
-		if (id.equals(FILE_EXTENSIONS.getId()))
-			return toString(type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC));
-		if (id.equals(DEFAULT_CHARSET.getId()))
-			return type.getDefaultCharset();
-		return null;
-	}
-
-	private Object toString(String[] fileNames) {
-		if (fileNames.length == 0)
-			return ""; //$NON-NLS-1$
-		StringBuffer result = new StringBuffer();
-		for (int i = 0; i < fileNames.length; i++) {
-			result.append(fileNames[i]);
-			result.append(',');
-		}
-		result.deleteCharAt(result.length() - 1);
-		return result.toString();
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(Object)
-	 */
-	public boolean isPropertySet(Object id) {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(Object)
-	 */
-	public void resetPropertyValue(Object id) {
-		// do nothing
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(Object, Object)
-	 */
-	public void setPropertyValue(Object id, Object value) {
-		// do nothing
-	}
-
-	public boolean equals(Object obj) {
-		if (!(obj instanceof ContentTypePropertySource))
-			return false;
-		return type.getId().equals(((ContentTypePropertySource) obj).type.getId());
-	}
-
-	public int hashCode() {
-		return type.getId().hashCode();
-	}
-
-	public String toString() {
-		return type.getId();
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (adapter == IPropertySource.class)
-			return this;
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ContentTypeView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ContentTypeView.java
deleted file mode 100644
index 5e75988..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/ContentTypeView.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.tools.runtime;
-
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.core.internal.content.ContentTypeManager;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.tools.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Content type Spy view. This view shows detailed information about the currently 
- * the content type registry . 
- * 
- */
-public class ContentTypeView extends SpyView implements IAdaptable {
-
-	private static class ContentTypeContentProvider extends AbstractTreeContentProvider {
-
-		public ContentTypeContentProvider() {
-			super(true);
-		}
-
-		protected boolean acceptInput(Object input) {
-			return true;
-		}
-
-		private TreeContentProviderNode addContentType(IContentType type, Set visited) {
-			ContentTypePropertySource wrapped = new ContentTypePropertySource(type);
-			if (!visited.add(wrapped))
-				return getNodeFor(wrapped);
-			IContentType base = type.getBaseType();
-			TreeContentProviderNode newNode = createNode(null, wrapped);
-			if (base == null) {
-				getRootNode().addChild(newNode);
-				return newNode;
-			}
-			TreeContentProviderNode baseTypeNode = addContentType(base, visited);
-			baseTypeNode.addChild(newNode);
-			return newNode;
-		}
-
-		private TreeContentProviderNode getNodeFor(Object type) {
-			return getRootNode().findNode(type);
-		}
-
-		protected void rebuild(Viewer viewer, Object input) {
-			IContentType[] allTypes = ContentTypeManager.getInstance().getAllContentTypes();
-			Set visited = new HashSet(allTypes.length);
-			for (int i = 0; i < allTypes.length; i++)
-				addContentType(allTypes[i], visited);
-		}
-	}
-
-	/** JFace's tree component used to present resource details. */
-	private AbstractTreeViewer viewer;
-
-	public void createPartControl(Composite parent) {
-		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		viewer.setContentProvider(new ContentTypeContentProvider());
-		viewer.setInput(""); //$NON-NLS-1$
-		getSite().setSelectionProvider(viewer);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/EclipsePreferencesView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/EclipsePreferencesView.java
deleted file mode 100644
index ce178e7..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/EclipsePreferencesView.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.util.ArrayList;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.tools.CollapseAllAction;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.*;
-import org.eclipse.ui.part.ViewPart;
-import org.osgi.service.prefs.BackingStoreException;
-
-public class EclipsePreferencesView extends ViewPart {
-
-	private TreeViewer viewer;
-	private IAction collapseAllAction;
-
-	class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {
-
-		private IEclipsePreferences invisibleRoot;
-
-		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-			// do nothing
-		}
-
-		public Object[] getElements(Object parent) {
-			if (parent.equals(getViewSite())) {
-				if (invisibleRoot == null)
-					invisibleRoot = Platform.getPreferencesService().getRootNode();
-				return new Object[] {invisibleRoot};
-			}
-			return getChildren(parent);
-		}
-
-		public void dispose() {
-			// do nothing
-		}
-
-		public Object getParent(Object child) {
-			if (child instanceof IEclipsePreferences)
-				return ((IEclipsePreferences) child).parent();
-			return null;
-		}
-
-		public Object[] getChildren(Object parent) {
-			ArrayList result = new ArrayList();
-			if (parent instanceof IEclipsePreferences) {
-				IEclipsePreferences node = (IEclipsePreferences) parent;
-				try {
-					String[] childrenNames = node.childrenNames();
-					for (int i = 0; childrenNames != null && i < childrenNames.length; i++)
-						result.add(node.node(childrenNames[i]));
-					String[] keys = node.keys();
-					for (int i = 0; i < keys.length; i++)
-						result.add(keys[i] + '=' + node.get(keys[i], "")); //$NON-NLS-1$
-				} catch (BackingStoreException e) {
-					e.printStackTrace();
-				}
-			}
-			return result.toArray(new Object[result.size()]);
-		}
-
-		public boolean hasChildren(Object parent) {
-			if (parent instanceof IEclipsePreferences)
-				try {
-					IEclipsePreferences node = (IEclipsePreferences) parent;
-					return node.childrenNames().length != 0 || node.keys().length != 0;
-				} catch (BackingStoreException e) {
-					e.printStackTrace();
-				}
-			return false;
-		}
-	}
-
-	class ViewLabelProvider extends LabelProvider {
-
-		public String getText(Object obj) {
-			String result = obj.toString();
-			if (obj instanceof IEclipsePreferences) {
-				IEclipsePreferences node = (IEclipsePreferences) obj;
-				result = node.name();
-				if (result.length() == 0)
-					result = "<root>"; //$NON-NLS-1$
-			}
-			return result;
-		}
-
-		public Image getImage(Object obj) {
-			String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
-			if (obj instanceof IEclipsePreferences)
-				imageKey = ISharedImages.IMG_OBJ_FOLDER;
-			return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
-		}
-	}
-
-	public EclipsePreferencesView() {
-		super();
-	}
-
-	public void createPartControl(Composite parent) {
-		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		viewer.setContentProvider(new ViewContentProvider());
-		viewer.setLabelProvider(new ViewLabelProvider());
-		viewer.setSorter(new ViewerSorter());
-		viewer.setInput(getViewSite());
-		getViewSite().setSelectionProvider(viewer);
-		IActionBars bars = getViewSite().getActionBars();
-		collapseAllAction = new CollapseAllAction(viewer);
-		bars.getToolBarManager().add(collapseAllAction);
-		bars.updateActionBars();
-	}
-
-	public void dispose() {
-		super.dispose();
-		collapseAllAction = null;
-	}
-
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/EventsSorter.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/EventsSorter.java
deleted file mode 100644
index 510129d..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/EventsSorter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of 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.tools.runtime;
-
-import java.text.Collator;
-import java.util.Arrays;
-import java.util.Comparator;
-import org.eclipse.core.runtime.PerformanceStats;
-import org.eclipse.core.tools.ISorter;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-public class EventsSorter extends ViewerSorter implements ISorter {
-	protected boolean reversed = false;
-	protected int columnNumber;
-
-	protected int[][] SORT_ORDERS_BY_COLUMN = {
-			// Event
-			{EventsView.COLUMN_EVENT, EventsView.COLUMN_BLAME, EventsView.COLUMN_CONTEXT},
-			// Blame
-			{EventsView.COLUMN_BLAME, EventsView.COLUMN_EVENT, EventsView.COLUMN_CONTEXT},
-			// Context
-			{EventsView.COLUMN_CONTEXT, EventsView.COLUMN_EVENT, EventsView.COLUMN_BLAME},
-			// Count
-			{EventsView.COLUMN_COUNT, EventsView.COLUMN_EVENT, EventsView.COLUMN_BLAME, EventsView.COLUMN_CONTEXT},
-			// Time
-			{EventsView.COLUMN_TIME, EventsView.COLUMN_EVENT, EventsView.COLUMN_BLAME, EventsView.COLUMN_CONTEXT}};
-
-	public EventsSorter(int columnNumber) {
-		this.columnNumber = columnNumber;
-	}
-
-	/**
-	 * Returns the number of the column by which this is sorting.
-	 */
-	public int getColumnNumber() {
-		return columnNumber;
-	}
-
-	/**
-	 * Returns true for descending, or false for ascending sorting order.
-	 */
-	public boolean isReversed() {
-		return reversed;
-	}
-
-	/**
-	 * Sets the sorting order.
-	 */
-	public void setReversed(boolean newReversed) {
-		reversed = newReversed;
-	}
-
-	/*
-	 * Overrides method from ViewerSorter
-	 */
-	public void sort(final Viewer viewer, Object[] elements) {
-		Comparator comparator = new Comparator() {
-			Collator c = Collator.getInstance();
-
-			/**
-			 * Compares two stats objects, sorting first by the main column of this sorter,
-			 * then by subsequent columns, depending on the column sort order.
-			 */
-			public int compare(Object o1, Object o2) {
-				PerformanceStats s1 = (PerformanceStats) o1;
-				PerformanceStats s2 = (PerformanceStats) o2;
-				//always sort failures above non-failures
-				if (s1.isFailure() && !s2.isFailure())
-					return -1;
-				if (s2.isFailure() && !s1.isFailure())
-					return 1;
-				int[] columnSortOrder = SORT_ORDERS_BY_COLUMN[columnNumber];
-				int result = 0;
-				for (int i = 0; i < columnSortOrder.length; ++i) {
-					result = compareColumnValue(columnSortOrder[i], s1, s2);
-					if (result != 0)
-						break;
-				}
-				if (reversed)
-					result = -result;
-				return result;
-			}
-
-			/**
-			 * Compares two markers, based only on the value of the specified column.
-			 */
-			int compareColumnValue(int column, PerformanceStats s1, PerformanceStats s2) {
-				switch (column) {
-					case EventsView.COLUMN_EVENT:
-						return c.compare(s1.getEvent(), s2.getEvent());
-					case EventsView.COLUMN_BLAME:
-						return c.compare(s1.getBlameString(), s2.getBlameString());
-					case EventsView.COLUMN_CONTEXT:
-						String name1 = s1.getContext() == null ? "" : s1.getContext(); //$NON-NLS-1$
-						String name2 = s2.getContext() == null ? "" : s2.getContext(); //$NON-NLS-1$
-						return c.compare(name1, name2);
-					case EventsView.COLUMN_COUNT:
-						return s2.getRunCount() - s1.getRunCount();
-					case EventsView.COLUMN_TIME:
-						return (int)(s2.getRunningTime() - s1.getRunningTime());
-				}
-				return 0;
-			}
-		};
-		Arrays.sort(elements, comparator);
-	}
-
-	public int states() {
-		return 2;
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/EventsView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/EventsView.java
deleted file mode 100644
index c3928a9..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/EventsView.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of 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.tools.runtime;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import org.eclipse.core.runtime.PerformanceStats;
-import org.eclipse.core.tools.*;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.WorkbenchPart;
-
-/**
- * Stats View
- * 
- * This spy utility will display globally available statistical
- * information on various plug-ins.  The statistics available are those that
- * are available through the PluginStats class of
- * org.eclipse.core.resource/src/org/eclipse/core/internal/utils
- * 
- * Currently available information includes:
- * 	the id of the statistic 
- * 	the number of notification this plug-in received
- * 	the amount of time spent receiving these notifications
- * 	the number of build requests on this plug-in
- * 	the amount of time spent building this plug-in
- * 
- * Build statistics will only be displayed if the tracing/debug option
- * "build/invoking" in the plug-in org.eclipse.core.resources is set to 
- * true.
- */
-
-public class EventsView extends TableWithTotalView {
-	class EventsViewContentProvider implements ITreeContentProvider {
-		/**
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			// do nothing
-		}
-
-		/** @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */
-		public Object[] getChildren(Object parentElement) {
-			return new Object[0];
-		}
-
-		/** @see IStructuredContentProvider#getElements(Object) */
-		public Object[] getElements(Object input) {
-			return PerformanceStats.getAllStats();
-		}
-
-		/** @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 false;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) {
-			// do nothing
-		}
-	}
-
-	/**
-	 * Class to display the labels for the stats view table.
-	 */
-	class EventsViewLabelProvider extends LabelProvider implements ITableLabelProvider, IColorProvider {
-
-		/**
-		 * @see ITableLabelProvider#getColumnImage(Object, int)
-		 */
-		public Image getColumnImage(Object arg0, int arg1) {
-			return null;
-		}
-
-		/**
-		 * @see ITableLabelProvider#getColumnText(Object, int)
-		 */
-		public String getColumnText(Object element, int columnIndex) {
-			if (!(element instanceof PerformanceStats)) {
-				return Messages.stats_badStat;
-			}
-			PerformanceStats stats = (PerformanceStats) element;
-			switch (columnIndex) {
-				case COLUMN_EVENT :
-					return stats.getEvent();
-				case COLUMN_BLAME :
-					return stats.getBlameString();
-				case COLUMN_CONTEXT :
-					return stats.getContext(); //$NON-NLS-1$
-				case COLUMN_COUNT :
-					return Integer.toString(stats.getRunCount());
-				case COLUMN_TIME :
-					return Long.toString(stats.getRunningTime());
-			}
-			return Messages.stats_badColumn;
-		}
-
-		public Color getForeground(Object element) {
-			if (!(element instanceof PerformanceStats)) {
-				return null;
-			}
-			PerformanceStats stats = (PerformanceStats) element;
-			if (stats.isFailure())
-				return Display.getDefault().getSystemColor(SWT.COLOR_RED);
-			return null;
-		}
-
-		public Color getBackground(Object element) {
-			return null;
-		}
-	}
-	
-	class StatsListener extends PerformanceStats.PerformanceListener {
-		private void asyncExec(Runnable runnable) {
-			final Control control = viewer.getControl();
-			if (control == null || control.isDisposed())
-				return;
-			final Display display = control.getDisplay();
-			if (display.isDisposed())
-				return;
-			display.asyncExec(runnable);
-		}
-		/**
-		 * @see PerformanceStats.PerformanceListener#eventsOccurred(PerformanceStats[])
-		 */
-		public void eventsOccurred(final PerformanceStats[] event) {
-			asyncExec(new Runnable() {
-				public void run() {
-					if (!getViewer().getControl().isDisposed())
-						getViewer().refresh();
-				}
-			});
-		}
-		public void eventFailed(final PerformanceStats event, final long duration) {
-			asyncExec(new Runnable() {
-				public void run() {
-					String msg = "Performance event failure: " + event.getEvent() + " blame: " + event.getBlameString() + " context: " + event.getContext()+ " duration: " + duration; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-					getViewSite().getActionBars().getStatusLineManager().setErrorMessage(msg);
-//					MessageDialog.openError(getSite().getShell(), "Performance failure", msg);
-				}
-			});
-		}
-	}
-
-	// Table of Column Indices
-	public final static int COLUMN_EVENT = 0;
-	public final static int COLUMN_BLAME = 1;
-	public final static int COLUMN_CONTEXT = 2;
-	public final static int COLUMN_COUNT = 3;
-	public final static int COLUMN_TIME = 4;
-
-	private String columnHeaders[] = {
-			Messages.stats_eventHeader, //
-			Messages.stats_blameHeader, //
-			Messages.stats_contextHeader, //
-			Messages.stats_countHeader, //
-			Messages.stats_timeHeader, //
-	};
-	private ColumnLayoutData columnLayouts[] = {
-			new ColumnWeightData(80), // event
-			new ColumnWeightData(180), // blame
-			new ColumnWeightData(40), // context
-			new ColumnPixelData(65), // count 
-			new ColumnPixelData(65)}; // total time
-	private CopyStructuredSelectionAction copyAction;
-	private Action resetAction;
-	private final StatsListener statsListener = new StatsListener();
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#computeTotalLine(java.util.Iterator)
-	 */
-	protected String[] computeTotalLine(Iterator iter) {
-		String[] totals = new String[getColumnHeaders().length];
-		int count = 0;
-		int events = 0;
-		int time = 0;
-		if (!iter.hasNext()) {
-			Object[] elements = ((ITreeContentProvider) viewer.getContentProvider()).getElements(viewer.getInput());
-			iter = Arrays.asList(elements == null ? new Object[0] : elements).iterator();
-		}
-		while (iter.hasNext()) {
-			PerformanceStats element = (PerformanceStats) iter.next();
-			events += element.getRunCount();
-			time += element.getRunningTime();
-			count++;
-		}
-		totals[0] = "Total: " + count; //$NON-NLS-1$
-		totals[2] = "" + events; //$NON-NLS-1$
-		totals[3] = "" + time; //$NON-NLS-1$
-		return totals;
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#createActions()
-	 */
-	protected void createActions() {
-		resetAction = new Action("Reset") { //$NON-NLS-1$
-			public void run() {
-				PerformanceStats.clear();
-				getViewer().setInput("");
-				updateTotals();
-			}
-		};
-		resetAction.setToolTipText("Reset all event statistics"); //$NON-NLS-1$
-		resetAction.setImageDescriptor(CoreToolsPlugin.createImageDescriptor("clear.gif")); //$NON-NLS-1$
-		// Add copy selection action
-
-		IActionBars bars = getViewSite().getActionBars();
-		copyAction = new CopyStructuredSelectionAction(new TableSelectionProviderDecorator(viewer));
-		copyAction.registerAsGlobalAction(bars);
-		bars.updateActionBars();
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#createContextMenu()
-	 */
-	protected void createContextMenu() {
-		// creates a context menu with actions and adds it to the viewer control
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.add(resetAction);
-		menuMgr.add(copyAction);
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-	}
-
-	/**
-	 * @see IWorkbenchPart#createPartControl
-	 */
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		PerformanceStats.addListener(statsListener);
-		viewer.setInput(""); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#createToolbar()
-	 */
-	protected void createToolbar() {
-		IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
-		mgr.add(resetAction);
-	}
-
-	/**
-	 * @see WorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		PerformanceStats.removeListener(statsListener);
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#getColumnHeaders()
-	 */
-	protected String[] getColumnHeaders() {
-		return columnHeaders;
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#getColumnLayout()
-	 */
-	protected ColumnLayoutData[] getColumnLayout() {
-		return columnLayouts;
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#getContentProvider()
-	 */
-	protected ITreeContentProvider getContentProvider() {
-		return new EventsViewContentProvider();
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#getLabelProvider()
-	 */
-	protected ITableLabelProvider getLabelProvider() {
-		return new EventsViewLabelProvider();
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#getSorter(int)
-	 */
-	protected ViewerSorter getSorter(int column) {
-		return new EventsSorter(column);
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#getStatusLineMessage(Object)
-	 */
-	protected String getStatusLineMessage(Object element) {
-		if (!(element instanceof PerformanceStats))
-			return ""; //$NON-NLS-1$
-		return  ((PerformanceStats) element).getBlameString();
-	}
-
-	protected TableTreeViewer getViewer() {
-		return viewer;
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesView.java
deleted file mode 100644
index 9bd84f3..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesView.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import org.eclipse.core.runtime.internal.stats.ClassStats;
-import org.eclipse.core.runtime.internal.stats.StatsManager;
-import org.eclipse.core.tools.CoreToolsPlugin;
-import org.eclipse.core.tools.TableWithTotalView;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PartInitException;
-
-/**
- * View that display information about classes
- */
-public class LoadedClassesView extends TableWithTotalView {
-	private Action displayStackAction;
-
-	public static String VIEW_ID = LoadedClassesView.class.getName();
-	private String[] columnHeaders = new String[] {"Class", "Order", "Memory", "Plug-in", "Timestamp", "RAM", "ROM"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
-	private ColumnLayoutData[] columnLayout = new ColumnLayoutData[] {new ColumnWeightData(500), new ColumnWeightData(100), new ColumnWeightData(100), new ColumnWeightData(200), new ColumnPixelData(0), new ColumnPixelData(0), new ColumnPixelData(0)};
-
-	protected String[] getColumnHeaders() {
-		return columnHeaders;
-	}
-
-	protected ColumnLayoutData[] getColumnLayout() {
-		return columnLayout;
-	}
-
-	public void createPartControl(Composite parent) {
-		if (!StatsManager.MONITOR_CLASSES) {
-			Text text = new Text(parent, 0);
-			text.setText("Class monitoring is not enabled."); //$NON-NLS-1$
-			return;
-		}
-		super.createPartControl(parent);
-		viewer.setSelection(StructuredSelection.EMPTY);
-	}
-
-	protected ITreeContentProvider getContentProvider() {
-		return new LoadedClassesViewContentProvider();
-	}
-
-	protected ITableLabelProvider getLabelProvider() {
-		return new LoadedClassesViewLabelProvider();
-	}
-
-	protected ViewerSorter getSorter(int column) {
-		return new LoadedClassesViewSorter(column);
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.TableWithTotalView#getStatusLineMessage(Object)
-	 */
-	protected String getStatusLineMessage(Object element) {
-		return ""; //$NON-NLS-1$
-	}
-
-	protected TableTreeViewer getViewer() {
-		return viewer;
-	}
-
-	protected void createActions() {
-		displayStackAction = new Action("Stack &Trace") { //$NON-NLS-1$
-			public void run() {
-				try {
-					StackTraceView view = (StackTraceView) getSite().getPage().showView(StackTraceView.VIEW_ID);
-					ClassStats clazz = (ClassStats) ((IStructuredSelection) getViewer().getSelection()).getFirstElement();
-					if (clazz == null)
-						return;
-					view.setInput(StatsManager.TRACE_FILENAME, clazz.getTraceStart(), clazz.getTraceEnd());
-				} catch (PartInitException e) {
-					e.printStackTrace();
-				}
-			}
-		};
-		displayStackAction.setToolTipText("Display the class activation stack trace"); //$NON-NLS-1$
-		displayStackAction.setImageDescriptor(CoreToolsPlugin.createImageDescriptor("trace.gif")); //$NON-NLS-1$
-	}
-
-	protected void createToolbar() {
-		IToolBarManager manager = getViewSite().getActionBars().getToolBarManager();
-		manager.add(displayStackAction);
-	}
-
-	public void setInput(Object input) {
-		viewer.setInput(input);
-		viewer.setSelection(StructuredSelection.EMPTY);
-	}
-
-	protected String[] computeTotalLine(Iterator iterator) {
-		String[] totals = new String[getColumnHeaders().length];
-		int ramTotal = 0;
-		int romTotal = 0;
-		int jitTotal = 0;
-		int count = 0;
-		if (!iterator.hasNext()) {
-			Object[] elements = ((ITreeContentProvider) viewer.getContentProvider()).getElements(viewer.getInput());
-			iterator = Arrays.asList(elements == null ? new Object[0] : elements).iterator();
-		}
-		while (iterator.hasNext()) {
-			ClassStats clazz = (ClassStats) iterator.next();
-			VMClassloaderInfo loader = VMClassloaderInfo.getClassloader(clazz.getClassloader().getId());
-			VMClassInfo classInfo = loader.getClass(clazz.getClassName());
-			ramTotal += classInfo.getRAMSize();
-			romTotal += classInfo.getROMSize();
-			jitTotal += classInfo.getJitSize();
-			count++;
-		}
-		totals[0] = "Total: " + count; //$NON-NLS-1$
-		totals[2] = Integer.toString(ramTotal + romTotal);
-		totals[5] = Integer.toString(ramTotal);
-		totals[6] = Integer.toString(romTotal);
-		return totals;
-	}
-
-	public void dispose() {
-		if (displayStackAction != null)
-			displayStackAction.setImageDescriptor(null);
-	}
-
-	protected void createContextMenu() {
-		MenuManager manager = new MenuManager();
-		manager.setRemoveAllWhenShown(true);
-		manager.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager mgr) {
-				fillContextMenu(mgr);
-			}
-		});
-		Menu menu = manager.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(manager, viewer);
-	}
-
-	protected void fillContextMenu(IMenuManager manager) {
-		manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-		manager.add(displayStackAction);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesViewContentProvider.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesViewContentProvider.java
deleted file mode 100644
index ab12e26..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesViewContentProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.util.*;
-import org.eclipse.core.runtime.internal.stats.*;
-import org.eclipse.core.tools.IFlattable;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Content provider for the LoadedClassesView
- */
-public class LoadedClassesViewContentProvider implements ITreeContentProvider, IFlattable {
-	private boolean flat;
-	private String inputNames[] = new String[0];
-
-	public void setFlat(boolean mode) {
-		flat = mode;
-	}
-
-	public Object[] getChildren(Object element) {
-		if (flat || !(element instanceof ClassStats))
-			return new Object[0];
-		ArrayList result = new ArrayList(10);
-		for (Iterator i = ((ClassStats) element).getLoadedClasses().iterator(); i.hasNext();) {
-			ClassStats child = (ClassStats) i.next();
-			if (filterChildren(child, inputNames))
-				result.add(child);
-		}
-		return result.toArray(new Object[result.size()]);
-	}
-
-	private boolean filterChildren(ClassStats element, String[] filters) {
-		String name = element.getClassloader().getId();
-		for (int i = 0; i < filters.length; i++)
-			if (filters[i].equals(name))
-				return true;
-		ArrayList children = element.getLoadedClasses();
-		for (Iterator i = children.iterator(); i.hasNext();)
-			if (filterChildren((ClassStats) i.next(), filters))
-				return true;
-		return false;
-	}
-
-	public Object getParent(Object element) {
-		if (flat || !(element instanceof ClassStats))
-			return null;
-		return ((ClassStats) element).getLoadedBy();
-	}
-
-	public boolean hasChildren(Object element) {
-		if (flat || !(element instanceof ClassStats))
-			return false;
-		for (Iterator i = ((ClassStats) element).getLoadedClasses().iterator(); i.hasNext();)
-			if (filterChildren((ClassStats) i.next(), inputNames))
-				return true;
-		return false;
-	}
-
-	public Object[] getElements(Object inputElement) {
-		if (!StatsManager.MONITOR_CLASSES)
-			return null;
-		if (inputElement instanceof Object[]) {
-			Object[] elements = (Object[]) inputElement;
-			if (elements.length == 0 || !(elements[0] instanceof BundleStats))
-				return null;
-			Set result = new HashSet(51);
-			for (int i = 0; i < elements.length; i++) {
-				ClassStats[] classes = getClasses(((BundleStats) elements[i]).getSymbolicName());
-				result.addAll(Arrays.asList(classes));
-			}
-			return result.toArray(new Object[result.size()]);
-		}
-		return null;
-	}
-
-	private ClassStats[] getClasses(String id) {
-		ClassloaderStats loader = ClassloaderStats.getLoader(id);
-		if (loader == null)
-			return new ClassStats[0];
-		ClassStats[] classes = loader.getClasses();
-		if (flat)
-			return classes;
-		ArrayList result = new ArrayList();
-		for (int i = 0; i < classes.length; i++) {
-			ClassStats target = classes[i];
-			while (target.getLoadedBy() != null)
-				target = target.getLoadedBy();
-			result.add(target);
-		}
-		return (ClassStats[]) result.toArray(new ClassStats[result.size()]);
-	}
-
-	public void dispose() {
-		// do nothing
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (oldInput == newInput)
-			return;
-		if (newInput == null) {
-			inputNames = new String[0];
-			return;
-		}
-		Object[] list = (Object[]) newInput;
-		inputNames = new String[list.length];
-		for (int i = 0; i < list.length; i++)
-			inputNames[i] = ((BundleStats) list[i]).getSymbolicName();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesViewLabelProvider.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesViewLabelProvider.java
deleted file mode 100644
index 3625c64..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesViewLabelProvider.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import org.eclipse.core.runtime.internal.stats.ClassStats;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * LabelProvider for the LoadedClassesView
- */
-
-public class LoadedClassesViewLabelProvider extends LabelProvider implements ITableLabelProvider {
-
-	public Image getColumnImage(Object element, int columnIndex) {
-		return null;
-	}
-
-	public String getColumnText(Object element, int columnIndex) {
-		if (!(element instanceof ClassStats))
-			return "not a class info"; //$NON-NLS-1$
-		ClassStats clazz = (ClassStats) element;
-		VMClassloaderInfo loader = VMClassloaderInfo.getClassloader(clazz.getClassloader().getId());
-		VMClassInfo classInfo = loader.getClass(clazz.getClassName());
-
-		switch (columnIndex) {
-			case 0 : //"Class name"
-				return clazz.getClassName() + (clazz.isStartupClass() ? "*" : ""); //$NON-NLS-1$ //$NON-NLS-2$
-			case 1 : //		"Loading order",
-				return clazz.getLoadOrder() == -2 ? "<boot>" : "" + clazz.getLoadOrder(); //$NON-NLS-1$ //$NON-NLS-2$
-			case 2 : //		"Memory",
-				return classInfo == null ? "" : "" + (classInfo.getRAMSize() + classInfo.getROMSize()); //$NON-NLS-1$ //$NON-NLS-2$
-			case 3 : //		"Plug-in Id", 
-				return clazz.getClassloader().getId();
-			case 4 : //		"Activation time",
-				return "" + clazz.getTimestamp(); //$NON-NLS-1$
-			case 5 : //		"RAM",
-				return classInfo == null ? "" : "" + classInfo.getRAMSize(); //$NON-NLS-1$ //$NON-NLS-2$
-			case 6 : //		"ROM"
-				return classInfo == null ? "" : "" + classInfo.getROMSize(); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesViewSorter.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesViewSorter.java
deleted file mode 100644
index 8d87d3c..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/LoadedClassesViewSorter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.text.Collator;
-import org.eclipse.core.runtime.internal.stats.ClassStats;
-import org.eclipse.core.tools.ISorter;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-public class LoadedClassesViewSorter extends ViewerSorter implements ISorter {
-	private boolean reversed = true;
-	private int columnNumber;
-	private Collator collator = Collator.getInstance();
-
-	//	columnHeaders = new String[]{ "Class", "Order", "Memory", "Plug-in", "Timestamp", "RAM", "ROM" };
-	private int[][] SORT_ORDERS_BY_COLUMN = { //
-	{0, 3}, /* Class */{1, 0, 3}, /* Order */{2, 0, 3}, /* Memory*/{3, 0}, /* Plugin */{4, 0, 3}, /* Timestamp */{5, 0, 3}, /* RAM */{6, 0, 3}, /* ROM */
-	};
-
-	public LoadedClassesViewSorter(int columnNumber) {
-		this.columnNumber = columnNumber;
-		if (columnNumber == 0)
-			reversed = false;
-	}
-
-	/**
-	 * Compares two stats objects, sorting first by the main column of this sorter,
-	 * then by subsequent columns, depending on the column sort order.
-	 */
-	public int compare(Viewer viewer, Object o1, Object o2) {
-		ClassStats class1 = (ClassStats) o1;
-		ClassStats class2 = (ClassStats) o2;
-
-		int[] columnSortOrder;
-		columnSortOrder = SORT_ORDERS_BY_COLUMN[columnNumber];
-
-		int result = 0;
-		for (int i = 0; i < columnSortOrder.length; ++i) {
-			result = compareColumnValue(columnSortOrder[i], class1, class2);
-			if (result != 0)
-				break;
-		}
-		if (reversed)
-			result = -result;
-		return result;
-	}
-
-	/**
-	 * Compares two markers, based only on the value of the specified column.
-	 */
-	private int compareColumnValue(int column, ClassStats class1, ClassStats class2) {
-		VMClassloaderInfo loader = VMClassloaderInfo.getClassloader(class1.getClassloader().getId());
-		VMClassInfo classInfo1 = loader.getClass(class1.getClassName());
-		loader = VMClassloaderInfo.getClassloader(class2.getClassloader().getId());
-		VMClassInfo classInfo2 = loader.getClass(class2.getClassName());
-		switch (column) {
-			case 0 : { /* class name */
-				String package1 = getPackageName(class1.getClassName());
-				String package2 = getPackageName(class2.getClassName());
-				int result = collator.compare(package1, package2);
-				return result != 0 ? result : collator.compare(class1.getClassName(), class2.getClassName());
-			}
-			case 1 : /*Loading order */
-				return class1.getLoadOrder() - class2.getLoadOrder();
-			case 2 : /* Memory */
-				return (classInfo1.getRAMSize() + classInfo1.getROMSize()) - (classInfo2.getRAMSize() + classInfo2.getROMSize());
-			case 3 : /* Plugin Id */
-				return collator.compare(class1.getClassloader().getId(), class2.getClassloader().getId());
-			case 4 : /* Activation time */
-				return (int) (class1.getTimestamp() - class2.getTimestamp());
-			case 5 : /* RAM */
-				return classInfo1.getRAMSize() - classInfo2.getRAMSize();
-			case 6 : /* ROM */
-				return classInfo1.getROMSize() - classInfo2.getROMSize();
-		}
-		return 0;
-	}
-
-	private String getPackageName(String className) {
-		int index = className.lastIndexOf('.');
-		return index == -1 ? "" : className.substring(0, index); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the number of the column by which this is sorting.
-	 */
-	public int getColumnNumber() {
-		return columnNumber;
-	}
-
-	/**
-	 * Returns true for descending, or false for ascending sorting order.
-	 */
-	public boolean isReversed() {
-		return reversed;
-	}
-
-	/**
-	 * Sets the sorting order.
-	 */
-	public void setReversed(boolean value) {
-		reversed = value;
-	}
-
-	/**
-	 * @see org.eclipse.core.tools.ISorter#states()
-	 */
-	public int states() {
-		return 3;
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDataSheetView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDataSheetView.java
deleted file mode 100644
index 0dcc924..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDataSheetView.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.internal.stats.*;
-import org.eclipse.core.tools.BaseTextView;
-import org.eclipse.core.tools.DeepSize;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.osgi.framework.Bundle;
-
-/**
- * View displaying information about the resources for a given plugin
- *
- */
-public class PluginDataSheetView extends BaseTextView implements ISelectionListener {
-
-	/** The id by which this view is known in the plug-in registry */
-	public static final String VIEW_ID = PluginDataSheetView.class.getName();
-
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		getViewSite().getPage().addSelectionListener(this);
-	}
-
-	public void dispose() {
-		getViewSite().getPage().removeSelectionListener(this);
-	}
-
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			Object first = ((IStructuredSelection) selection).getFirstElement();
-			if (first != null && first instanceof BundleStats) {
-				viewer.getDocument().set(printStats((BundleStats) first));
-				viewer.refresh();
-			}
-		}
-	}
-
-	private String printStats(BundleStats descriptor) {
-		StringBuffer result = new StringBuffer(200);
-		ClassloaderStats classloader = ClassloaderStats.getLoader(descriptor.getSymbolicName());
-		printResourceBundleStats(result, classloader == null ? null : classloader.getBundles(), descriptor);
-		result.append('\n');
-		printExtensionLoadingStats(result, Platform.getExtensionRegistry().getExtensions(descriptor.getSymbolicName()));
-		return result.toString();
-	}
-
-	private void printExtensionLoadingStats(StringBuffer result, IExtension[] extensions) {
-		if (extensions.length == 0) {
-			result.append("No extensions contributed by this plug-in\n"); //$NON-NLS-1$
-			return;
-		}
-		result.append("Extension loading stats:\n"); //$NON-NLS-1$
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension extension = extensions[i];
-			result.append('\t');
-			result.append(extension.getExtensionPointUniqueIdentifier());
-			result.append(" <- "); //$NON-NLS-1$
-			result.append(extension.getUniqueIdentifier());
-			result.append('\n');
-		}
-	}
-
-	private void printResourceBundleStats(StringBuffer result, ArrayList bundles, BundleStats info) {
-		if (bundles == null || bundles.size() == 0) {
-			result.append("No resources loaded by this plug-in\n"); //$NON-NLS-1$
-			return;
-		}
-		result.append("Resource bundles stats:\n"); //$NON-NLS-1$
-		for (Iterator iterator = bundles.iterator(); iterator.hasNext();) {
-			ResourceBundleStats resource = (ResourceBundleStats) iterator.next();
-			result.append('\t');
-			result.append(resource.getFileName());
-			result.append("\tElements: #" + resource.getKeyCount()); //$NON-NLS-1$
-			long totalSize;
-			// if hashsize == 0, we should compute the total size using DeepSize
-			if (resource.getHashSize() == 0) {
-				DeepSize.reset();
-				DeepSize calculator = new DeepSize();
-				Bundle bundle = Platform.getBundle(info.getSymbolicName());
-				if (bundle != null)
-					calculator.deepSize(Platform.getResourceBundle(bundle));
-				totalSize = calculator.getSize();
-			} else
-				totalSize = resource.getTotalSize();
-			result.append(" \ttotal: " + totalSize); //$NON-NLS-1$
-			result.append("b \tkeys: " + resource.getKeySize()); //$NON-NLS-1$
-			result.append("b \tvalues: " + resource.getValueSize() + "b\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDependencyGraphNode.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDependencyGraphNode.java
deleted file mode 100644
index 324ff54..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDependencyGraphNode.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.util.*;
-import org.eclipse.core.tools.Messages;
-import org.eclipse.osgi.service.resolver.BundleDescription;
-import org.eclipse.osgi.util.NLS;
-
-/**
- *  This class is used to build up a dependency graph.  The full dependency
- *  graph is just a hash table containing PluginDependencyGraphNode's.  Each
- *  node represents one plug-in.  They are retrievable based on the plug-in
- *  id.  Each node has a list of all the plug-in ids for plug-ins that this
- *  plug-in requires (children) and another list of all the plug-in ids that
- *  require this particular plug-in (ancestors).
- */
-public class PluginDependencyGraphNode {
-
-	private BundleDescription descriptor = null;
-	private Set children = new HashSet();
-	private Set ancestors = new HashSet();
-
-	/**
-	 * Constructor for this class. Each node is associated with a plug-in so 
-	 * we accept the plug-in descriptor here and keep it around for later use.
-	 */
-	public PluginDependencyGraphNode(BundleDescription descriptor) {
-		this.descriptor = descriptor;
-	}
-
-	/**
-	 * Add the given node to this node's set of ancestors.
-	 */
-	public void addAncestor(PluginDependencyGraphNode ancestor) {
-		ancestors.add(ancestor);
-	}
-
-	/**
-	 * Add the given node to this node's set of children.
-	 */
-	public void addChild(PluginDependencyGraphNode child) {
-		children.add(child);
-	}
-
-	/**
-	 * Return the identifier for this node. It is the unique plug-in identifier
-	 * for this object's plug-in descriptor.
-	 * 
-	 * @return the plug-in id
-	 */
-	public String getId() {
-		return descriptor.getSymbolicName();
-	}
-
-	/**
-	 * Return a string representation of this object. It should be nicely formated
-	 * and include the list of children and ancestor nodes.
-	 */
-	public String toDeepString() {
-		StringBuffer buffer = new StringBuffer();
-
-		// write ID
-		writeln(buffer, 0, NLS.bind(Messages.stats_pluginid, descriptor.getSymbolicName()));
-
-		// write ancestors
-		if (ancestors.size() == 0) {
-			writeln(buffer, 1, Messages.depend_noParentPlugins);
-		} else {
-			writeln(buffer, 1, Messages.depend_requiredBy);
-			for (Iterator i = ancestors.iterator(); i.hasNext();) {
-				PluginDependencyGraphNode ancestor = (PluginDependencyGraphNode) i.next();
-				writeln(buffer, 2, ancestor.getId());
-			}
-		}
-
-		// write children
-		if (children.size() == 0) {
-			writeln(buffer, 1, Messages.depend_noChildrenPlugins);
-		} else {
-			writeln(buffer, 1, Messages.depend_requires);
-			for (Iterator i = children.iterator(); i.hasNext();) {
-				PluginDependencyGraphNode child = (PluginDependencyGraphNode) i.next();
-				writeln(buffer, 2, child.getId());
-			}
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * Ultility method to write a string and cr to the given buffer. Indent the
-	 * text the given number of tabs.
-	 */
-	private void writeln(StringBuffer buffer, int indent, String text) {
-		for (int i = 0; i < indent; i++)
-			buffer.append('\t');
-		buffer.append(text);
-		buffer.append('\n');
-	}
-
-	/**
-	 * @see java.lang.Object#equals(Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj == null)
-			return false;
-		if (!(obj instanceof PluginDependencyGraphNode))
-			return false;
-		PluginDependencyGraphNode other = (PluginDependencyGraphNode) obj;
-		return this.getId().equals(other.getId());
-	}
-
-	/**
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getId().hashCode();
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("PluginDependencyGraphNode("); //$NON-NLS-1$
-		buffer.append(descriptor.getSymbolicName());
-		buffer.append(')');
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDependencyPerspective.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDependencyPerspective.java
deleted file mode 100644
index ba8e2d6..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDependencyPerspective.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import org.eclipse.ui.*;
-
-/**
- * A perspective for working with metadata files.
- */
-public class PluginDependencyPerspective implements IPerspectiveFactory {
-	/**
-	 * Creates a layout containing the following views:
-	 * 	PluginListView and
-	 * 	PluginDependencyView
-	 * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		String editorAreaId = layout.getEditorArea();
-
-		layout.setEditorAreaVisible(false);
-
-		IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, (float) 0.30, editorAreaId); //$NON-NLS-1$
-		left.addView(PluginListView.VIEW_ID);
-
-		IFolderLayout right = layout.createFolder("right", IPageLayout.RIGHT, (float) 0.7, editorAreaId); //$NON-NLS-1$
-		right.addView(PluginDependencyView.VIEW_ID);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDependencyView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDependencyView.java
deleted file mode 100644
index 97f46cc..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginDependencyView.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of 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.tools.runtime;
-
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.internal.stats.BundleStats;
-import org.eclipse.core.tools.*;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.service.resolver.*;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.*;
-
-public class PluginDependencyView extends SpyView implements ISelectionListener {
-
-	private TextViewer viewer;
-	private Map dependencyGraph = null;
-
-	/** The id by which this view is known in the plug-in registry */
-	public static final String VIEW_ID = PluginDependencyView.class.getName();
-
-	/**
-	 * @see IWorkbenchPart#createPartControl
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TextViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.WRAP | SWT.READ_ONLY);
-		viewer.setDocument(new Document());
-
-		IActionBars bars = getViewSite().getActionBars();
-
-		final GlobalAction clearOutputAction = new ClearTextAction(viewer.getDocument());
-		clearOutputAction.registerAsGlobalAction(bars);
-
-		final GlobalAction selectAllAction = new SelectAllAction(viewer);
-		selectAllAction.registerAsGlobalAction(bars);
-
-		// Delete action shortcuts are not captured by the workbench
-		// so we need our key binding service to handle Delete keystrokes for us
-		this.viewer.getControl().addKeyListener(new KeyAdapter() {
-			public void keyPressed(KeyEvent e) {
-				if (e.character == SWT.DEL)
-					clearOutputAction.run();
-			}
-		});
-
-		GlobalAction copyAction = new CopyTextSelectionAction(viewer);
-		copyAction.registerAsGlobalAction(bars);
-
-		bars.getToolBarManager().add(clearOutputAction);
-
-		bars.updateActionBars();
-
-		// creates a context menu with actions and adds it to the viewer control
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.add(copyAction);
-		menuMgr.add(clearOutputAction);
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-
-		getViewSite().getPage().addSelectionListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		getViewSite().getPage().removeSelectionListener(this);
-		super.dispose();
-		dependencyGraph = null;
-	}
-
-	/**
-	 * Build the table of plug-in dependencies. Iterate over all the plug-ins in the
-	 * plug-in registry and the cycle through the list of pre-requisites and create the
-	 * parent/child relationships in the nodes.
-	 */
-	private Map getDependencyGraph() {
-		if (dependencyGraph != null)
-			return dependencyGraph;
-		// Build up the dependency graph (see PluginDependencyGraphNode) so
-		// we have the information readily available for any plug-in.
-		State state = Platform.getPlatformAdmin().getState(false);
-		BundleDescription[] plugins = state.getBundles();
-		dependencyGraph = new HashMap();
-		for (int i = 0; i < plugins.length; i++) {
-			BundleDescription descriptor = plugins[i];
-			PluginDependencyGraphNode node = (PluginDependencyGraphNode) dependencyGraph.get(new Long(descriptor.getBundleId()));
-			if (node == null) {
-				node = new PluginDependencyGraphNode(descriptor);
-				dependencyGraph.put(new Long(descriptor.getBundleId()), node);
-			}
-
-			// Cycle through the prerequisites
-			BundleSpecification[] requires = descriptor.getRequiredBundles();
-			for (int j = 0; j < requires.length; j++) {
-				BundleDescription childDesc = (BundleDescription) requires[j].getSupplier();
-				// if the child doesn't exist then move to the next child
-				if (childDesc == null)
-					continue;
-				
-				// if the child entry is not in the table yet then add it
-				PluginDependencyGraphNode childNode = (PluginDependencyGraphNode) dependencyGraph.get(new Long(childDesc.getBundleId()));
-				if (childNode == null) {
-					childNode = new PluginDependencyGraphNode(childDesc);
-					dependencyGraph.put(new Long(childDesc.getBundleId()), childNode);
-				}
-
-				// Add the child to this node's children and set this node as an ancestor
-				// of the child node
-				node.addChild(childNode);
-				childNode.addAncestor(node);
-			}
-		}
-		return dependencyGraph;
-	}
-
-	/**
-	 * @see ISelectionListener#selectionChanged(IWorkbenchPart, ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (!(selection instanceof IStructuredSelection))
-			return;
-		Object element = ((IStructuredSelection) selection).getFirstElement();
-		long id = -1;
-		String name = null;
-		if (element instanceof BundleDescription) {
-			id = ((BundleDescription) element).getBundleId();
-			name = ((BundleDescription) element).getSymbolicName();
-		}
-		if (element instanceof BundleStats) {
-			id = ((BundleStats) element).getId();
-			name = ((BundleStats) element).getSymbolicName();
-		}
-		if (id == -1)
-			return;
-		PluginDependencyGraphNode node = (PluginDependencyGraphNode) getDependencyGraph().get(new Long(id));
-		String text = node == null ? NLS.bind(Messages.depend_noInformation, name) : node.toDeepString();
-		viewer.getDocument().set(text);
-		viewer.refresh();
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginListView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginListView.java
deleted file mode 100644
index 881f959..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PluginListView.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.util.*;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.tools.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.osgi.service.resolver.BundleDescription;
-import org.eclipse.osgi.service.resolver.State;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-public class PluginListView extends SpyView implements IStructuredContentProvider {
-
-	// cache the plug-in list
-	private Object[] bundles = null;
-
-	/** The id by which this view is known in the plug-in registry */
-	public static final String VIEW_ID = PluginListView.class.getName();
-
-	/**
-	 * Class which provides the text labels for the view.
-	 */
-	class PluginListLabelProvider extends LabelProvider implements ITableLabelProvider {
-		/**
-		 * @see ITableLabelProvider#getColumnImage(Object, int)
-		 */
-		public Image getColumnImage(Object arg0, int arg1) {
-			return null;
-		}
-
-		/**
-		 * @see ITableLabelProvider#getColumnText(Object, int)
-		 */
-		public String getColumnText(Object element, int columnIndex) {
-			return element == null ? Messages.depend_badPluginId : ((BundleDescription) element).getSymbolicName();
-		}
-	}
-
-	/**
-	 * @see IStructuredContentProvider#getElements(Object)
-	 */
-	public Object[] getElements(Object arg0) {
-		if (bundles == null) {
-			// before caching the array of descriptors, sort them.
-			// we have to use a comparator here because plug-in
-			// descriptors cannot be compared against each other
-			// in a tree set.
-			Comparator comparator = new Comparator() {
-				public int compare(Object obj1, Object obj2) {
-					String id1 = ((BundleDescription) obj1).getSymbolicName();
-					String id2 = ((BundleDescription) obj2).getSymbolicName();
-					return id1.compareTo(id2);
-				}
-			};
-			Set set = new TreeSet(comparator);
-			BundleContext context = CoreToolsPlugin.getDefault().getContext();
-			Bundle[] allBundles = context.getBundles();
-			State state = Platform.getPlatformAdmin().getState(false);
-			for (int i = 0; i < allBundles.length; i++)
-				set.add(state.getBundle(allBundles[i].getBundleId()));
-			bundles = set.toArray();
-		}
-		return bundles;
-	}
-
-	/**
-	 * @see IContentProvider#dispose()
-	 */
-	public void dispose() {
-		bundles = null;
-	}
-
-	/**
-	 * @see IContentProvider#inputChanged(Viewer, Object, Object)
-	 */
-	public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
-		// do nothing
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		// Create viewer.
-		ListViewer viewer = new ListViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		viewer.setContentProvider(this);
-		viewer.setLabelProvider(new PluginListLabelProvider());
-		viewer.setInput(""); //$NON-NLS-1$
-		getSite().setSelectionProvider(viewer);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PreferenceStatsView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PreferenceStatsView.java
deleted file mode 100644
index 0cd0ce0..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/PreferenceStatsView.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the 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.tools.runtime;
-
-import java.util.*;
-import org.eclipse.core.internal.preferences.EclipsePreferences;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.preferences.*;
-import org.eclipse.core.tools.*;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.text.*;
-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.Menu;
-import org.eclipse.ui.IActionBars;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Text view that dumps sizeof info and stats about the
- * Eclipse preferences tree.
- * 
- * @since 3.0
- */
-public class PreferenceStatsView extends SpyView {
-
-	// The JFace widget used for showing the Element Tree info.  
-	protected TextViewer viewer;
-
-	private IAction updateAction;
-
-	class UpdateAction extends Action {
-
-		// number of nodes in the tree
-		int nodeCount;
-		// number of key/value pairs in the tree
-		int kvCount;
-		// number of nodes without key/value pairs
-		int emptyNodes;
-		// size of the tree
-		int treeSize;
-		// list of node with key/value pairs
-		Set nonEmptyNodes;
-
-		// root node
-		IEclipsePreferences rootNode = Platform.getPreferencesService().getRootNode();
-
-		UpdateAction() {
-			super("Update view"); //$NON-NLS-1$
-			this.setToolTipText("Update"); //$NON-NLS-1$
-			this.setImageDescriptor(CoreToolsPlugin.createImageDescriptor("refresh.gif")); //$NON-NLS-1$
-		}
-
-		public void run() {
-			super.run();
-			reset();
-			try {
-				visitTree();
-			} catch (BackingStoreException e) {
-				e.printStackTrace();
-			}
-			updateTextView();
-			reset();
-		}
-
-		void reset() {
-			nodeCount = 0;
-			kvCount = 0;
-			emptyNodes = 0;
-			treeSize = 0;
-			nonEmptyNodes = new TreeSet();
-		}
-
-		int basicSizeof(IEclipsePreferences node) {
-			if (node instanceof EclipsePreferences)
-				return basicSizeof((EclipsePreferences) node);
-
-			// name
-			int count = sizeof(node.name());
-
-			// key/value pairs
-			try {
-				String[] keys = node.keys();
-				for (int i = 0; i < keys.length; i++) {
-					count += sizeof(keys[i]);
-					String value = node.get(keys[i], null);
-					count += sizeof(value);
-				}
-			} catch (BackingStoreException e) {
-				e.printStackTrace();
-			}
-			return count;
-		}
-
-		int calculateOldSize() {
-			int count = 0;
-			IPluginRegistry registry = Platform.getPluginRegistry();
-			if (registry == null)
-				return count;
-			IPluginDescriptor[] descriptors = registry.getPluginDescriptors();
-			if (descriptors == null)
-				return count;
-			for (int i = 0; i < descriptors.length; i++) {
-				IPluginDescriptor desc = descriptors[i];
-				//				if (desc.isPluginActivated())
-				count += calculateOldSizeFor(desc.getUniqueIdentifier());
-			}
-			return count;
-		}
-
-		int calculateOldSizeFor(String pluginID) {
-			int count = 0;
-			// 12 for the object header + 4 for each field
-			count += 12;
-
-			// dirty boolean
-			count += 4;
-
-			// listener list
-			// TODO
-			count += 4;
-
-			// Properties properties
-			count += 4;
-			IEclipsePreferences node = new InstanceScope().getNode(pluginID);
-			if (node != null) {
-				// add the key/value pairs
-				// TODO rough estimate
-				try {
-					String[] keys = node.keys();
-					for (int i = 0; i < keys.length; i++) {
-						count += sizeof(keys[i]);
-						String value = node.get(keys[i], null);
-						count += sizeof(value);
-					}
-				} catch (BackingStoreException e) {
-					e.printStackTrace();
-				}
-			}
-
-			// Properties defaults
-			count += 4;
-			node = new DefaultScope().getNode(pluginID);
-			if (node != null) {
-				// add the key/value pairs
-				// TODO rough estimate
-				try {
-					String[] keys = node.keys();
-					for (int i = 0; i < keys.length; i++) {
-						count += sizeof(keys[i]);
-						String value = node.get(keys[i], null);
-						count += sizeof(value);
-					}
-				} catch (BackingStoreException e) {
-					e.printStackTrace();
-				}
-			}
-
-			return count;
-		}
-
-		/*
-		 * 12 for the object header
-		 * 4 for each slot
-		 */
-		int basicSizeof(EclipsePreferences node) {
-			int count = 12;
-
-			// name
-			count += 4;
-			count += sizeof(node.name());
-
-			// dirty boolean
-			count += 4;
-
-			// removed boolean
-			count += 4;
-
-			// loading boolean
-			count += 4;
-
-			// slot for the parent pointer
-			count += 4;
-
-			// child map
-			// TODO this isn't quite right but is ok for now
-			count += 4;
-			String[] childrenNames = node.childrenNames();
-			for (int i = 0; i < childrenNames.length; i++)
-				count += sizeof(childrenNames[i]);
-
-			// node change listener list
-			// TODO
-			count += 4;
-
-			// preference change listener list
-			// TODO
-			count += 4;
-
-			// cached path
-			count += 4;
-			count += sizeof(node.absolutePath());
-
-			// key/value pairs
-			// TODO this isn't quite right but is ok for now
-			count += 4;
-			String[] keys = node.keys();
-			for (int i = 0; i < keys.length; i++) {
-				count += sizeof(keys[i]);
-				String value = node.get(keys[i], null);
-				count += sizeof(value);
-			}
-
-			return count;
-		}
-
-		int basicSizeof(Map map) {
-			if (map == null)
-				return 0;
-
-			//formula taken from BundleStats
-			int count = (int) Math.round(44 + (16 + (map.size() * 1.25 * 4)) + (24 * map.size()));
-
-			for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
-				Map.Entry entry = (Map.Entry) it.next();
-				count += sizeof(entry.getKey());
-				count += sizeof(entry.getValue());
-			}
-			return count;
-		}
-
-		/**
-		 * All sizeof tests should go through this central method to weed out
-		 * duplicates.
-		 */
-		int sizeof(Object object) {
-			if (object == null)//|| DeepSize.ignore(object))
-				return 0;
-			if (object instanceof String)
-				return 44 + 2 * ((String) object).length();
-			if (object instanceof byte[])
-				return 16 + ((byte[]) object).length;
-			if (object instanceof Integer)
-				return 16;
-			if (object instanceof Map)
-				return basicSizeof((Map) object);
-			if (object instanceof IEclipsePreferences)
-				return basicSizeof((IEclipsePreferences) object);
-			if (object instanceof QualifiedName) {
-				QualifiedName name = (QualifiedName) object;
-				return 20 + sizeof(name.getQualifier()) + sizeof(name.getLocalName());
-			}
-			// unknown -- use deep size
-			return 0;
-		}
-
-		void visitTree() throws BackingStoreException {
-			// count the number of nodes in the preferences tree
-			reset();
-			IPreferenceNodeVisitor visitor = new IPreferenceNodeVisitor() {
-				public boolean visit(IEclipsePreferences node) {
-					try {
-						treeSize += sizeof(node);
-						nodeCount++;
-						int keys = node.keys().length;
-						kvCount += keys;
-						if (keys == 0)
-							emptyNodes++;
-						else
-							nonEmptyNodes.add(node.absolutePath() + " (" + keys + ")"); //$NON-NLS-1$//$NON-NLS-2$
-					} catch (BackingStoreException e) {
-						e.printStackTrace();
-					}
-					return true;
-				}
-			};
-			rootNode.accept(visitor);
-		}
-
-		void updateTextView() {
-			final StringBuffer buffer = new StringBuffer();
-			buffer.append("Size of Eclipse 2.1 preference objects: " + prettyPrint(calculateOldSize()) + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			buffer.append("Total node count: " + prettyPrint(nodeCount) + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			buffer.append("Nodes without keys: " + prettyPrint(emptyNodes) + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			buffer.append("Key/value pairs: " + prettyPrint(kvCount) + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			buffer.append("Total size of tree: " + prettyPrint(treeSize) + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			buffer.append("Nodes with key/value pairs:\n"); //$NON-NLS-1$
-			for (Iterator i = nonEmptyNodes.iterator(); i.hasNext();)
-				buffer.append("\t" + i.next() + "\n"); //$NON-NLS-1$//$NON-NLS-2$
-
-			//post changes to UI thread
-			viewer.getControl().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					if (!viewer.getControl().isDisposed()) {
-						IDocument doc = viewer.getDocument();
-						doc.set(buffer.toString());
-						viewer.setDocument(doc);
-					}
-				}
-			});
-		}
-
-		private String prettyPrint(int i) {
-			StringBuffer buf = new StringBuffer();
-			for (;;) {
-				if (i < 1000) {
-					String val = Integer.toString(i);
-					//pad with zeros if necessary
-					if (buf.length() > 0) {
-						if (val.length() < 2)
-							buf.append('0');
-						if (val.length() < 3)
-							buf.append('0');
-					}
-					buf.append(val);
-					return buf.toString();
-				}
-				if (i < 1000000) {
-					String val = Integer.toString(i / 1000);
-					//pad with zeros if necessary
-					if (buf.length() > 0) {
-						if (val.length() < 2)
-							buf.append('0');
-						if (val.length() < 3)
-							buf.append('0');
-					}
-					buf.append(val);
-					buf.append(',');
-					i = i % 1000;
-					continue;
-				}
-				buf.append(Integer.toString(i / 1000000));
-				buf.append(',');
-				i = i % 1000000;
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-
-		viewer = new TextViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.WRAP | SWT.READ_ONLY);
-		viewer.setDocument(new Document());
-
-		IActionBars bars = getViewSite().getActionBars();
-
-		final GlobalAction clearOutputAction = new ClearTextAction(viewer.getDocument());
-		clearOutputAction.registerAsGlobalAction(bars);
-
-		final GlobalAction selectAllAction = new SelectAllAction(viewer);
-		selectAllAction.registerAsGlobalAction(bars);
-
-		IMenuManager barMenuManager = getViewSite().getActionBars().getMenuManager();
-		updateAction = new UpdateAction();
-		barMenuManager.add(updateAction);
-
-		// Delete action shortcuts are not captured by the workbench
-		// so we need our key binding service to handle Delete keystrokes for us
-
-		this.viewer.getControl().addKeyListener(new KeyAdapter() {
-			public void keyPressed(KeyEvent e) {
-				if (e.character == SWT.DEL)
-					clearOutputAction.run();
-			}
-		});
-
-		GlobalAction copyAction = new CopyTextSelectionAction(viewer);
-		copyAction.registerAsGlobalAction(bars);
-
-		bars.getToolBarManager().add(updateAction);
-		bars.getToolBarManager().add(clearOutputAction);
-
-		bars.updateActionBars();
-
-		// creates a context menu with actions and adds it to the viewer control
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.add(copyAction);
-		menuMgr.add(clearOutputAction);
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-
-		// populate the view with the initial data
-		if (updateAction != null)
-			updateAction.run();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		updateAction = null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/RuntimeSpyPerspective.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/RuntimeSpyPerspective.java
deleted file mode 100644
index cd62026..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/RuntimeSpyPerspective.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-public class RuntimeSpyPerspective implements IPerspectiveFactory {
-
-	public RuntimeSpyPerspective() {
-		super();
-	}
-
-	public void createInitialLayout(IPageLayout layout) {
-		layout.setEditorAreaVisible(false);
-		layout.addView(ActivePluginsView.VIEW_ID, IPageLayout.LEFT, 0.75f, layout.getEditorArea());
-		layout.addView(PluginDataSheetView.VIEW_ID, IPageLayout.RIGHT, 0.75f, ActivePluginsView.VIEW_ID);
-		layout.addView(LoadedClassesView.VIEW_ID, IPageLayout.BOTTOM, 0.50f, ActivePluginsView.VIEW_ID);
-		layout.addView(StackTraceView.VIEW_ID, IPageLayout.BOTTOM, 0.25f, PluginDataSheetView.VIEW_ID);
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/StackTraceView.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/StackTraceView.java
deleted file mode 100644
index e3b2bd0..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/StackTraceView.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.io.*;
-import org.eclipse.core.tools.BaseTextView;
-
-public class StackTraceView extends BaseTextView {
-
-	/** The id by which this view is known in the plug-in registry */
-	public static final String VIEW_ID = StackTraceView.class.getName();
-
-	public StackTraceView() {
-		super();
-	}
-
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	public void setInput(String stackFileName, long begin, long end) {
-		if (begin == -1 || end == -1) {
-			viewer.getDocument().set("No stack trace available.\nSee <eclipse install>/plugins/org.eclipse.osgi/.options"); //$NON-NLS-1$
-			viewer.refresh();
-			return;
-		}
-
-		try {
-			byte[] chars = new byte[0];
-			FileInputStream fis = new FileInputStream(stackFileName);
-			try {
-				fis.skip(begin);
-				chars = new byte[(int) (end - begin)];
-				fis.read(chars);
-			} finally {
-				fis.close();
-			}
-			viewer.getDocument().set(new String(chars));
-			viewer.refresh();
-		} catch (FileNotFoundException e) {
-			// ignore
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/VMClassInfo.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/VMClassInfo.java
deleted file mode 100644
index 25cdf8c..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/VMClassInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-public class VMClassInfo {
-	String name;
-	int ramSize = 0;
-	int romSize = 0;
-	int jitSize = 0;
-
-	public VMClassInfo(String name) {
-		this.name = name.replace('/', '.');
-	}
-
-	public int getJitSize() {
-		return jitSize;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public int getRAMSize() {
-		return ramSize;
-	}
-
-	public int getROMSize() {
-		return romSize;
-	}
-
-	public void setJITSize(int value) {
-		jitSize = value;
-	}
-
-	public void setRAMSize(int value) {
-		ramSize = value;
-	}
-
-	public void setROMSize(int value) {
-		romSize = value;
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/VMClassloaderInfo.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/VMClassloaderInfo.java
deleted file mode 100644
index 98ef0ff..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/runtime/VMClassloaderInfo.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.runtime;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class VMClassloaderInfo {
-
-	protected String id;
-	protected ClassLoader loader;
-	protected VMClassInfo[] classes;
-	protected int allocRAM = 0;
-	protected int allocROM = 0;
-	protected int usedRAM = 0;
-	protected int usedROM = 0;
-
-	public static boolean hasNatives = false;
-	protected static Map loaders = new HashMap(20);
-
-	public static VMClassInfo[] getBaseClasses() {
-		return new VMClassInfo[0];
-	}
-
-	public static VMClassloaderInfo getClassloader(String id) {
-		return new VMClassloaderInfo(id, null);
-	}
-
-	public static void refreshInfos() {
-		loaders = new HashMap(20);
-	}
-
-	protected VMClassloaderInfo(String id, ClassLoader loader) {
-		this.id = id;
-		if (loader != null)
-			this.loader = loader;
-	}
-
-	public int getAllocRAM() {
-		return allocRAM;
-	}
-
-	public int getAllocROM() {
-		return allocROM;
-	}
-
-	public VMClassloaderInfo getClassloader() {
-		return this;
-	}
-
-	public int getCount() {
-		return getClasses().length;
-	}
-
-	public int getFreeRAM() {
-		return getAllocRAM() - getUsedRAM();
-	}
-
-	public int getFreeROM() {
-		return getAllocROM() - getUsedROM();
-	}
-
-	public String getName() {
-		return id;
-	}
-
-	protected int getTotal(long type, int aspect) {
-		return 0;
-	}
-
-	public int getUsedRAM() {
-		return usedRAM;
-	}
-
-	public int getUsedROM() {
-		return usedROM;
-	}
-
-	protected VMClassInfo[] getClasses() {
-		if (classes == null)
-			initializeClasses();
-		return classes;
-	}
-
-	public VMClassInfo getClass(String name) {
-		return new VMClassInfo(name);
-	}
-
-	public void refresh() {
-		allocRAM = 0;
-		allocROM = 0;
-		usedRAM = 0;
-		usedROM = 0;
-		classes = null;
-	}
-
-	public void initializeClasses() {
-		return;
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/search/FindUnusedMembers.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/search/FindUnusedMembers.java
deleted file mode 100644
index 9380fc7..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/search/FindUnusedMembers.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.search;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.lang.reflect.InvocationTargetException;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jdt.core.*;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.SearchPattern;
-import org.eclipse.jdt.internal.corext.refactoring.RefactoringScopeFactory;
-import org.eclipse.jdt.internal.corext.refactoring.RefactoringSearchEngine;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-
-/*
- * Class that removes field declarations which aren't referenced.
- */
-public class FindUnusedMembers implements IRunnableWithProgress {
-	private boolean headerWritten = false;
-	private final Writer output;
-
-	ICompilationUnit unit;
-	protected int unusedMemberCount = 0;
-
-	public FindUnusedMembers(ICompilationUnit unit, Writer output) {
-		super();
-		this.unit = unit;
-		this.output = output;
-	}
-
-	private void doSearchCU(ICompilationUnit cu, IProgressMonitor monitor) throws JavaModelException, IOException {
-		IType[] allTypes = cu.getAllTypes();
-		for (int i = 0; i < allTypes.length; i++)
-			doSearchType(allTypes[i], monitor);
-	}
-
-	public void doSearchType(IType type, IProgressMonitor monitor) throws JavaModelException, IOException {
-		headerWritten = false;
-
-		IMethod[] methods = type.getMethods();
-		IField[] fields = type.getFields();
-		monitor.beginTask("Searching for references.", methods.length + fields.length); //$NON-NLS-1$
-		try {
-			for (int i = 0; i < methods.length; i++) {
-				if (monitor.isCanceled())
-					throw new OperationCanceledException();
-				if (hasReferences(methods[i], monitor))
-					continue;
-				writeResult(methods[i]);
-				unusedMemberCount++;
-			}
-			for (int i = 0; i < fields.length; i++) {
-				if (monitor.isCanceled())
-					throw new OperationCanceledException();
-				if (hasReferences(fields[i], monitor))
-					continue;
-				writeResult(fields[i]);
-				unusedMemberCount++;
-			}
-
-			if (monitor.isCanceled())
-				throw new OperationCanceledException();
-		} finally {
-			monitor.done();
-		}
-	}
-
-	public int getUnusedMethodCount() {
-		return unusedMemberCount;
-	}
-
-	private boolean hasReferences(IMember member, IProgressMonitor monitor) throws JavaModelException {
-		ICompilationUnit[] affectedUnits = RefactoringSearchEngine.findAffectedCompilationUnits(SearchPattern.createPattern(member, IJavaSearchConstants.REFERENCES), RefactoringScopeFactory.create(member.getDeclaringType()), new SubProgressMonitor(monitor, 1), new RefactoringStatus());
-		return affectedUnits.length > 0;
-	}
-
-	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		if (monitor == null)
-			monitor = new NullProgressMonitor();
-		try {
-			doSearchCU(unit, monitor);
-		} catch (OperationCanceledException e) {
-			throw new InterruptedException();
-		} catch (JavaModelException e) {
-			throw new InvocationTargetException(e);
-		} catch (IOException e) {
-			throw new InvocationTargetException(e);
-		}
-	}
-
-	private void writeHeader(IType type) throws IOException {
-		if (!headerWritten) {
-			headerWritten = true;
-			output.write("\n\n" + type.getFullyQualifiedName()); //$NON-NLS-1$
-		}
-	}
-
-	private void writeResult(IField field) throws IOException, IllegalArgumentException, JavaModelException {
-		writeHeader(field.getDeclaringType());
-		output.write("\n\t"); //$NON-NLS-1$
-		output.write(Signature.toString(field.getTypeSignature()));
-		output.write(" "); //$NON-NLS-1$
-		output.write(field.getElementName());
-	}
-
-	/**
-	 * @param method
-	 * @throws IOException
-	 * @throws JavaModelException 
-	 * @throws IllegalArgumentException 
-	 */
-	private void writeResult(IMethod method) throws IOException, IllegalArgumentException, JavaModelException {
-		writeHeader(method.getDeclaringType());
-		output.write("\n\t");//$NON-NLS-1$
-		output.write(Signature.toString(method.getReturnType()));
-		output.write(" "); //$NON-NLS-1$
-		output.write(method.getElementName());
-		output.write("("); //$NON-NLS-1$
-		String[] types = method.getParameterTypes();
-		for (int i = 0; i < types.length; i++) {
-			output.write(Signature.toString(types[i]));
-			if (i < types.length - 1)
-				output.write(","); //$NON-NLS-1$
-		}
-		output.write(")"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/search/FindUnusedMembersAction.java b/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/search/FindUnusedMembersAction.java
deleted file mode 100644
index 21c93b0..0000000
--- a/bundles/org.eclipse.core.tools/src/org/eclipse/core/tools/search/FindUnusedMembersAction.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tools.search;
-
-import java.io.*;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Iterator;
-import org.eclipse.jdt.core.*;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.ui.*;
-
-public class FindUnusedMembersAction implements IObjectActionDelegate {
-
-	private IStructuredSelection selection;
-	private int unusedCount;
-	private IWorkbenchPart part;
-
-	public void setActivePart(IAction action, IWorkbenchPart part) {
-		this.part = part;
-		//not needed
-	}
-
-	public void run(IAction action) {
-		unusedCount = 0;
-		FileDialog dialog = new FileDialog(part.getSite().getShell(), SWT.SAVE);
-		String outFileName = dialog.open();
-		if (outFileName == null)
-			return;
-		File outputFile = new File(outFileName);
-		if (outputFile.exists())
-			outputFile.delete();
-		FileWriter writer = null;
-		try {
-			try {
-				writer = new FileWriter(outputFile);
-				for (Iterator it = selection.iterator(); it.hasNext();) {
-					Object element = it.next();
-					if (element instanceof IJavaElement)
-						traverse((IJavaElement)element, writer);
-				}
-			} finally {
-				String summary = "\n\nSearch complete.  Found " + unusedCount + " unreferenced methods."; //$NON-NLS-1$ //$NON-NLS-2$
-				if (writer != null) {
-					writer.write(summary);
-					writer.close();
-				}
-				MessageDialog.openInformation(part.getSite().getShell(), "Search Complete", summary);   //$NON-NLS-1$
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	private void traverse(IJavaElement current, Writer output) throws JavaModelException, InvocationTargetException, InterruptedException {
-		if (current instanceof IJavaProject || current instanceof IPackageFragmentRoot) {
-			IJavaElement[] children = ((IParent) current).getChildren();
-			for (int i = 0; i < children.length; i++) {
-				traverse(children[i], output);
-			}
-		} else if (current instanceof IPackageFragment) {
-			//don't search API packages
-			if (current.getElementName().indexOf("internal") > 0) { //$NON-NLS-1$
-				IJavaElement[] children = ((IParent) current).getChildren();
-				for (int i = 0; i < children.length; i++) {
-					traverse(children[i], output);
-				}
-			}
-		} else if (current instanceof ICompilationUnit)
-			traverseCU((ICompilationUnit)current, output);
-	}
-
-	protected void traverseCU(ICompilationUnit unit, Writer output) throws InvocationTargetException, InterruptedException {
-		FindUnusedMembers search = new FindUnusedMembers(unit, output);
-		PlatformUI.getWorkbench().getProgressService().run(true, true, search);
-		unusedCount += search.getUnusedMethodCount();
-	}
-
-	public void selectionChanged(IAction action, ISelection aSelection) {
-		if (aSelection instanceof IStructuredSelection)
-			this.selection = (IStructuredSelection) aSelection;
-	}
-}
\ No newline at end of file
diff --git a/features/org.eclipse.core.tools-feature/.project b/features/org.eclipse.core.tools-feature/.project
deleted file mode 100644
index 9cdfafd..0000000
--- a/features/org.eclipse.core.tools-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.tools-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/features/org.eclipse.core.tools-feature/build.properties b/features/org.eclipse.core.tools-feature/build.properties
deleted file mode 100644
index dee3413..0000000
--- a/features/org.eclipse.core.tools-feature/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2004, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = feature.xml, license.html, feature.properties, epl-v10.html, *.jpg
-qualifier=context
\ No newline at end of file
diff --git a/features/org.eclipse.core.tools-feature/cpl-v10.html b/features/org.eclipse.core.tools-feature/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/features/org.eclipse.core.tools-feature/cpl-v10.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-<HEAD>
-<TITLE>Common Public License - v 1.0</TITLE>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</HEAD>
-
-<BODY BGCOLOR="#FFFFFF" VLINK="#800000">
-
-
-<P ALIGN="CENTER"><B>Common Public License - v 1.0</B>
-<P><B></B><FONT SIZE="3"></FONT>
-<P><FONT SIZE="3"></FONT><FONT SIZE="2">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT").  ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>1.  DEFINITIONS</B></FONT>
-<P><FONT SIZE="2">"Contribution" means:</FONT>
-
-<UL><FONT SIZE="2">a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and<BR CLEAR="LEFT">
-b) in the case of each subsequent Contributor:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	 	changes to the Program, and</FONT></UL>
-
-
-<UL><FONT SIZE="2">ii)		additions to the Program;</FONT></UL>
-
-
-<UL><FONT SIZE="2">where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.  </FONT><FONT SIZE="2">A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf.  </FONT><FONT SIZE="2">Contributions do not include additions to the Program which:  (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Contributor" means any person or entity that distributes the Program.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.  </FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">"Program" means the Contributions distributed in accordance with this Agreement.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.</FONT>
-<P><FONT SIZE="2"><B></B></FONT>
-<P><FONT SIZE="2"><B>2.  GRANT OF RIGHTS</B></FONT>
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">a)	</FONT><FONT SIZE="2">Subject to the terms of this Agreement, each Contributor hereby grants</FONT><FONT SIZE="2"> Recipient a non-exclusive, worldwide, royalty-free copyright license to</FONT><FONT SIZE="2" COLOR="#FF0000"> </FONT><FONT SIZE="2">reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">b) 	Subject to the terms of this Agreement, each Contributor hereby grants </FONT><FONT SIZE="2">Recipient a non-exclusive, worldwide,</FONT><FONT SIZE="2" COLOR="#008000"> </FONT><FONT SIZE="2">royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form.  This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents.  The patent license shall not apply to any other combinations which include the Contribution.  No hardware per se is licensed hereunder.   </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity.  Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise.  As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any.  For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2"><B>3.  REQUIREMENTS</B></FONT>
-<P><FONT SIZE="2"><B></B>A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:</FONT>
-
-<UL><FONT SIZE="2">a)	it complies with the terms and conditions of this Agreement; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	its license agreement:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	effectively disclaims</FONT><FONT SIZE="2"> on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; </FONT></UL>
-
-
-<UL><FONT SIZE="2">ii) 	effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; </FONT></UL>
-
-
-<UL><FONT SIZE="2">iii)</FONT><FONT SIZE="2">	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.</FONT><FONT SIZE="2" COLOR="#0000FF"> </FONT><FONT SIZE="2" COLOR="#FF0000"></FONT></UL>
-
-
-<UL><FONT SIZE="2" COLOR="#FF0000"></FONT><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2">When the Program is made available in source code form:</FONT>
-
-<UL><FONT SIZE="2">a)	it must be made available under this Agreement; and </FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	a copy of this Agreement must be included with each copy of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT><FONT SIZE="2">Contributors may not remove or alter any copyright notices contained within the Program.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>4.  COMMERCIAL DISTRIBUTION</B></FONT>
-<P><FONT SIZE="2">Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like.  While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors.   Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering.  The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement.  In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations.  The Indemnified Contributor may participate in any such claim at its own expense.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">For example, a Contributor might include the Program in a commercial product offering, Product X.  That Contributor is then a Commercial Contributor.  If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.  Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"></FONT><FONT SIZE="2"><B>5.  NO WARRANTY</B></FONT>
-<P><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is</FONT><FONT SIZE="2"> solely responsible for determining the appropriateness of using and distributing </FONT><FONT SIZE="2">the Program</FONT><FONT SIZE="2"> and assumes all risks associated with its exercise of rights under this Agreement</FONT><FONT SIZE="2">, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, </FONT><FONT SIZE="2">programs or equipment, and unavailability or interruption of operations</FONT><FONT SIZE="2">.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"><B>6.  DISCLAIMER OF LIABILITY</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES </FONT><FONT SIZE="2">(INCLUDING WITHOUT LIMITATION LOST PROFITS),</FONT><FONT SIZE="2"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>7.  GENERAL</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed.  In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance.  If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable.  However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted  and may only be modified in the following manner. The Agreement Steward reserves the right to </FONT><FONT SIZE="2">publish new versions (including revisions) of this Agreement from time to </FONT><FONT SIZE="2">time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward.   IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity.  </FONT><FONT SIZE="2">Each new version of the Agreement will be given a distinguishing version number.  The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new </FONT><FONT SIZE="2">version.  </FONT><FONT SIZE="2">Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, </FONT><FONT SIZE="2">by implication, estoppel or otherwise</FONT><FONT SIZE="2">.</FONT><FONT SIZE="2">  All rights in the Program not expressly granted under this Agreement are reserved.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose.  Each party waives its rights to a jury trial in any resulting litigation.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-
-</BODY>
-
-</HTML>
\ No newline at end of file
diff --git a/features/org.eclipse.core.tools-feature/eclipse_update_120.jpg b/features/org.eclipse.core.tools-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/features/org.eclipse.core.tools-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/features/org.eclipse.core.tools-feature/feature.properties b/features/org.eclipse.core.tools-feature/feature.properties
deleted file mode 100644
index b347cab..0000000
--- a/features/org.eclipse.core.tools-feature/feature.properties
+++ /dev/null
@@ -1,123 +0,0 @@
-###############################################################################
-# Copyright (c) 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# feature.properties
-# contains externalized strings for feature.xml
-# "%foo" in feature.xml corresponds to the key "foo" in this file
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-
-# "featureName" property - name of the feature
-featureName=Eclipse Core Tools
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse.org update site
-
-# "description" property - description of the feature
-description=Tools for plug-in developers by plug-in developers
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-ECLIPSE.ORG SOFTWARE USER AGREEMENT\n\
-14th August, 2003\n\
-\n\
-Usage Of Content\n\
-\n\
-ECLIPSE.ORG MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by Eclipse.org\n\
-is provided to you under the terms and conditions of the Common Public\n\
-License Version 1.0 ("CPL"). A copy of the CPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/cpl-v10.html.\n\
-For purposes of the CPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments\n\
-("Fragments"), and features ("Features"). A Feature is a bundle of one or\n\
-more Plug-ins and/or Fragments and associated material. Files named\n\
-"feature.xml" may contain a list of the names and version numbers of the\n\
-Plug-ins and/or Fragments associated with a Feature. Plug-ins and Fragments\n\
-are located in directories named "plugins" and Features are located in\n\
-directories named "features".\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Subdirectories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
-\n\
-Note: if a Feature made available by Eclipse.org is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE CPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
-is provided, please contact Eclipse.org to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n
-########### end of license property ##########################################
diff --git a/features/org.eclipse.core.tools-feature/feature.xml b/features/org.eclipse.core.tools-feature/feature.xml
deleted file mode 100644
index f30b0d0..0000000
--- a/features/org.eclipse.core.tools-feature/feature.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.core.tools"
-      label="%featureName"
-      version="1.3.0.qualifier"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://update.eclipse.org/updates"/>
-   </url>
-
-   <plugin
-         id="org.eclipse.core.tools"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.tools.resources"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.resources.spysupport"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-</feature>
diff --git a/features/org.eclipse.core.tools-feature/license.html b/features/org.eclipse.core.tools-feature/license.html
deleted file mode 100644
index af8c380..0000000
--- a/features/org.eclipse.core.tools-feature/license.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse.org Software User Agreement</h2>
-<p>14th August, 2003</p>
-
-<h3>Usage Of Content</h3>
-
-<p>ECLIPSE.ORG MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by Eclipse.org is provided to you under the terms and conditions of the Common Public License Version 1.0
-   (&quot;CPL&quot;).  A copy of the CPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-   For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<p>Content may be apportioned into plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;). A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of  the Plug-ins and/or Fragments associated with a Feature.   Plug-ins and Fragments are located in directories
-   named &quot;plugins&quot; and Features are located in directories named &quot;features&quot;.</p>
-  
-<p>Features may also include other Features (&quot;Included Features&quot;). Files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</p>
-  
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Subdirectories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by Eclipse.org is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot;.
-Such Abouts, Feature Licenses and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE CPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License or Feature Update License is provided, please
-contact Eclipse.org to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.core.expressions.tests/.classpath b/tests/org.eclipse.core.expressions.tests/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/tests/org.eclipse.core.expressions.tests/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.core.expressions.tests/.cvsignore b/tests/org.eclipse.core.expressions.tests/.cvsignore
deleted file mode 100644
index fe99505..0000000
--- a/tests/org.eclipse.core.expressions.tests/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-
diff --git a/tests/org.eclipse.core.expressions.tests/.project b/tests/org.eclipse.core.expressions.tests/.project
deleted file mode 100644
index 17924fb..0000000
--- a/tests/org.eclipse.core.expressions.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.expressions.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.core.expressions.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.core.expressions.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 1a03ea5..0000000
--- a/tests/org.eclipse.core.expressions.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,66 +0,0 @@
-#Wed May 25 10:22:57 CEST 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=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.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=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=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-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=private
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/tests/org.eclipse.core.expressions.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.core.expressions.tests/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index cfb1bbf..0000000
--- a/tests/org.eclipse.core.expressions.tests/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Dec 21 11:19:34 CET 2004
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.ondemandthreshold=99
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=java;javax;junit;org.eclipse.core.runtime;org.eclipse.core.expressions;org.eclipse.core.internal.expressions;org.eclipse.core.internal.expressions.tests;
diff --git a/tests/org.eclipse.core.expressions.tests/.template b/tests/org.eclipse.core.expressions.tests/.template
deleted file mode 100644
index f3bcd41..0000000
--- a/tests/org.eclipse.core.expressions.tests/.template
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form>
-   <p/><p><b>Tips on working with this plug-in project</b></p><li>For the view of the new plug-in at a glance, go to the <img href="pageImage"/><a href="OverviewPage">Overview</a>.</li><li>You can test the contributions of this plug-in by launching another instance of the workbench. On the <b>Run</b> menu, click <b>Run As</b> and choose <img href="runTimeWorkbenchImage"/><a href="action.run">Run-time Workbench</a> from the available choices.</li><li>You can add more functionality to this plug-in by adding extensions using the <a href="action.newExtension">New Extension Wizard</a>.</li><li>The plug-in project contains Java code that you can debug. Place breakpoints in Java classes. On the <b>Run</b> menu, select <b>Debug As</b> and choose <img href="runTimeWorkbenchImage"/><a href="action.debug">Run-time Workbench</a> from the available choices.</li>
-</form>
diff --git a/tests/org.eclipse.core.expressions.tests/about.html b/tests/org.eclipse.core.expressions.tests/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.core.expressions.tests/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.core.expressions.tests/build.properties b/tests/org.eclipse.core.expressions.tests/build.properties
deleted file mode 100644
index 2bbc77d..0000000
--- a/tests/org.eclipse.core.expressions.tests/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = plugin.xml,\
-               test.xml,\
-               about.html,\
-               plugin.properties,\
-               *.jar
-src.includes = about.html
-source.expressionstests.jar = src/
diff --git a/tests/org.eclipse.core.expressions.tests/plugin.properties b/tests/org.eclipse.core.expressions.tests/plugin.properties
deleted file mode 100644
index 42c9f22..0000000
--- a/tests/org.eclipse.core.expressions.tests/plugin.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName= Expression Language Tests
-providerName= Eclipse.org
-
-testParticipant= Test Participant
diff --git a/tests/org.eclipse.core.expressions.tests/plugin.xml b/tests/org.eclipse.core.expressions.tests/plugin.xml
deleted file mode 100644
index 6c8d337..0000000
--- a/tests/org.eclipse.core.expressions.tests/plugin.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.core.expressions.tests"
-   name="%pluginName"
-   version="3.2.0.qualifier"
-   provider-name="%providerName"
-   class="org.eclipse.core.internal.expressions.tests.ExpressionTestPlugin">
-
-   <runtime>
-      <library name="expressionstests.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-
-   <requires>
-      <import plugin="org.junit"/>
-   	  <import plugin="org.eclipse.core.runtime"/>
-   	  <import plugin="org.eclipse.core.expressions"/>
-   </requires>
-
-   <extension point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester
-            namespace="org.eclipse.core.internal.expressions.tests"
-            properties="simple, overridden, ordering, chainOrdering"
-            type="org.eclipse.core.internal.expressions.tests.A"
-            class="org.eclipse.core.internal.expressions.tests.A_TypeExtender"
-            id="org.eclipse.core.internal.expressions.tests.A_TypeExtender">
-      </propertyTester>
-      <propertyTester
-            namespace="org.eclipse.core.internal.expressions.tests"
-            properties="chaining, chainOrdering"
-            type="org.eclipse.core.internal.expressions.tests.A"
-            class="org.eclipse.core.internal.expressions.tests.A_TypeExtender2"
-            id="org.eclipse.core.internal.expressions.tests.A_TypeExtender2">
-      </propertyTester>
-      <propertyTester
-            namespace="org.eclipse.core.internal.expressions.tests"
-            properties="overridden"
-            type="org.eclipse.core.internal.expressions.tests.B"
-            class="org.eclipse.core.internal.expressions.tests.B_TypeExtender"
-            id="org.eclipse.core.internal.expressions.tests.B_TypeExtender">
-      </propertyTester>
-      <propertyTester
-            namespace="org.eclipse.core.internal.expressions.tests"
-            properties="ordering"
-            type="org.eclipse.core.internal.expressions.tests.I"
-            class="org.eclipse.core.internal.expressions.tests.I_TypeExtender"
-            id="org.eclipse.core.internal.expressions.tests.I_TypeExtender">
-      </propertyTester>
-      
-      <propertyTester
-            namespace="org.eclipse.core.internal.expressions.tests2"
-            properties="differentNamespace"
-            type="org.eclipse.core.internal.expressions.tests.A"
-            class="org.eclipse.core.internal.expressions.tests.A_TypeExtender3"
-            id="org.eclipse.core.internal.expressions.tests.A_TypeExtender">
-      </propertyTester>
-   </extension>
-
-   <extension point="org.eclipse.core.runtime.adapters">
-		<factory 
-            class="org.eclipse.core.internal.expressions.tests.TestAdapterFactory" 
-            adaptableType="org.eclipse.core.internal.expressions.tests.Adaptee">
-            <adapter type="org.eclipse.core.internal.expressions.tests.Adapter"/>
-		</factory>
-   </extension>
-   
-   <extension-point id="testParticipants" name="%testParticipant" schema="schema/testParticipants.exsd"/>
-   
-	<extension point="org.eclipse.core.expressions.tests.testParticipants">
-	  <testParticipant id="test1">
-		<enablement>
-			<and>
-	            <and/> 
-	            <or/>
-	            <not><count value="1"/></not>
-	            <instanceof value="org.eclipse.core.expressions.Expression"/>
-	            <test property="namespace.isDefault"/>
-	            <systemTest property="isDefault" value="xx"/>
-	            <equals value= "string"/>
-				<count value="1"/>
-				<with variable="eclipse"/>
-				<resolve variable="eclipse"/>
-			    <adapt type="org.eclipse.core.expressions.Expression"/>            
-	            <iterate/> 
-			</and>
-			<or>
-	            <and/> 
-	            <or/>
-	            <not><count value="1"/></not>
-	            <instanceof value="org.eclipse.core.expressions.Expression"/>
-	            <test property="namespace.isDefault"/>
-	            <systemTest property="isDefault" value="xx"/>
-	            <equals value= "string"/>
-				<count value="1"/>
-				<with variable="eclipse"/>
-				<resolve variable="eclipse"/>
-			    <adapt type="org.eclipse.core.expressions.Expression"/>            
-	            <iterate/> 
-			</or> 
-			<not><count value="1"/></not>
-            <instanceof value="org.eclipse.core.expressions.Expression"/>
-            <test property="namespace.isDefault"/>
-            <test property="namespace.isDefault" value="default"/>
-            <test property="namespace.isDefault" args="'arg1', 'arg2'" value="default"/>
-	        <systemTest property="isDefault" value="xx"/>
-	        <equals value= "string"/>
-            <count value="1"/>
-            <with variable= "element">
-	            <and/> 
-	            <or/>
-	            <not><count value="1"/></not>
-	            <instanceof value="org.eclipse.core.expressions.Expression"/>
-	            <test property="namespace.isDefault"/>
-	            <systemTest property="isDefault" value="xx"/>
-	            <equals value= "string"/>
-				<count value="1"/>
-				<with variable="eclipse"/>
-				<resolve variable="eclipse"/>
-			    <adapt type="org.eclipse.core.expressions.Expression"/>            
-	            <iterate/> 
-            </with>
-            <resolve variable="eclipse">
-	            <and/> 
-	            <or/>
-	            <not><count value="1"/></not>
-	            <instanceof value="org.eclipse.core.expressions.Expression"/>
-	            <test property="namespace.isDefault"/>
-	            <systemTest property="isDefault" value="xx"/>
-	            <equals value= "string"/>
-				<count value="1"/>
-				<with variable="eclipse"/>
-				<resolve variable="eclipse"/>
-			    <adapt type="org.eclipse.core.expressions.Expression"/>            
-	            <iterate/> 
-            </resolve>
-            <resolve variable="eclipse" args="1, true"/>
-            <adapt type="org.eclipse.core.expressions.Expression">
-	            <and/> 
-	            <or/>
-	            <not><count value="1"/></not>
-	            <instanceof value="org.eclipse.core.expressions.Expression"/>
-	            <test property="namespace.isDefault"/>
-	            <systemTest property="isDefault" value="xx"/>
-	            <equals value= "string"/>
-				<count value="1"/>
-				<with variable="eclipse"/>
-				<resolve variable="eclipse"/>
-			    <adapt type="org.eclipse.core.expressions.Expression"/>            
-	            <iterate/> 
-            </adapt>
-            <iterate>
-	            <and/> 
-	            <or/>
-	            <not><count value="1"/></not>
-	            <instanceof value="org.eclipse.core.expressions.Expression"/>
-	            <test property="namespace.isDefault"/>
-	            <systemTest property="isDefault" value="xx"/>
-	            <equals value= "string"/>
-				<count value="1"/>
-				<with variable="eclipse"/>
-				<resolve variable="eclipse"/>
-			    <adapt type="org.eclipse.core.expressions.Expression"/>            
-	            <iterate/> 
-            </iterate>
-      </enablement>
-     </testParticipant>
-   </extension>
-</plugin>
diff --git a/tests/org.eclipse.core.expressions.tests/schema/testParticipants.exsd b/tests/org.eclipse.core.expressions.tests/schema/testParticipants.exsd
deleted file mode 100644
index 4c03369..0000000
--- a/tests/org.eclipse.core.expressions.tests/schema/testParticipants.exsd
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="ore.eclipse.core.expressions">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="ore.eclipse.core.expressions" id="testParticipants" name="Test Participants"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to test the expression language.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="testParticipant" 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="testParticipant">
-      <complexType>
-         <all>
-            <element ref="enablement"/>
-         </all>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2001, 2004 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/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A.java
deleted file mode 100644
index fa503b1..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-
-public class A {
-
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A_TypeExtender.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A_TypeExtender.java
deleted file mode 100644
index 4dd7260..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A_TypeExtender.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.internal.expressions.Assert;
-
-public class A_TypeExtender extends PropertyTester {
-
-	public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
-		if ("simple".equals(property)) { //$NON-NLS-1$
-			return "simple".equals(expectedValue); //$NON-NLS-1$
-		} else if ("overridden".equals(property)) { //$NON-NLS-1$
-			return "A".equals(expectedValue); //$NON-NLS-1$
-		} else if ("ordering".equals(property)) { //$NON-NLS-1$
-			return "A".equals(expectedValue); //$NON-NLS-1$
-		} else if ("chainOrdering".equals(property)) { //$NON-NLS-1$
-			return "A".equals(expectedValue); //$NON-NLS-1$
-		}
-		Assert.isTrue(false);
-		return false;
-	}
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A_TypeExtender2.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A_TypeExtender2.java
deleted file mode 100644
index b170dd2..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A_TypeExtender2.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.internal.expressions.Assert;
-
-public class A_TypeExtender2 extends PropertyTester {
-
-	public boolean test(Object receiver, String method, Object[] args, Object expectedValue) {
-		if ("chaining".equals(method)) { //$NON-NLS-1$
-			return "A2".equals(expectedValue); //$NON-NLS-1$
-		} else if ("chainOrdering".equals(method)) { //$NON-NLS-1$
-			return "A2".equals(expectedValue); //$NON-NLS-1$
-		}
-		Assert.isTrue(false);
-		return false;
-	}
-
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A_TypeExtender3.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A_TypeExtender3.java
deleted file mode 100644
index ad56ffa..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/A_TypeExtender3.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.internal.expressions.Assert;
-
-public class A_TypeExtender3 extends PropertyTester {
-
-	public boolean test(Object receiver, String method, Object[] args, Object expectedValue) {
-		if ("differentNamespace".equals(method)) { //$NON-NLS-1$
-			return "A3".equals(expectedValue); //$NON-NLS-1$
-		}
-		Assert.isTrue(false);
-		return false;
-	}
-
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adaptee.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adaptee.java
deleted file mode 100644
index b93091a..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adaptee.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-
-public class Adaptee {
-
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adapter.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adapter.java
deleted file mode 100644
index aafc357..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/Adapter.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-
-public class Adapter {
-
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/AllTests.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/AllTests.java
deleted file mode 100644
index bfc20b4..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/AllTests.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests {
-	
-	public static Test suite() {
-		TestSuite suite= new TestSuite("All Expression Language Tests"); //$NON-NLS-1$
-		suite.addTest(PropertyTesterTests.suite());
-		suite.addTest(ExpressionTests.suite());
-		suite.addTest(ExpressionInfoTests.suite());
-		return suite;
-	}
-}
-
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/B.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/B.java
deleted file mode 100644
index d25c19d..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/B.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-
-public class B extends A implements I {
-
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/B_TypeExtender.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/B_TypeExtender.java
deleted file mode 100644
index e33334b..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/B_TypeExtender.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.internal.expressions.Assert;
-
-public class B_TypeExtender extends PropertyTester {
-
-	public boolean test(Object receiver, String method, Object[] args, Object expectedValue) {
-		if ("overridden".equals(method)) { //$NON-NLS-1$
-			return "B".equals(expectedValue); //$NON-NLS-1$
-		}
-		Assert.isTrue(false);
-		return false;
-	}
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionInfoTests.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionInfoTests.java
deleted file mode 100644
index b2231c5..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionInfoTests.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.expressions.ExpressionInfo;
-
-import org.eclipse.core.internal.expressions.AdaptExpression;
-import org.eclipse.core.internal.expressions.AndExpression;
-import org.eclipse.core.internal.expressions.CountExpression;
-import org.eclipse.core.internal.expressions.EqualsExpression;
-import org.eclipse.core.internal.expressions.InstanceofExpression;
-import org.eclipse.core.internal.expressions.IterateExpression;
-import org.eclipse.core.internal.expressions.NotExpression;
-import org.eclipse.core.internal.expressions.ResolveExpression;
-import org.eclipse.core.internal.expressions.SystemTestExpression;
-import org.eclipse.core.internal.expressions.TestExpression;
-import org.eclipse.core.internal.expressions.WithExpression;
-
-
-public class ExpressionInfoTests extends TestCase {
-
-	public static Test suite() {
-		return new TestSuite(ExpressionInfoTests.class);
-	}
-
-	// ---- test merging ------------------------------------------------------------------------
-	
-	public void testMergeEmpty() {
-		ExpressionInfo info= new ExpressionInfo();
-		info.merge(new ExpressionInfo());
-		assertNoAccess(info);
-	}
-	
-	public void testMergeDefaultVariable() {
-		ExpressionInfo info;
-		ExpressionInfo other;
-		
-		info= new ExpressionInfo();
-		info.markDefaultVariableAccessed();
-		info.merge(new ExpressionInfo());
-		assertDefaultAccessOnly(info);
-		
-		info= new ExpressionInfo();
-		other= new ExpressionInfo();
-		other.markDefaultVariableAccessed();
-		info.merge(other);
-		assertDefaultAccessOnly(info);
-		
-		info= new ExpressionInfo();
-		other= new ExpressionInfo();
-		info.markDefaultVariableAccessed();
-		other.markDefaultVariableAccessed();
-		info.merge(other);
-		assertDefaultAccessOnly(info);
-	}
-	
-	public void testMergeSystemProperty() {
-		ExpressionInfo info;
-		ExpressionInfo other;
-		
-		info= new ExpressionInfo();
-		info.markSystemPropertyAccessed();
-		info.merge(new ExpressionInfo());
-		assertSystemPropertyOnly(info);
-		
-		info= new ExpressionInfo();
-		other= new ExpressionInfo();
-		other.markSystemPropertyAccessed();
-		info.merge(other);
-		assertSystemPropertyOnly(info);
-		
-		info= new ExpressionInfo();
-		other= new ExpressionInfo();
-		info.markSystemPropertyAccessed();
-		other.markSystemPropertyAccessed();
-		info.merge(other);
-		assertSystemPropertyOnly(info);
-	}
-	
-	public void testMergeVariableNames() {
-		ExpressionInfo info;
-		ExpressionInfo other;
-		
-		info= new ExpressionInfo();
-		info.addVariableNameAccess("variable");
-		info.merge(new ExpressionInfo());
-		assertVariableAccess(info, "variable");
-		
-		info= new ExpressionInfo();
-		other= new ExpressionInfo();
-		other.addVariableNameAccess("variable");
-		info.merge(other);
-		assertVariableAccess(info, "variable");
-		
-		info= new ExpressionInfo();
-		info.addVariableNameAccess("variable");
-		other= new ExpressionInfo();
-		other.addVariableNameAccess("variable");
-		info.merge(other);
-		assertVariableAccess(info, "variable");
-		
-		info= new ExpressionInfo();
-		info.addVariableNameAccess("variable_one");
-		other= new ExpressionInfo();
-		other.addVariableNameAccess("variable_two");
-		info.merge(other);
-		assertVariableAccess(info, new String[] {"variable_one", "variable_two"});
-	}
-	
-	public void testMergeMisbehavingExpressionTypes() {
-		ExpressionInfo info;
-		ExpressionInfo other;
-		
-		info= new ExpressionInfo();
-		info.addMisBehavingExpressionType(WithExpression.class);
-		info.merge(new ExpressionInfo());
-		assertMisbehavedExpressionTypes(info, new Class[] {WithExpression.class});
-		
-		info= new ExpressionInfo();
-		other= new ExpressionInfo();
-		other.addMisBehavingExpressionType(WithExpression.class);
-		info.merge(other);
-		assertMisbehavedExpressionTypes(info, new Class[] {WithExpression.class});
-		
-		info= new ExpressionInfo();
-		info.addMisBehavingExpressionType(WithExpression.class);
-		other= new ExpressionInfo();
-		other.addMisBehavingExpressionType(WithExpression.class);
-		info.merge(other);
-		assertMisbehavedExpressionTypes(info, new Class[] {WithExpression.class});
-		
-		info= new ExpressionInfo();
-		info.addMisBehavingExpressionType(WithExpression.class);
-		other= new ExpressionInfo();
-		other.addMisBehavingExpressionType(ResolveExpression.class);
-		info.merge(other);
-		assertMisbehavedExpressionTypes(info, new Class[] {WithExpression.class, ResolveExpression.class});
-	}
-	
-	// ---- test expression ---------------------------------------------------------------------
-	
-	public void testCountExpression() {
-		assertDefaultAccessOnly((new CountExpression("10")).computeExpressionInfo());
-	}
-
-	public void testEqualsExpression() {
-		assertDefaultAccessOnly((new EqualsExpression(new Object())).computeExpressionInfo());
-	}
-	
-	public void testInstanceofExpression() {
-		assertDefaultAccessOnly((new InstanceofExpression("java.lang.Object")).computeExpressionInfo());
-	}
-	
-	public void testNotExpression() {
-		assertDefaultAccessOnly((new NotExpression(new CountExpression("10"))).computeExpressionInfo());
-	}
-	
-	public void testSystemExpression() {
-		assertSystemPropertyOnly((new SystemTestExpression("property", "value")).computeExpressionInfo());
-	}
-	
-	public void testTestExpression() {
-		assertDefaultAccessOnly((new TestExpression("namespace", "property", null, new Object())).computeExpressionInfo());
-	}
-	
-	// ---- composite expressions ---------------------------------------------------------
-	
-	public void testAdaptExpression() throws Exception {
-		assertDefaultAccessOnly(new AdaptExpression("java.lang.Object").computeExpressionInfo());
-	}
-	
-	public void testAndExpression() throws Exception {
-		AndExpression and= new AndExpression();
-		assertNoAccess(and.computeExpressionInfo());
-		and.add(new CountExpression("10"));
-		assertDefaultAccessOnly(and.computeExpressionInfo());
-	}
-	
-	public void testIterateExpression() throws Exception {
-		assertDefaultAccessOnly(new IterateExpression("or").computeExpressionInfo());
-	}
-	
-	public void testResolveExpression() {
-		ResolveExpression resolve= new ResolveExpression("variable", null);
-		assertNoAccess(resolve.computeExpressionInfo());
-		resolve.add(new CountExpression("10"));
-		assertVariableAccess(resolve.computeExpressionInfo(), "variable");
-	}
-	
-	public void testWithExpression() {
-		WithExpression with= new WithExpression("variable");
-		assertNoAccess(with.computeExpressionInfo());
-		with.add(new CountExpression("10"));
-		assertVariableAccess(with.computeExpressionInfo(), "variable");
-	}
-	
-	private void assertDefaultAccessOnly(ExpressionInfo info) {
-		assertTrue("Accesses default variable", info.hasDefaultVariableAccess());
-		assertFalse("Doesn't accesses system property", info.hasSystemPropertyAccess());
-		assertTrue("No variable accesses", info.getAccessedVariableNames().length == 0);
-		assertNull("No misbehaving expression types", info.getMisbehavingExpressionTypes());
-	}
-
-	private void assertSystemPropertyOnly(ExpressionInfo info) {
-		assertFalse("Doesn't accesses default variable", info.hasDefaultVariableAccess());
-		assertTrue("Accesses system property", info.hasSystemPropertyAccess());
-		assertTrue("No variable accesses", info.getAccessedVariableNames().length == 0);
-		assertNull("No misbehaving expression types", info.getMisbehavingExpressionTypes());
-	}
-	
-	private void assertNoAccess(ExpressionInfo info) {
-		assertFalse("Doesn't accesses default variable", info.hasDefaultVariableAccess());
-		assertFalse("Doesn't accesses system property", info.hasSystemPropertyAccess());
-		assertTrue("No variable accesses", info.getAccessedVariableNames().length == 0);
-		assertNull("No misbehaving expression types", info.getMisbehavingExpressionTypes());
-	}
-	
-	private void assertVariableAccess(ExpressionInfo info, String variable) {
-		assertFalse("Doesn't accesses default variable", info.hasDefaultVariableAccess());
-		assertFalse("Doesn't accesses system property", info.hasSystemPropertyAccess());
-		String[] accessedVariableNames= info.getAccessedVariableNames();
-		assertEquals("One variable accessed", 1, accessedVariableNames.length);
-		assertEquals("Variable accessed", variable, accessedVariableNames[0]);
-		assertNull("No misbehaving expression types", info.getMisbehavingExpressionTypes());
-	}
-	
-	private void assertVariableAccess(ExpressionInfo info, String[] variables) {
-		assertFalse("Doesn't accesses default variable", info.hasDefaultVariableAccess());
-		assertFalse("Doesn't accesses system property", info.hasSystemPropertyAccess());
-		Set accessedVariableNames= new HashSet(Arrays.asList(info.getAccessedVariableNames()));
-		assertEquals("All variable accessed", variables.length, accessedVariableNames.size());
-		for (int i= 0; i < variables.length; i++) {
-			assertTrue("Variable accessed", accessedVariableNames.contains(variables[i]));
-		}
-		assertNull("No misbehaving expression types", info.getMisbehavingExpressionTypes());
-	}
-	
-	private void assertMisbehavedExpressionTypes(ExpressionInfo info, Class[] types) {
-		assertFalse("Doesn't accesses default variable", info.hasDefaultVariableAccess());
-		assertFalse("Doesn't accesses system property", info.hasSystemPropertyAccess());
-		assertTrue("No variable accesses", info.getAccessedVariableNames().length == 0);
-		Set misbehavedTypes= new HashSet(Arrays.asList(info.getMisbehavingExpressionTypes()));
-		assertEquals("All types accessed", types.length, misbehavedTypes.size());
-		for (int i= 0; i < types.length; i++) {
-			assertTrue("Type collected", misbehavedTypes.contains(types[i]));
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTestPlugin.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTestPlugin.java
deleted file mode 100644
index 2b17c28..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTestPlugin.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import org.eclipse.core.runtime.Plugin;
-
-public class ExpressionTestPlugin extends Plugin {
-	
-	private static ExpressionTestPlugin fgDefault;
-	
-	public ExpressionTestPlugin() {
-		fgDefault= this;
-	}
-
-	public static ExpressionTestPlugin getDefault() {
-		return fgDefault;
-	}
-	
-	public static String getPluginId() {
-		return "org.eclipse.core.expressions.tests"; //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java
deleted file mode 100644
index f967f24..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/ExpressionTests.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.expressions.IVariableResolver;
-import org.eclipse.core.internal.expressions.AdaptExpression;
-import org.eclipse.core.internal.expressions.CountExpression;
-import org.eclipse.core.internal.expressions.EqualsExpression;
-import org.eclipse.core.internal.expressions.Expressions;
-import org.eclipse.core.internal.expressions.InstanceofExpression;
-import org.eclipse.core.internal.expressions.IterateExpression;
-import org.eclipse.core.internal.expressions.SystemTestExpression;
-
-
-public class ExpressionTests extends TestCase {
-
-	public static Test suite() {
-		return new TestSuite(ExpressionTests.class);
-	}
-	
-	public void testEscape() throws Exception {
-		assertEquals("Str'ing", Expressions.unEscapeString("Str''ing")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals("'", Expressions.unEscapeString("''")); //$NON-NLS-1$ //$NON-NLS-2$
-		boolean caught= false;
-		try {
-			Expressions.unEscapeString("'"); //$NON-NLS-1$
-		} catch (CoreException e) {
-			caught= true;
-		}
-		assertTrue(caught);
-	}
-	
-	public void testArgumentConversion() throws Exception {
-		assertNull(Expressions.convertArgument(null));
-		assertEquals("", Expressions.convertArgument("")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals("", Expressions.convertArgument("''")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals("eclipse", Expressions.convertArgument("eclipse")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals("e'clips'e", Expressions.convertArgument("e'clips'e")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals("eclipse", Expressions.convertArgument("'eclipse'")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals("'ecl'ipse'", Expressions.convertArgument("'''ecl''ipse'''")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals("true", Expressions.convertArgument("'true'")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals("1.7", Expressions.convertArgument("'1.7'")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals("007", Expressions.convertArgument("'007'")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEquals(Boolean.TRUE, Expressions.convertArgument("true")); //$NON-NLS-1$
-		assertEquals(Boolean.FALSE, Expressions.convertArgument("false")); //$NON-NLS-1$
-		assertEquals(new Integer(100), Expressions.convertArgument("100")); //$NON-NLS-1$
-		assertEquals(new Float(1.7f), Expressions.convertArgument("1.7")); //$NON-NLS-1$
-	}
-	
-	public void testArgumentParsing() throws Exception {
-		Object[] result= null;
-		
-		result= Expressions.parseArguments(""); //$NON-NLS-1$
-		assertEquals("", result[0]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments("s1"); //$NON-NLS-1$
-		assertEquals("s1", result[0]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments(" s1 "); //$NON-NLS-1$
-		assertEquals("s1", result[0]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments("s1,s2"); //$NON-NLS-1$
-		assertEquals("s1", result[0]); //$NON-NLS-1$
-		assertEquals("s2", result[1]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments(" s1 , s2 "); //$NON-NLS-1$
-		assertEquals("s1", result[0]); //$NON-NLS-1$
-		assertEquals("s2", result[1]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments("' s1 ',' s2 '"); //$NON-NLS-1$
-		assertEquals(" s1 ", result[0]); //$NON-NLS-1$
-		assertEquals(" s2 ", result[1]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments(" s1 , ' s2 '"); //$NON-NLS-1$
-		assertEquals("s1", result[0]); //$NON-NLS-1$
-		assertEquals(" s2 ", result[1]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments("' s1 ', s2 "); //$NON-NLS-1$
-		assertEquals(" s1 ", result[0]); //$NON-NLS-1$
-		assertEquals("s2", result[1]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments("''''"); //$NON-NLS-1$
-		assertEquals("'", result[0]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments("''',''',','"); //$NON-NLS-1$
-		assertEquals("','", result[0]);		 //$NON-NLS-1$
-		assertEquals(",", result[1]); //$NON-NLS-1$
-		
-		result= Expressions.parseArguments("' s1 ', true "); //$NON-NLS-1$
-		assertEquals(" s1 ", result[0]); //$NON-NLS-1$
-		assertEquals(Boolean.TRUE, result[1]);
-		
-		boolean caught= false;
-		try {
-			Expressions.parseArguments("' s1"); //$NON-NLS-1$
-		} catch (CoreException e) {
-			caught= true;
-		}
-		assertTrue(caught);
-		caught= false;
-		try {
-			Expressions.parseArguments("'''s1"); //$NON-NLS-1$
-		} catch (CoreException e) {
-			caught= true;
-		}
-		assertTrue(caught);
-	}
-	
-	public void testSystemProperty() throws Exception {
-		SystemTestExpression expression= new SystemTestExpression("os.name", System.getProperty("os.name")); //$NON-NLS-1$ //$NON-NLS-2$
-		EvaluationResult result= expression.evaluate(new EvaluationContext(null, new Object()));
-		assertTrue(result == EvaluationResult.TRUE);
-	}
-	
-	public void testAdaptExpression() throws Exception {
-		AdaptExpression expression= new AdaptExpression("org.eclipse.core.internal.expressions.tests.Adapter"); //$NON-NLS-1$
-		expression.add(new InstanceofExpression("org.eclipse.core.internal.expressions.tests.Adapter")); //$NON-NLS-1$
-		EvaluationResult result= expression.evaluate(new EvaluationContext(null, new Adaptee()));
-		assertTrue(result == EvaluationResult.TRUE);
-	}
-	
-	public void testAdaptExpressionFail() throws Exception {
-		AdaptExpression expression= new AdaptExpression("org.eclipse.core.internal.expressions.tests.NotExisting"); //$NON-NLS-1$
-		EvaluationResult result= expression.evaluate(new EvaluationContext(null, new Adaptee()));
-		assertTrue(result == EvaluationResult.FALSE);
-	}
-	
-	public void testAdaptExpressionFail2() throws Exception {
-		AdaptExpression expression= new AdaptExpression("org.eclipse.core.internal.expressions.tests.Adapter"); //$NON-NLS-1$
-		expression.add(new InstanceofExpression("org.eclipse.core.internal.expressions.tests.NotExisting")); //$NON-NLS-1$
-		EvaluationResult result= expression.evaluate(new EvaluationContext(null, new Adaptee()));
-		assertTrue(result == EvaluationResult.FALSE);
-	}
-	
-	public void testVariableResolver() throws Exception {
-		final Object result= new Object();
-		IVariableResolver resolver= new IVariableResolver() {
-			public Object resolve(String name, Object[] args) throws CoreException {
-				assertEquals("variable", name); //$NON-NLS-1$
-				assertEquals("arg1", args[0]); //$NON-NLS-1$
-				assertEquals(Boolean.TRUE, args[1]);
-				return result;
-			}
-		};
-		EvaluationContext context= new EvaluationContext(null, new Object(), new IVariableResolver[] { resolver });
-		assertTrue(result == context.resolveVariable("variable", new Object[] {"arg1", Boolean.TRUE})); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	public void testEqualsExpression() throws Exception {
-		EqualsExpression exp= new EqualsExpression("name"); //$NON-NLS-1$
-		EvaluationContext context= new EvaluationContext(null, "name"); //$NON-NLS-1$
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		
-		exp= new EqualsExpression(Boolean.TRUE);
-		context= new EvaluationContext(null, Boolean.TRUE);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));		
-		
-		exp= new EqualsExpression("name"); //$NON-NLS-1$
-		context= new EvaluationContext(null, Boolean.TRUE);
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));		
-	}
-	
-	public void testCountExpressionAnyNumber() throws Exception {
-		CountExpression exp= new CountExpression("*"); //$NON-NLS-1$
-		
-		List list= new ArrayList();
-		EvaluationContext context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		list.add("two"); //$NON-NLS-1$
-		list.add("three"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-	}
-	
-	public void testCountExpressionExact() throws Exception {
-		CountExpression exp= new CountExpression("2"); //$NON-NLS-1$
-		
-		List list= new ArrayList();
-		list.add("one"); //$NON-NLS-1$
-		EvaluationContext context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		list.add("two"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		list.add("two"); //$NON-NLS-1$
-		list.add("three"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));
-	}
-	
-	public void testCountExpressionNoneOrOne() throws Exception {
-		CountExpression exp= new CountExpression("?"); //$NON-NLS-1$
-		
-		List list= new ArrayList();
-		EvaluationContext context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		list.add("two"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));
-	}
-	
-	public void testCountExpressionOneOrMore() throws Exception {
-		CountExpression exp= new CountExpression("+"); //$NON-NLS-1$
-		
-		List list= new ArrayList();
-		EvaluationContext context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		list.add("two"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-	}
-	
-	public void testCountExpressionNone() throws Exception {
-		CountExpression exp= new CountExpression("!"); //$NON-NLS-1$
-		
-		List list= new ArrayList();
-		EvaluationContext context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));
-		
-		list.clear();
-		list.add("one"); //$NON-NLS-1$
-		list.add("two"); //$NON-NLS-1$
-		context= new EvaluationContext(null, list);
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));
-	}
-	
-	public void testInstanceofTrue() throws Exception {
-		B b= new B();
-		EvaluationContext context= new EvaluationContext(null, b);
-		
-		InstanceofExpression exp= new InstanceofExpression("org.eclipse.core.internal.expressions.tests.B"); //$NON-NLS-1$
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-
-		exp= new InstanceofExpression("org.eclipse.core.internal.expressions.tests.A"); //$NON-NLS-1$
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		
-		exp= new InstanceofExpression("org.eclipse.core.internal.expressions.tests.I"); //$NON-NLS-1$
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-	}
-	
-	public void testInstanceofFalse() throws Exception {
-		A a= new A();
-		EvaluationContext context= new EvaluationContext(null, a);
-		
-		InstanceofExpression exp= new InstanceofExpression("org.eclipse.core.internal.expressions.tests.B"); //$NON-NLS-1$
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));
-	}
-	
-	public void testIterateExpressionAndTrue() throws Exception {
-		final List result= new ArrayList();
-		Expression myExpression= new Expression() {
-			public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-				result.add(context.getDefaultVariable());
-				return EvaluationResult.TRUE;
-			}
-		};
-		IterateExpression exp= new IterateExpression("and"); //$NON-NLS-1$
-		exp.add(myExpression);
-		List input= new ArrayList();
-		input.add("one"); //$NON-NLS-1$
-		input.add("two"); //$NON-NLS-1$
-		EvaluationContext context= new EvaluationContext(null, input);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		assertTrue(result.equals(input));
-	}
-	
-	public void testIterateExpressionAndFalse() throws Exception {
-		final List result= new ArrayList();
-		Expression myExpression= new Expression() {
-			public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-				result.add(context.getDefaultVariable());
-				return EvaluationResult.FALSE;
-			}
-		};
-		IterateExpression exp= new IterateExpression("and"); //$NON-NLS-1$
-		exp.add(myExpression);
-		List input= new ArrayList();
-		input.add("one"); //$NON-NLS-1$
-		input.add("two"); //$NON-NLS-1$
-		EvaluationContext context= new EvaluationContext(null, input);
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));
-		assertTrue(result.size() == 1 && result.get(0).equals("one")); //$NON-NLS-1$
-	}
-	
-	public void testIterateExpressionOrTrue() throws Exception {
-		final List result= new ArrayList();
-		Expression myExpression= new Expression() {
-			public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-				result.add(context.getDefaultVariable());
-				return EvaluationResult.TRUE;
-			}
-		};
-		IterateExpression exp= new IterateExpression("or"); //$NON-NLS-1$
-		exp.add(myExpression);
-		List input= new ArrayList();
-		input.add("one"); //$NON-NLS-1$
-		input.add("two"); //$NON-NLS-1$
-		EvaluationContext context= new EvaluationContext(null, input);
-		assertTrue(EvaluationResult.TRUE == exp.evaluate(context));
-		assertTrue(result.size() == 1 && result.get(0).equals("one")); //$NON-NLS-1$
-	}
-	
-	public void testIterateExpressionOrFalse() throws Exception {
-		final List result= new ArrayList();
-		Expression myExpression= new Expression() {
-			public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
-				result.add(context.getDefaultVariable());
-				return EvaluationResult.FALSE;
-			}
-		};
-		IterateExpression exp= new IterateExpression("or"); //$NON-NLS-1$
-		exp.add(myExpression);
-		List input= new ArrayList();
-		input.add("one"); //$NON-NLS-1$
-		input.add("two"); //$NON-NLS-1$
-		EvaluationContext context= new EvaluationContext(null, input);
-		assertTrue(EvaluationResult.FALSE == exp.evaluate(context));
-		assertTrue(result.equals(input));
-	}
-	
-	public void testReadXMLExpression() throws Exception {
-		IExtensionRegistry registry= Platform.getExtensionRegistry();
-		IConfigurationElement[] ces= registry.getConfigurationElementsFor("org.eclipse.core.expressions.tests", "testParticipants"); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		IConfigurationElement enable= findExtension(ces, "test1").getChildren("enablement")[0]; //$NON-NLS-1$ //$NON-NLS-2$
-		Expression exp= ExpressionConverter.getDefault().perform(enable);
-		ref(exp);
-	}
-
-	private IConfigurationElement findExtension(IConfigurationElement[] ces, String id) {
-		for (int i= 0; i < ces.length; i++) {
-			if (id.equals(ces[i].getAttribute("id"))) //$NON-NLS-1$
-				return ces[i];
-		}
-		return null;
-	}
-	
-	protected void ref(Expression exp) {
-		
-	}
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/I.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/I.java
deleted file mode 100644
index 76dacf4..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/I.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-
-public interface I {
-
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/I_TypeExtender.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/I_TypeExtender.java
deleted file mode 100644
index 2ab494f..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/I_TypeExtender.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.internal.expressions.Assert;
-
-public class I_TypeExtender extends PropertyTester {
-
-	public boolean test(Object receiver, String method, Object[] args, Object expectedValue) {
-		if ("ordering".equals(method)) { //$NON-NLS-1$
-			return "I".equals(expectedValue); //$NON-NLS-1$
-		}
-		Assert.isTrue(false);
-		return false;
-	}
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/PropertyTesterTests.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/PropertyTesterTests.java
deleted file mode 100644
index 6eca6b3..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/PropertyTesterTests.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-
-import org.eclipse.core.internal.expressions.Property;
-import org.eclipse.core.internal.expressions.TypeExtensionManager;
-
-import org.osgi.framework.Bundle;
-
-public class PropertyTesterTests extends TestCase {
-	
-	private A a;
-	private B b;
-	private I i;
-
-	private static final TypeExtensionManager fgManager= new TypeExtensionManager("propertyTesters"); //$NON-NLS-1$
-	
-	public static Test suite() {
-		return new TestSuite(PropertyTesterTests.class);
-	}
-	
-	protected void setUp() throws Exception {
-		a= new A();
-		b= new B();
-		i= b;
-	}
-	
-	public void testSimple() throws Exception {
-		assertTrue(test(a, "simple", null,"simple")); //$NON-NLS-1$ //$NON-NLS-2$
-		// second pass to check if cache is populated correctly
-		assertTrue(test(a, "simple", null,"simple")); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	public void testInherited() throws Exception {
-		assertTrue(test(b, "simple", null, "simple")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(test(i, "simple", null, "simple")); //$NON-NLS-1$ //$NON-NLS-2$
-		// second pass to check if cache is populated correctly
-		assertTrue(test(b, "simple", null, "simple")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(test(i, "simple", null, "simple")); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	public void testUnknown() throws Exception {
-		try {
-			test(a, "unknown", null, null); //$NON-NLS-1$
-		} catch (CoreException e) {
-			return;
-		}
-		assertTrue(false);
-	}
-	
-	public void testOverridden() throws Exception {
-		assertTrue(test(a, "overridden", null, "A")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(test(b, "overridden", null, "B")); //$NON-NLS-1$ //$NON-NLS-2$
-		A b_as_a= b;
-		assertTrue(test(b_as_a, "overridden", null, "B")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(test(i, "overridden", null, "B")); //$NON-NLS-1$ //$NON-NLS-2$
-		// second pass to check if cache is populated correctly
-		assertTrue(test(a, "overridden", null, "A")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(test(b, "overridden", null, "B")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(test(b_as_a, "overridden", null, "B")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(test(i, "overridden", null, "B")); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	public void testOdering() throws Exception {
-		assertTrue(test(b, "ordering", null, "A")); //$NON-NLS-1$ //$NON-NLS-2$
-		I other= new I() {};
-		assertTrue(test(other, "ordering", null, "I")); //$NON-NLS-1$ //$NON-NLS-2$
-		// second pass to check if cache is populated correctly
-		assertTrue(test(b, "ordering", null, "A")); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(test(other, "ordering", null, "I")); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	public void testChaining() throws Exception {
-		assertTrue(test(a, "chaining", null, "A2")); //$NON-NLS-1$ //$NON-NLS-2$
-		// second pass to check if cache is populated correctly
-		assertTrue(test(a, "chaining", null, "A2")); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	// This test is questionable. It depends on if core runtime can
-	// guaratee any ordering in the plug-in registry.
-	public void testChainOrdering() throws Exception {
-		assertTrue(test(a, "chainOrdering", null, "A")); //$NON-NLS-1$ //$NON-NLS-2$
-		// second pass to check if cache is populated correctly
-		assertTrue(test(a, "chainOrdering", null, "A")); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	public void testWrongNameSpace() throws Exception {
-		try {
-			test(a, "differentNamespace", null, null); //$NON-NLS-1$
-		} catch (CoreException e) {
-			return;
-		}
-		assertTrue(false);		
-	}
-	
-	public void testDynamicPlugin() throws Exception {
-		if (true)
-			return;
-		A receiver= new A();
-		Property p= fgManager.getProperty(receiver, "org.eclipse.core.expressions.tests.dynamic", "testing"); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(!p.isInstantiated());
-		Bundle bundle= Platform.getBundle("org.eclipse.core.expressions.tests.dynamic"); //$NON-NLS-1$
-		bundle.start();
-		p= fgManager.getProperty(receiver, "org.eclipse.core.expressions.tests.dynamic", "testing"); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(p.isInstantiated());
-		bundle.stop();
-		p= fgManager.getProperty(receiver, "org.eclipse.core.expressions.tests.dynamic", "testing"); //$NON-NLS-1$ //$NON-NLS-2$
-		assertTrue(!p.isInstantiated());
-	}
-	
-	public void testDifferentNameSpace() throws Exception {
-		assertTrue(test("org.eclipse.core.internal.expressions.tests2", a, "differentNamespace", null, "A3"));		 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-	
-	private boolean test(Object receiver, String property, Object[] args, Object expectedValue) throws CoreException {
-		Property p= fgManager.getProperty(receiver, "org.eclipse.core.internal.expressions.tests", property); //$NON-NLS-1$
-		assertTrue(p.isInstantiated());
-		return p.test(receiver, args, expectedValue);
-	}
-	
-	private boolean test(String namespace, Object receiver, String property, Object[] args, Object expectedValue) throws CoreException {
-		Property p= fgManager.getProperty(receiver, namespace, property);
-		assertTrue(p.isInstantiated());
-		return p.test(receiver, args, expectedValue);
-	}	
-}
diff --git a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/TestAdapterFactory.java b/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/TestAdapterFactory.java
deleted file mode 100644
index 150fd2b..0000000
--- a/tests/org.eclipse.core.expressions.tests/src/org/eclipse/core/internal/expressions/tests/TestAdapterFactory.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.expressions.tests;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-
-public class TestAdapterFactory implements IAdapterFactory {
-
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (Adapter.class.equals(adapterType))
-			return new Adapter();
-		return null;
-	}
-
-	public Class[] getAdapterList() {
-		return new Class[] { Adapter.class };
-	}
-}
diff --git a/tests/org.eclipse.core.expressions.tests/test.xml b/tests/org.eclipse.core.expressions.tests/test.xml
deleted file mode 100644
index e651fb1..0000000
--- a/tests/org.eclipse.core.expressions.tests/test.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="testsuite" default="run" basedir=".">
-  <!-- The property ${eclipse-home} should be passed into this script -->
-  <!-- Set a meaningful default value for when it is not. -->
-  <property name="eclipse-home" value="${basedir}\..\.."/>
-
-  <!-- sets the properties eclipse-home, and library-file -->
-  <property name="plugin-name" value="org.eclipse.core.expressions.tests"/>
-  <property name="library-file"
-            value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
-
-  <!-- This target holds all initialization code that needs to be done for -->
-  <!-- all tests that are to be run. Initialization for individual tests -->
-  <!-- should be done within the body of the suite target. -->
-  <target name="init">
-    <tstamp/>
-    <delete>
-      <fileset dir="${eclipse-home}" includes="org*.xml"/>
-    </delete>
-  </target>
-
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite">
-    <property name="expressions-folder" 
-              value="${eclipse-home}/expressions_folder"/>
-    <delete dir="${expressions-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${expressions-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" 
-                value="org.eclipse.core.internal.expressions.tests.AllTests"/>
-    </ant>
-  </target>
-
-  <!-- This target holds code to cleanup the testing environment after -->
-  <!-- after all of the tests have been run. You can use this target to -->
-  <!-- delete temporary files that have been created. -->
-  <target name="cleanup">
-  </target>
-
-  <!-- This target runs the test suite. Any actions that need to happen -->
-  <!-- after all the tests have been run should go here. -->
-  <target name="run" depends="init,suite,cleanup">
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org*.xml"/>
-      <property name="output-file" value="${plugin-name}.xml"/>
-    </ant>
-  </target>
-
-  <target name="performance">
-  </target>
-	
-</project>
diff --git a/tests/org.eclipse.core.tests.harness/.classpath b/tests/org.eclipse.core.tests.harness/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/tests/org.eclipse.core.tests.harness/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.core.tests.harness/.cvsignore b/tests/org.eclipse.core.tests.harness/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/tests/org.eclipse.core.tests.harness/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/tests/org.eclipse.core.tests.harness/.project b/tests/org.eclipse.core.tests.harness/.project
deleted file mode 100644
index 060e874..0000000
--- a/tests/org.eclipse.core.tests.harness/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.tests.harness</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.core.tests.harness/.settings/org.eclipse.core.resources.prefs b/tests/org.eclipse.core.tests.harness/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index f94afed..0000000
--- a/tests/org.eclipse.core.tests.harness/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue May 25 14:59:26 EDT 2004
-encoding/<project>=ISO-8859-1
-eclipse.preferences.version=1
diff --git a/tests/org.eclipse.core.tests.harness/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.core.tests.harness/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index cb6b34b..0000000
--- a/tests/org.eclipse.core.tests.harness/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,79 +0,0 @@
-#Fri May 20 11:12:37 EDT 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=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=1000
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-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=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.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.missingDeprecatedAnnotation=ignore
-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=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/tests/org.eclipse.core.tests.harness/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.core.tests.harness/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 4dfecba..0000000
--- a/tests/org.eclipse.core.tests.harness/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jan 06 15:52:00 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="New classes and interfaces" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2006 IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n * \r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n *******************************************************************************/\r\n${package_declaration}\r\n\r\n/**\r\n * \r\n */\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">fail("4.99", ${exception_var});</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/tests/org.eclipse.core.tests.harness/META-INF/MANIFEST.MF b/tests/org.eclipse.core.tests.harness/META-INF/MANIFEST.MF
deleted file mode 100644
index 18f5f65..0000000
--- a/tests/org.eclipse.core.tests.harness/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Eclipse Core Tests Harness
-Bundle-SymbolicName: org.eclipse.core.tests.harness; singleton:=true
-Bundle-Version: 3.1.0
-Bundle-ClassPath: testharness.jar
-Bundle-Activator: org.eclipse.core.internal.compatibility.PluginActivator
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Export-Package: org.eclipse.core.tests.harness,
- org.eclipse.core.tests.session,
- org.eclipse.core.tests.session.samples
-Require-Bundle: org.eclipse.core.runtime.compatibility,
- org.junit,
- org.eclipse.pde.junit.runtime,
- org.eclipse.test.performance;resolution:=optional
-Eclipse-AutoStart: true
diff --git a/tests/org.eclipse.core.tests.harness/about.html b/tests/org.eclipse.core.tests.harness/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.core.tests.harness/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.core.tests.harness/build-tests.xml b/tests/org.eclipse.core.tests.harness/build-tests.xml
deleted file mode 100644
index fc634e2..0000000
--- a/tests/org.eclipse.core.tests.harness/build-tests.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0"?>
-<project name="Build Core Sniff" basedir="." default="init">
-
-  <property name="root" value="${basedir}/.."/>
-  <property name="temp" value="${root}/__temp"/>
-  <property name="plugins" value="${temp}/eclipse/plugins"/>
-
-  <target name="init">
-    <tstamp/>
-
-    <delete dir="${temp}"/>
-    <mkdir dir="${plugins}"/>
- 
-    <antcall target="buildPlugin">
-      <param name="pluginName" value="org.eclipse.osgi.tests" />
-      <param name="jarName" value="osgitests.jar" />
-    </antcall>
- 
-    <antcall target="buildPlugin">
-      <param name="pluginName" value="org.eclipse.core.tests.resources" />
-      <param name="jarName" value="resourcestests.jar" />
-    </antcall>
- 
-    <antcall target="buildPlugin">
-      <param name="pluginName" value="org.eclipse.core.tests.resources.saveparticipant" />
-      <param name="jarName" value="saveparticipant.jar" />
-    </antcall>
-
-    <antcall target="buildPlugin">
-      <param name="pluginName" value="org.eclipse.core.tests.resources.saveparticipant1" />
-      <param name="jarName" value="saveparticipant1.jar" />
-    </antcall>
-
-    <antcall target="buildPlugin">
-      <param name="pluginName" value="org.eclipse.core.tests.resources.saveparticipant2" />
-      <param name="jarName" value="saveparticipant2.jar" />
-    </antcall>
-
-    <antcall target="buildPlugin">
-      <param name="pluginName" value="org.eclipse.core.tests.resources.saveparticipant3" />
-      <param name="jarName" value="saveparticipant3.jar" />
-    </antcall>
-
-    <antcall target="buildPlugin">
-      <param name="pluginName" value="org.eclipse.core.tests.runtime" />
-      <param name="jarName" value="runtimetests.jar" />
-    </antcall>
-
-    <antcall target="buildPlugin">
-      <param name="pluginName" value="org.eclipse.core.tests.harness" />
-      <param name="jarName" value="testharness.jar" />
-    </antcall>
-
-    <zip zipfile="${basedir}/coreSniff${DSTAMP}.zip"
-       basedir="${temp}"
-    />
-
-    <delete dir="${temp}"/>
-    <eclipse.refreshLocal resource="org.eclipse.core.tests.harness"/>
-  </target>
-
-  <target name="buildPlugin">
-    <copy todir="${plugins}/${pluginName}">
-      <fileset dir="${root}/${pluginName}"/>
-    </copy>
-    <jar jarfile="${plugins}/${pluginName}/${jarName}"
-         basedir="${plugins}/${pluginName}/bin"
-    />
-    <delete dir="${plugins}/${pluginName}/bin"/>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/tests/org.eclipse.core.tests.harness/build.properties b/tests/org.eclipse.core.tests.harness/build.properties
deleted file mode 100644
index 6510f94..0000000
--- a/tests/org.eclipse.core.tests.harness/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.testharness.jar=src/
-bin.includes = testharness.jar,\
-               about.html,\
-               META-INF/
-
diff --git a/tests/org.eclipse.core.tests.harness/readme.txt b/tests/org.eclipse.core.tests.harness/readme.txt
deleted file mode 100644
index 1bb41ac..0000000
--- a/tests/org.eclipse.core.tests.harness/readme.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-README for org.eclipse.core.tests.harness
-
-This plug-in works as a library for core tests. It also holds the script
-to launch the core automated tests after the a build.
-In order to execute launch the tests, the test framework plug-ins have
-to available.
-
-Command line (from the eclipse home directory) for executing tests:
-
-java -cp startup.jar org.eclipse.core.launcher.Main -application org.eclipse.ant.core.antRunner -file plugins\org.eclipse.core.tests.harness\test.xml run -dev bin
\ No newline at end of file
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/BundleTestingHelper.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/BundleTestingHelper.java
deleted file mode 100644
index 27290e3..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/BundleTestingHelper.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import junit.framework.Assert;
-import org.eclipse.core.runtime.IRegistryChangeEvent;
-import org.eclipse.core.runtime.Platform;
-import org.osgi.framework.*;
-import org.osgi.service.packageadmin.PackageAdmin;
-
-public class BundleTestingHelper {
-
-	public static Bundle[] getBundles(BundleContext context, String symbolicName, String version) {
-		ServiceReference packageAdminReference = context.getServiceReference(PackageAdmin.class.getName());
-		if (packageAdminReference == null)
-			throw new IllegalStateException("No package admin service found");
-		PackageAdmin packageAdmin = (PackageAdmin) context.getService(packageAdminReference);
-		Bundle[] result = packageAdmin.getBundles(symbolicName, version);
-		context.ungetService(packageAdminReference);
-		return result;
-	}
-
-	/**
-	 * @deprecated
-	 */
-	public static Bundle installBundle(BundleContext context, String location) throws BundleException, MalformedURLException, IOException {
-		return installBundle("", context, location);
-	}
-
-	public static Bundle installBundle(String tag, BundleContext context, String location) throws BundleException, MalformedURLException, IOException {
-		URL entry = context.getBundle().getEntry(location);
-		if (entry == null)
-			Assert.fail(tag + " entry " + location + " could not be found in " + context.getBundle().getSymbolicName());
-		Bundle installed = context.installBundle(Platform.asLocalURL(entry).toExternalForm());
-		return installed;
-	}
-
-	/**
-	 * Do PackageAdmin.refreshPackages() in a synchronous way.  After installing
-	 * all the requested bundles we need to do a refresh and want to ensure that 
-	 * everything is done before returning.
-	 * @param bundles
-	 * TODO remove this since all we wanted was to resolve bundles, what is done by #resolveBundles in this class 
-	 */
-	//copied from EclipseStarter
-	public static void refreshPackages(BundleContext context, Bundle[] bundles) {
-		if (bundles.length == 0)
-			return;
-		ServiceReference packageAdminRef = context.getServiceReference(PackageAdmin.class.getName());
-		PackageAdmin packageAdmin = null;
-		if (packageAdminRef != null) {
-			packageAdmin = (PackageAdmin) context.getService(packageAdminRef);
-			if (packageAdmin == null)
-				return;
-		}
-		// TODO this is such a hack it is silly.  There are still cases for race conditions etc
-		// but this should allow for some progress...
-		// (patch from John A.)
-		final boolean[] flag = new boolean[] {false};
-		FrameworkListener listener = new FrameworkListener() {
-			public void frameworkEvent(FrameworkEvent event) {
-				if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED)
-					synchronized (flag) {
-						flag[0] = true;
-						flag.notifyAll();
-					}
-			}
-		};
-		context.addFrameworkListener(listener);
-		packageAdmin.refreshPackages(bundles);
-		synchronized (flag) {
-			while (!flag[0]) {
-				try {
-					flag.wait();
-				} catch (InterruptedException e) {
-					// who cares....
-				}
-			}
-		}
-		context.removeFrameworkListener(listener);
-		context.ungetService(packageAdminRef);
-	}
-
-	public static void resolveBundles(BundleContext context, Bundle[] bundles) {
-		ServiceReference packageAdminRef = context.getServiceReference(PackageAdmin.class.getName());
-		PackageAdmin packageAdmin = null;
-		if (packageAdminRef != null) {
-			packageAdmin = (PackageAdmin) context.getService(packageAdminRef);
-			if (packageAdmin == null)
-				return;
-		}
-		packageAdmin.resolveBundles(bundles);
-		context.ungetService(packageAdminRef);
-	}
-
-	public static void runWithBundles(String tag, Runnable runnable, BundleContext context, String[] locations, TestRegistryChangeListener listener) {
-		if (listener != null)
-			listener.register();
-		try {
-			Bundle[] installed = new Bundle[locations.length];
-			for (int i = 0; i < locations.length; i++)
-				try {
-					installed[i] = installBundle(tag + ".setup.0", context, locations[i]);
-					Assert.assertEquals(tag + ".setup.1." + locations[i], Bundle.INSTALLED, installed[i].getState());
-				} catch (BundleException e) {
-					CoreTest.fail(tag + ".setup.2" + locations[i], e);
-				} catch (IOException e) {
-					CoreTest.fail(tag + ".setup.3" + locations[i], e);
-				}
-			if (listener != null)
-				listener.reset();
-			BundleTestingHelper.resolveBundles(context, installed);
-			if (listener != null) {
-				IRegistryChangeEvent event = listener.getEvent(installed.length * 10000);
-				// ensure the contributions were properly added
-				Assert.assertNotNull(tag + ".setup.4", event);
-			}
-			try {
-				runnable.run();
-			} finally {
-				if (listener != null)
-					listener.reset();
-				// remove installed bundles
-				for (int i = 0; i < installed.length; i++)
-					try {
-						installed[i].uninstall();
-					} catch (BundleException e) {
-						CoreTest.fail(tag + ".tearDown.1." + locations[i], e);
-					}
-				BundleTestingHelper.resolveBundles(context, installed);
-				if (listener != null) {
-					IRegistryChangeEvent event = listener.getEvent(installed.length * 10000);
-					// ensure the contributions were properly added
-					Assert.assertNotNull(tag + ".tearDown.2", event);
-				}
-			}
-		} finally {
-			if (listener != null)
-				listener.unregister();
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/CancelingProgressMonitor.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/CancelingProgressMonitor.java
deleted file mode 100644
index f06203a..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/CancelingProgressMonitor.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-public class CancelingProgressMonitor extends TestProgressMonitor {
-	/**
-	 * @see IProgressMonitor#isCanceled
-	 */
-	public boolean isCanceled() {
-		return true;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/CoreTest.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/CoreTest.java
deleted file mode 100644
index 2593c18..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/CoreTest.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import java.io.*;
-import junit.framework.TestCase;
-import org.eclipse.core.runtime.*;
-
-/**
- * @since 3.1
- */
-public class CoreTest extends TestCase {
-
-	/** counter for generating unique random file system locations */
-	protected static int nextLocationCounter = 0;
-
-	// plug-in identified for the core.tests.harness plug-in.
-	public static final String PI_HARNESS = "org.eclipse.core.tests.harness";
-
-	public static void debug(String message) {
-		String id = "org.eclipse.core.tests.harness/debug";
-		String option = Platform.getDebugOption(id);
-		if (Boolean.TRUE.toString().equalsIgnoreCase(option))
-			System.out.println(message);
-	}
-
-	/**
-	 * Fails the test due to the given throwable.
-	 */
-	public static void fail(String message, Throwable e) {
-		// If the exception is a CoreException with a multistatus
-		// then print out the multistatus so we can see all the info.
-		if (e instanceof CoreException) {
-			IStatus status = ((CoreException) e).getStatus();
-			//if the status does not have an exception, print the stack for this one
-			if (status.getException() == null)
-				e.printStackTrace();
-			write(status, 0);
-		} else
-			e.printStackTrace();
-		fail(message + ": " + e);
-	}
-
-	private static void indent(OutputStream output, int indent) {
-		for (int i = 0; i < indent; i++)
-			try {
-				output.write("\t".getBytes());
-			} catch (IOException e) {
-				// ignore
-			}
-	}
-
-	public static void log(String pluginID, IStatus status) {
-		Platform.getLog(Platform.getBundle(pluginID)).log(status);
-	}
-
-	public static void log(String pluginID, Throwable e) {
-		log(pluginID, new Status(IStatus.ERROR, pluginID, IStatus.ERROR, "Error", e)); //$NON-NLS-1$
-	}
-
-	private static void write(IStatus status, int indent) {
-		PrintStream output = System.out;
-		indent(output, indent);
-		output.println("Severity: " + status.getSeverity());
-
-		indent(output, indent);
-		output.println("Plugin ID: " + status.getPlugin());
-
-		indent(output, indent);
-		output.println("Code: " + status.getCode());
-
-		indent(output, indent);
-		output.println("Message: " + status.getMessage());
-
-		if (status.getException() != null) {
-			indent(output, indent);
-			output.print("Exception: ");
-			status.getException().printStackTrace(output);
-		}
-
-		if (status.isMultiStatus()) {
-			IStatus[] children = status.getChildren();
-			for (int i = 0; i < children.length; i++)
-				write(children[i], indent + 1);
-		}
-	}
-
-	public CoreTest() {
-		super();
-	}
-
-	public CoreTest(String name) {
-		super(name);
-	}
-
-	/**
-	 * Asserts that a stream closes successfully. Null streams
-	 * are ignored, but failure to close the stream is reported as
-	 * an assertion failure.
-	 * @since 3.2
-	 */
-	protected void assertClose(InputStream stream) {
-		if (stream == null)
-			return;
-		try {
-			stream.close();
-		} catch (IOException e) {
-			fail("Failed close in assertClose", e);
-		}
-	}
-
-	/**
-	 * Asserts that a stream closes successfully. Null streams
-	 * are ignored, but failure to close the stream is reported as
-	 * an assertion failure.
-	 * @since 3.2
-	 */
-	protected void assertClose(OutputStream stream) {
-		if (stream == null)
-			return;
-		try {
-			stream.close();
-		} catch (IOException e) {
-			fail("Failed close in assertClose", e);
-		}
-	}
-
-	protected void assertEquals(String message, Object[] expected, Object[] actual) {
-		if (expected == null && actual == null)
-			return;
-		if (expected == null || actual == null)
-			fail(message);
-		if (expected.length != actual.length)
-			fail(message);
-		for (int i = 0; i < expected.length; i++)
-			assertEquals(message, expected[i], actual[i]);
-	}
-
-	protected void assertEquals(String message, Object[] expected, Object[] actual, boolean orderImportant) {
-		// if the order in the array must match exactly, then call the other method
-		if (orderImportant) {
-			assertEquals(message, expected, actual);
-			return;
-		}
-		// otherwise use this method and check that the arrays are equal in any order
-		if (expected == null && actual == null)
-			return;
-		if (expected == actual)
-			return;
-		if (expected == null || actual == null)
-			assertTrue(message + ".1", false);
-		if (expected.length != actual.length)
-			assertTrue(message + ".2", false);
-		boolean[] found = new boolean[expected.length];
-		for (int i = 0; i < expected.length; i++) {
-			for (int j = 0; j < expected.length; j++) {
-				if (!found[j] && expected[i].equals(actual[j]))
-					found[j] = true;
-			}
-		}
-		for (int i = 0; i < found.length; i++)
-			if (!found[i])
-				assertTrue(message + ".3." + i, false);
-	}
-
-	/**
-	 * Create the given file in the file system. 
-	 */
-	public void createFileInFileSystem(File file, InputStream contents) throws IOException {
-		file.getParentFile().mkdirs();
-		FileOutputStream output = new FileOutputStream(file);
-		transferData(contents, output);
-	}
-
-	protected void ensureDoesNotExistInFileSystem(java.io.File file) {
-		FileSystemHelper.clear(file);
-	}
-
-	public InputStream getContents(java.io.File target, String errorCode) {
-		try {
-			return new FileInputStream(target);
-		} catch (IOException e) {
-			fail(errorCode, e);
-		}
-		return null; // never happens
-	}
-
-	/**
-	 * Return an input stream with some the specified text to use
-	 * as contents for a file resource.
-	 */
-	public InputStream getContents(String text) {
-		return new ByteArrayInputStream(text.getBytes());
-	}
-
-	public IProgressMonitor getMonitor() {
-		return new FussyProgressMonitor();
-	}
-
-	/**
-	 * Return an input stream with some random text to use
-	 * as contents for a file resource.
-	 */
-	public InputStream getRandomContents() {
-		return new ByteArrayInputStream(getRandomString().getBytes());
-	}
-
-	/**
-	 * Returns a unique location on disk.  It is guaranteed that no file currently
-	 * exists at that location.  The returned location will be unique with respect 
-	 * to all other locations generated by this method in the current session.  
-	 * If the caller creates a folder or file at this location, they are responsible for 
-	 * deleting it when finished.
-	 */
-	public IPath getRandomLocation() {
-		return FileSystemHelper.getRandomLocation(getTempDir());
-	}
-
-	/**
-	 * Return String with some random text to use
-	 * as contents for a file resource.
-	 */
-	public String getRandomString() {
-		switch ((int) Math.round(Math.random() * 10)) {
-			case 0 :
-				return "este e' o meu conteudo (portuguese)";
-			case 1 :
-				return "ho ho ho";
-			case 2 :
-				return "I'll be back";
-			case 3 :
-				return "don't worry, be happy";
-			case 4 :
-				return "there is no imagination for more sentences";
-			case 5 :
-				return "customize yours";
-			case 6 :
-				return "foo";
-			case 7 :
-				return "bar";
-			case 8 :
-				return "foobar";
-			case 9 :
-				return "case 9";
-			default :
-				return "these are my contents";
-		}
-	}
-
-	public IPath getTempDir() {
-		return FileSystemHelper.getTempDir();
-	}
-
-	public String getUniqueString() {
-		return System.currentTimeMillis() + "-" + Math.random();
-	}
-
-	/**
-	 * Copy the data from the input stream to the output stream.
-	 * Close both streams when finished.
-	 */
-	public void transferData(InputStream input, OutputStream output) {
-		try {
-			try {
-				int c = 0;
-				while ((c = input.read()) != -1)
-					output.write(c);
-			} finally {
-				input.close();
-				output.close();
-			}
-		} catch (IOException e) {
-			e.printStackTrace();
-			assertTrue(e.toString(), false);
-		}
-	}
-
-	/**
-	 * Copy the data from the input stream to the output stream.
-	 * Do not close either of the streams.
-	 */
-	public void transferDataWithoutClose(InputStream input, OutputStream output) {
-		try {
-			int c = 0;
-			while ((c = input.read()) != -1)
-				output.write(c);
-		} catch (IOException e) {
-			e.printStackTrace();
-			assertTrue(e.toString(), false);
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/EclipseTestHarnessApplication.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/EclipseTestHarnessApplication.java
deleted file mode 100644
index 87f7c6f..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/EclipseTestHarnessApplication.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.*;
-import junit.framework.Test;
-import junit.textui.TestRunner;
-import org.eclipse.core.runtime.*;
-
-public class EclipseTestHarnessApplication implements IPlatformRunnable {
-	protected List tests;
-
-	/** command line arguments made available to all tests. */
-	public static String[] args;
-
-	/** true if workspace tests should log their deltas */
-	private static boolean deltas = false;
-
-	/** The id of the test harness plug-in */
-	private static final String PI_TESTHARNESS = "org.eclipse.core.tests.harness"; //$NON-NLS-1$
-
-	/** the simple id of the tests extension point in the test harness plug-in */
-	private static final String PT_TESTS = "tests"; //$NON-NLS-1$
-
-	public EclipseTestHarnessApplication() {
-		tests = new ArrayList(5);
-	}
-
-	public static boolean deltasEnabled() {
-		return deltas;
-	}
-
-	/**
-	 * Finds, creates and returns a prototypical test object for the test with
-	 * the given name/id.  Returns <code>null</code> if no such test is found
-	 * or the class defined by the test extension could not be found.
-	 * In either failure case a message is output on the System console.
-	 */
-	protected Object findTestFor(String testName) {
-		IExtensionPoint point = Platform.getPluginRegistry().getExtensionPoint(PI_TESTHARNESS, PT_TESTS);
-		IConfigurationElement[] elements = point.getConfigurationElements();
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
-			if (element.getName().equals("test")) {
-				String id = element.getAttribute("id");
-				if (id != null && id.equals(testName))
-					try {
-						return element.createExecutableExtension("run");
-					} catch (CoreException e) {
-						System.err.println("Could not instantiate test: " + testName);
-						e.printStackTrace();
-						return null;
-					}
-			}
-		}
-		System.out.println("Could not find test: " + testName);
-		return null;
-	}
-
-	protected String[] processCommandLine(String[] args) {
-		int[] configArgs = new int[100];
-		configArgs[0] = -1; // need to initialize the first element to something that could not be an index.
-		int configArgIndex = 0;
-		for (int i = 0; i < args.length; i++) {
-			boolean found = false;
-			// check for args without parameters (i.e., a flag arg)
-			// see if we should be logging deltas
-			if (args[i].equalsIgnoreCase("-deltas")) {
-				found = true;
-				deltas = true;
-			}
-			if (found) {
-				configArgs[configArgIndex++] = i;
-				continue;
-			}
-
-			// check for args with parameters
-			if (i == args.length - 1 || args[i + 1].startsWith("-"))
-				continue;
-
-			String arg = args[++i];
-			// check for the which test to run
-			if (args[i - 1].equalsIgnoreCase("-test")) {
-				found = true;
-				// fully qualified name of the test class to run
-				tests.add(arg);
-			}
-
-			// done checking for args.  Remember where an arg was found 
-			if (found) {
-				configArgs[configArgIndex++] = i - 1;
-				configArgs[configArgIndex++] = i;
-			}
-		}
-
-		//remove all the arguments consumed by this argument parsing
-		if (configArgIndex == 0)
-			return args;
-		String[] passThruArgs = new String[args.length - configArgIndex];
-		configArgIndex = 0;
-		int j = 0;
-		for (int i = 0; i < args.length; i++) {
-			if (i == configArgs[configArgIndex])
-				configArgIndex++;
-			else
-				passThruArgs[j++] = args[i];
-		}
-		return passThruArgs;
-	}
-
-	/**
-	 * Runs a set of tests as defined by the given command line args.
-	 * This is the platform application entry point.
-	 * @see IPlatformRunnable
-	 */
-	public Object run(Object userArgs) throws Exception {
-		args = processCommandLine((String[]) userArgs);
-		for (Iterator i = tests.iterator(); i.hasNext();)
-			run((String) i.next());
-		return null;
-	}
-
-	protected Object run(String testName) throws Exception {
-		Object testObject = findTestFor(testName);
-		if (testObject == null)
-			return null;
-		Class testClass = testObject.getClass();
-		Method method = testClass.getDeclaredMethod("suite", new Class[0]); //$NON-NLS-1$
-		Test suite = null;
-		try {
-			suite = (Test) method.invoke(testClass, new Object[0]);
-		} catch (InvocationTargetException e) {
-			if (e.getTargetException() instanceof Error)
-				throw (Error) e.getTargetException();
-			else
-				throw e;
-		}
-		run(suite);
-		return null;
-	}
-
-	protected void run(Test suite) throws Exception {
-		TestRunner.run(suite);
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/ExampleTest.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/ExampleTest.java
deleted file mode 100644
index 7a598fb..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/ExampleTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import java.util.Arrays;
-import java.util.Comparator;
-import junit.framework.*;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Platform;
-
-/**
- * Tests which use the Eclipse Platform runtime only.
- */
-public class ExampleTest extends TestCase {
-	/**
-	 * Need a zero argument constructor to satisfy the test harness.
-	 * This constructor should not do any real work nor should it be
-	 * called by user code.
-	 */
-	public ExampleTest() {
-		super(null);
-	}
-
-	public ExampleTest(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new TestSuite(ExampleTest.class);
-	}
-
-	public void testPluginRegistry() throws Throwable {
-		System.out.println();
-		IPluginDescriptor[] descriptors = Platform.getPluginRegistry().getPluginDescriptors();
-		Comparator c = new Comparator() {
-			public int compare(Object a, Object b) {
-				return ((IPluginDescriptor) a).getLabel().compareTo(((IPluginDescriptor) b).getLabel());
-			}
-		};
-		Arrays.sort(descriptors, c);
-		for (int i = 0; i < descriptors.length; i++) {
-			IPluginDescriptor descriptor = descriptors[i];
-			System.out.print(descriptor.isPluginActivated() ? "+\t" : "-\t");
-			System.out.println(descriptor.getLabel() + " (" + descriptor.getUniqueIdentifier() + ") [" + descriptor.getVersionIdentifier() + "]");
-		}
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/FileSystemComparator.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/FileSystemComparator.java
deleted file mode 100644
index ec82b9a..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/FileSystemComparator.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import java.io.*;
-import java.util.*;
-import junit.framework.Assert;
-
-/** 
- * A utility class that compares file system states. It is able to take snapshot of the file system and save ot into a 
- * text file for laer comparison. 
- */
-public class FileSystemComparator {
-
-	private class FileSummary {
-		boolean directory;
-		private String path;
-		private long size;
-		private long timestamp;
-
-		FileSummary(File file) {
-			if (!file.exists())
-				throw new IllegalArgumentException(file + " does not exist");
-			path = file.getAbsolutePath();
-			timestamp = file.lastModified();
-			size = file.isDirectory() ? -1 : file.lastModified();
-		}
-
-		FileSummary(String file, long timestamp, long size) {
-			this.path = file;
-			this.timestamp = timestamp;
-			this.size = directory ? -1 : size;
-		}
-
-		public void assertEquals(String tag, FileSummary other) {
-			if (!path.equals(other.path))
-				throw new IllegalArgumentException();
-			Assert.assertEquals(tag + " timestamps differ", timestamp, other.timestamp);
-			Assert.assertEquals(tag + " sizes differ", timestamp, other.timestamp);
-		}
-
-		public boolean equals(Object obj) {
-			return (obj instanceof FileSummary) && ((FileSummary) obj).path.equals(path);
-		}
-
-		public String getPath() {
-			return path;
-		}
-
-		public long getSize() {
-			return size;
-		}
-
-		public long getTimestamp() {
-			return timestamp;
-		}
-
-		public int hashCode() {
-			return path.hashCode();
-		}
-
-		public String toString() {
-			return path + " timestamp: " + timestamp + " size: " + size;
-		}
-	}
-
-	private static final String SNAPSHOT_FILE_NAME = "snapshot";
-
-	public void compareSnapshots(String tag, Object oldOne, Object newOne) {
-		Map oldSnapshot = (Map) oldOne;
-		Map newSnapshot = (Map) newOne;
-		boolean sameSize = oldSnapshot.size() == newSnapshot.size();
-		for (Iterator i = newSnapshot.values().iterator(); i.hasNext();) {
-			FileSummary newElement = (FileSummary) i.next();
-			FileSummary oldElement = (FileSummary) oldSnapshot.get(newElement.getPath());
-			Assert.assertNotNull(tag + " - " + newElement.getPath() + " was added", oldElement);
-			Assert.assertEquals(tag + " - " + newElement.getPath() + " changed timestamp ", oldElement.getTimestamp(), newElement.getTimestamp());
-			Assert.assertEquals(tag + " - " + newElement.getPath() + " changed size ", oldElement.getSize(), newElement.getSize());
-		}
-		// one or more entries were removed
-		// need to do the reverse (take the old snapshot as basis) to figure out what are the missing entries
-		if (!sameSize) {
-			for (Iterator i = oldSnapshot.values().iterator(); i.hasNext();) {
-				FileSummary oldElement = (FileSummary) i.next();
-				FileSummary newElement = (FileSummary) newSnapshot.get(oldElement.getPath());
-				Assert.assertNotNull(tag + " - " + oldElement.getPath() + " was removed", newElement);
-			}
-		}
-	}
-
-	public Object loadSnapshot(File rootLocation) throws IOException {
-		File summaryFile = new File(rootLocation, SNAPSHOT_FILE_NAME);
-		Map snapshot = new HashMap();
-		BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(summaryFile)));
-		try {
-			String line;
-			while ((line = in.readLine()) != null) {
-				String path = line;
-				long timestamp = Long.parseLong(in.readLine());
-				long size = Long.parseLong(in.readLine());
-				snapshot.put(path, new FileSummary(path, timestamp, size));
-			}
-		} finally {
-			in.close();
-		}
-		return snapshot;
-	}
-
-	public void saveSnapshot(Object toSave, File rootLocation) throws IOException {
-		File summaryFile = new File(rootLocation, SNAPSHOT_FILE_NAME);
-		PrintWriter out = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(summaryFile))));
-		Map snapshot = (Map) toSave;
-		try {
-			for (Iterator i = snapshot.values().iterator(); i.hasNext();) {
-				FileSummary element = (FileSummary) i.next();
-				out.println(element.getPath());
-				out.println(element.getTimestamp());
-				out.println(element.getSize());
-			}
-		} finally {
-			out.close();
-		}
-	}
-
-	/**
-	 * It is a good idea to skip the root location because when the snapshot file is saved, it may cause 
-	 * the timestamp for the parent direcotry to change on some OSes.
-	 */
-	public Object takeSnapshot(File rootLocation, boolean skip) {
-		Map snapshot = new HashMap();
-		takeSnapshot(snapshot, rootLocation, skip);
-		return snapshot;
-	}
-
-	private void takeSnapshot(Map snapshot, File rootLocation, boolean skip) {
-		FileSummary summary = new FileSummary(rootLocation);
-		if (!skip && !rootLocation.getName().equals(SNAPSHOT_FILE_NAME))
-			snapshot.put(rootLocation.getAbsolutePath(), summary);
-		if (!rootLocation.isDirectory())
-			return;
-		File[] entries = rootLocation.listFiles();
-		if (entries == null)
-			return;
-		for (int i = 0; i < entries.length; i++)
-			takeSnapshot(snapshot, entries[i], false);
-	}
-
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/FileSystemHelper.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/FileSystemHelper.java
deleted file mode 100644
index ae261f5..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/FileSystemHelper.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import java.io.IOException;
-import org.eclipse.core.runtime.*;
-
-/**
- * Home for file system-related utility methods. 
- */
-public class FileSystemHelper {
-	/** counter for generating unique random file system locations */
-	protected static int nextLocationCounter = 0;
-	private static final long MASK = 0x00000000FFFFFFFFL;
-
-	/*
-	 * Return the root directory for the temp dir.
-	 */
-	public static IPath getTempDir() {
-		String tempPath = System.getProperty("java.io.tmpdir");
-		try {
-			tempPath = new java.io.File(tempPath).getCanonicalPath();
-		} catch (IOException e) {
-			//ignore and use non-canonical path
-		}
-		return new Path(tempPath);
-	}
-
-	/**
-	 * Returns a unique location on disk.  It is guaranteed that no file currently
-	 * exists at that location.  The returned location will be unique with respect 
-	 * to all other locations generated by this method in the current session.  
-	 * If the caller creates a folder or file at this location, they are responsible for 
-	 * deleting it when finished.
-	 */
-	public static IPath getRandomLocation(IPath parent) {
-		IPath path = computeRandomLocation(parent);
-		while (path.toFile().exists()) {
-			try {
-				Thread.sleep(10);
-			} catch (InterruptedException e) {
-				// ignore
-			}
-			path = computeRandomLocation(parent);
-		}
-		return path;
-	}
-
-	public static IPath computeRandomLocation(IPath parent) {
-		long segment = (((long) ++nextLocationCounter) << 32) | (System.currentTimeMillis() & MASK);
-		return parent.append(Long.toString(segment));
-	}
-
-	public static void clear(java.io.File file) {
-		if (!file.exists())
-			return;
-		if (file.isDirectory()) {
-			String[] files = file.list();
-			if (files != null) // be careful since file.list() can return null
-				for (int i = 0; i < files.length; ++i)
-					clear(new java.io.File(file, files[i]));
-		}
-		if (!file.delete()) {
-			String message = "ensureDoesNotExistInFileSystem(File) could not delete: " + file.getPath();
-			CoreTest.log(CoreTest.PI_HARNESS, new Status(IStatus.WARNING, CoreTest.PI_HARNESS, IStatus.OK, message, null));
-		}
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/FussyProgressMonitor.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/FussyProgressMonitor.java
deleted file mode 100644
index e8c75ea..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/FussyProgressMonitor.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import junit.framework.AssertionFailedError;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * This class can be used for testing progress monitoring.
- * If you want to reuse one instance of this class for several
- * invocations, make sure that you call prepare() before every
- * invocation.
- * Call sanityCheck() after the operation whose progress monitoring
- * you are testing.
- */
-public class FussyProgressMonitor extends TestProgressMonitor {
-	public class FussyProgressAssertionFailed extends AssertionFailedError {
-		/**
-		 * All serializable objects should have a stable serialVersionUID
-		 */
-		private static final long serialVersionUID = 1L;
-
-		FussyProgressAssertionFailed(String name) {
-			super(name);
-		}
-	}
-
-	private static final double EPS_FACTOR = 0.01;
-	private static final long NOTICEABLE_DELAY = 1000; // milliseconds
-	private boolean beginTaskCalled = false;
-	private long beginTime;
-	private boolean canceled = false;
-	private int doneCalls = 0;
-	private boolean hasFailed = false;
-	private boolean sanityCheckCalled = true;
-	private String taskName;
-	private int totalWork;
-	private double workedSoFar = 0;
-	private Job job;
-	public FussyProgressMonitor() {
-		prepare();
-	}
-	/**
-	 * Creates a fussy progress monitor that is associated with a particular job.
-	 * On assertion failure the job name will be included in the failure message.
-	 * @param job
-	 */
-	public FussyProgressMonitor(Job job) {
-		this();
-		this.job = job;
-	}
-
-	/**
-	 * 
-	 * @param reason java.lang.String
-	 * @param condition boolean
-	 */
-	private void assertTrue(String reason, boolean condition) {
-		// silently ignore follow-up failures
-		if (hasFailed)
-			return;
-		if (!condition) {
-			hasFailed = true;
-			if (job != null)
-				reason += " in job: " + job.getName();
-			throw new FussyProgressAssertionFailed(reason);
-		}
-		//Assert.assert(reason, condition);
-	}
-
-	/**
-	 * @see IProgressMonitor#beginTask
-	 */
-	public void beginTask(String name, int totalWork) {
-		//if (beginTaskCalled && doneCalls > 0) {
-		// this is a second call to beginTask which is allowed because
-		// the previous task is done.
-		//prepare();
-		//}
-		assertTrue("beginTask may only be called once (old name=" + taskName + ")", beginTaskCalled == false);
-		beginTaskCalled = true;
-		taskName = name;
-		assertTrue("total work must be positive or UNKNOWN", totalWork > 0 || totalWork == UNKNOWN);
-		this.totalWork = totalWork;
-		beginTime = System.currentTimeMillis();
-	}
-
-	/**
-	 * @see IProgressMonitor#done
-	 */
-	public void done() {
-		assertTrue("done must be called after beginTask", beginTaskCalled);
-		assertTrue("done can only be called once", doneCalls == 0);
-		//assert("done is called before all work is done", totalWork==UNKNOWN || totalWork==workedSoFar);
-		workedSoFar = totalWork;
-		doneCalls++;
-	}
-
-	public void internalWorked(double work) {
-		assertTrue("can accept calls to worked/internalWorked only after beginTask", beginTaskCalled);
-		assertTrue("can accept calls to worked/internalWorked only before done is called", doneCalls == 0);
-		assertTrue("amount worked should be positive, not " + work, work >= 0);
-		if (work == 0)
-			CoreTest.debug("INFO: amount worked should be positive, not " + work);
-		workedSoFar += work;
-		assertTrue("worked " + (workedSoFar - totalWork) + " more than totalWork", totalWork == UNKNOWN || workedSoFar <= totalWork + (totalWork * EPS_FACTOR));
-	}
-
-	/**
-	 * @see IProgressMonitor#isCanceled
-	 */
-	public boolean isCanceled() {
-		return canceled;
-	}
-
-	/**
-	 * should be called before every use of a FussyProgressMonitor
-	 */
-	public void prepare() {
-		//if (!sanityCheckCalled)
-		//EclipseWorkspaceTest.log("sanityCheck has not been called for previous use");
-		sanityCheckCalled = false;
-		taskName = null;
-		totalWork = 0;
-		workedSoFar = 0;
-		beginTaskCalled = false;
-		doneCalls = 0;
-		hasFailed = false;
-	}
-
-	/**
-	 *  should be called after every use of a FussyProgressMonitor
-	 */
-	public void sanityCheck() {
-		if (sanityCheckCalled)
-			CoreTest.debug("sanityCheck has already been called");
-		sanityCheckCalled = true;
-		//	EclipseWorkspaceTest.log("sanity checking: " + taskName + " : " + (System.currentTimeMillis() - beginTime) + " ms, " + workedSoFar);
-		long duration = System.currentTimeMillis() - beginTime;
-		if (duration > NOTICEABLE_DELAY && beginTaskCalled) {
-			assertTrue("this operation took: " + duration + "ms, it should report progress", workedSoFar > 0);
-		}
-		assertTrue("done has not been called on ProgressMonitor", hasFailed || !beginTaskCalled || doneCalls > 0);
-	}
-
-	/**
-	 * @see IProgressMonitor#setCanceled
-	 */
-	public void setCanceled(boolean b) {
-		canceled = b;
-	}
-
-	/**
-	 * @see IProgressMonitor#setTaskName
-	 */
-	public void setTaskName(String name) {
-		taskName = name;
-	}
-
-	/**
-	 * @see IProgressMonitor#subTask
-	 */
-	public void subTask(String name) {
-		// do nothing
-	}
-
-	/**
-	 * @see IProgressMonitor#worked
-	 */
-	public void worked(int work) {
-		internalWorked(work);
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/LoggingPerformanceTestResult.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/LoggingPerformanceTestResult.java
deleted file mode 100644
index e50ae67..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/LoggingPerformanceTestResult.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import java.io.*;
-import java.util.Enumeration;
-import java.util.Iterator;
-import junit.framework.TestFailure;
-
-/**
- * A LoggingPerformanceTestResult adds the ability to create an HTML or
- * other output file, and have test results written to that file instead
- * of the standard output.
- */
-public class LoggingPerformanceTestResult extends PerformanceTestResult {
-	private static PrintWriter createWriter(File logFile) {
-		try {
-			PrintWriter writer = new PrintWriter(new FileOutputStream(logFile), true);
-			return writer;
-		} catch (IOException e) {
-			System.out.println("Unable to open log output file: " + logFile);
-			return new PrintWriter(System.out, true);
-		}
-	}
-
-	public LoggingPerformanceTestResult(File logFile) {
-		super(createWriter(logFile));
-		printHTMLHeader(output);
-	}
-
-	/**
-	 * Logs the given string in the test log file
-	 */
-	public synchronized void log(String s) {
-		output.println(s);
-	}
-
-	/**
-	 * Prints the test result
-	 */
-	public synchronized void print() {
-		try {
-			super.print();
-			printHTMLTrailer(output);
-		} finally {
-			output.flush();
-			output.close();
-		}
-	}
-
-	/**
-	 * Prints the errors to the standard output
-	 */
-	protected void printErrors(PrintWriter out) {
-		out.println("<h3>Error summary</h3>");
-		int count = errorCount();
-		if (count != 0) {
-			if (count == 1)
-				out.println("There was " + count + " error:<p>");
-			else
-				out.println("There were " + count + " errors:<p>");
-			int i = 1;
-			for (Enumeration e = errors(); e.hasMoreElements(); i++) {
-				TestFailure failure = (TestFailure) e.nextElement();
-				out.println(i + ") " + failure.failedTest() + "<p>");
-				failure.thrownException().printStackTrace(out);
-				out.println("<p>");
-			}
-		} else {
-			out.println("No errors reported.");
-		}
-	}
-
-	/**
-	 * Prints the failures to the output
-	 */
-	protected void printFailures(PrintWriter out) {
-		out.println("<h3>Failure summary</h3>");
-		int count = failureCount();
-		if (count != 0) {
-			if (count == 1)
-				out.println("There was " + count + " failure:<p>");
-			else
-				out.println("There were " + count + " failures:<p>");
-			int i = 1;
-			for (Enumeration e = failures(); e.hasMoreElements(); i++) {
-				TestFailure failure = (TestFailure) e.nextElement();
-				out.println(i + ") " + failure.failedTest() + "<p>");
-				failure.thrownException().printStackTrace(out);
-				out.println("<p>");
-			}
-		} else {
-			out.println("No failures reported.");
-		}
-	}
-
-	/**
-	 * Prints the header of the report
-	 */
-	protected void printHeader(PrintWriter out) {
-	}
-
-	/**
-	 * Prints the header of the report
-	 */
-	protected void printHTMLHeader(PrintWriter out) {
-		StringBuffer buf = new StringBuffer();
-		buf.append("<html>\n<head>\n<title>Eclipse Performance Test Output Page</title>");
-		buf.append("</head>\n<body>\n");
-		out.println(buf.toString());
-	}
-
-	/**
-	 * Prints the header of the report
-	 */
-	protected void printHTMLTrailer(PrintWriter out) {
-		out.println("</body>");
-		out.println("</html>");
-	}
-
-	/**
-	 * Prints the timings of the result.
-	 */
-
-	protected void printTimings(PrintWriter out) {
-		out.println("<h3>Timing summary</h3>");
-		out.println("<ul>");
-
-		// print out all timing results to the console
-		for (Iterator it = timerList.iterator(); it.hasNext();) {
-			PerformanceTimer timer = (PerformanceTimer) it.next();
-			out.println("<li>" + timer.getName() + " : " + timer.getElapsedTime() + " ms</li>");
-		}
-		out.println("</ul>");
-	}
-
-	/**
-	 * Start the timer with the given name.  If the timer has already
-	 * been created, send it a startTiming message.  If not, create it
-	 * and send the new timer the startTiming message.
-	 */
-
-	public synchronized void startTimer(String timerName) {
-		super.startTimer(timerName);
-		//log("Starting timer: " + timerName);
-	}
-
-	/**
-	 * Look up the timer with the given name and send it a stopTiming
-	 * message.  If the timer does not exist, report an error.
-	 */
-
-	public synchronized void stopTimer(String timerName) {
-		super.stopTimer(timerName);
-		//log("Stopping timer: " + timerName);
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/PerformanceTestResult.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/PerformanceTestResult.java
deleted file mode 100644
index f0965f3..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/PerformanceTestResult.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import java.io.PrintWriter;
-import java.util.*;
-import junit.framework.*;
-
-/**
- * Test result for a performance test.  Keeps track of all timers that
- * have been created within the test. 
- */
-public class PerformanceTestResult extends TestResult {
-	protected PrintWriter output;
-	protected ArrayList timerList = new ArrayList();
-	protected HashMap timers = new HashMap();
-
-	public PerformanceTestResult() {
-		this(new PrintWriter(System.out));
-	}
-
-	public PerformanceTestResult(PrintWriter outputStream) {
-		this.output = outputStream;
-	}
-
-	/**
-	 * Informs the result that a test was completed.
-	 */
-	public synchronized void endTest(Test test) {
-		print();
-	}
-
-	/**
-	 * Prints the test result
-	 */
-	public synchronized void print() {
-		stopTimers();
-		printHeader(output);
-		printErrors(output);
-		printFailures(output);
-		printTimings(output);
-	}
-
-	/**
-	 * Prints the errors to the output
-	 */
-	protected void printErrors(PrintWriter out) {
-		int count = errorCount();
-		if (count != 0) {
-			if (count == 1)
-				out.println("There was " + count + " error:");
-			else
-				out.println("There were " + count + " errors:");
-			int i = 1;
-			for (Enumeration e = errors(); e.hasMoreElements(); i++) {
-				TestFailure failure = (TestFailure) e.nextElement();
-				out.println(i + ") " + failure.failedTest());
-				failure.thrownException().printStackTrace(out);
-			}
-		}
-	}
-
-	/**
-	 * Prints the failures to the output
-	 */
-	protected void printFailures(PrintWriter out) {
-		int count = failureCount();
-		if (count != 0) {
-			if (count == 1)
-				out.println("There was " + count + " failure:");
-			else
-				out.println("There were " + count + " failures:");
-			int i = 1;
-			for (Enumeration e = failures(); e.hasMoreElements(); i++) {
-				TestFailure failure = (TestFailure) e.nextElement();
-				out.println(i + ") " + failure.failedTest());
-				failure.thrownException().printStackTrace(out);
-			}
-		}
-	}
-
-	/**
-	 * Prints the header of the report
-	 */
-	protected void printHeader(PrintWriter out) {
-		if (wasSuccessful()) {
-			out.println();
-			out.print("OK");
-			out.println(" (" + runCount() + " tests)");
-		} else {
-			out.println();
-			out.println("!!!FAILURES!!!");
-			out.println("Test Results:");
-			out.println("Run: " + runCount() + " Failures: " + failureCount() + " Errors: " + errorCount());
-		}
-	}
-
-	/**
-	 * Prints the timings of the result.
-	 */
-	protected void printTimings(PrintWriter out) {
-		// print out all timing results to the console
-		for (Iterator it = timerList.iterator(); it.hasNext();) {
-			PerformanceTimer timer = (PerformanceTimer) it.next();
-			out.println("Timing " + timer.getName() + " : " + timer.getElapsedTime() + " ms ");
-		}
-	}
-
-	/**
-	 * Start the test
-	 */
-	public synchronized void startTest(Test test) {
-		super.startTest(test);
-		System.out.print(".");
-	}
-
-	/**
-	 * Start the timer with the given name.  If the timer has already
-	 * been created, send it a startTiming message.  If not, create it
-	 * and send the new timer the startTiming message.
-	 */
-
-	public synchronized void startTimer(String timerName) {
-		PerformanceTimer timer = (PerformanceTimer) timers.get(timerName);
-		if (timer == null) {
-			timer = new PerformanceTimer(timerName);
-			timers.put(timerName, timer);
-			timerList.add(timer);
-		}
-		timer.startTiming();
-	}
-
-	/**
-	 * Look up the timer with the given name and send it a stopTiming
-	 * message.  If the timer does not exist, report an error.
-	 */
-	public synchronized void stopTimer(String timerName) {
-		PerformanceTimer timer = (PerformanceTimer) timers.get(timerName);
-		if (timer == null) {
-			throw new Error(timerName + " is not a valid timer name ");
-		}
-		timer.stopTiming();
-	}
-
-	/**
-	 * Stops all timers
-	 */
-	protected void stopTimers() {
-		for (Iterator it = timerList.iterator(); it.hasNext();) {
-			((PerformanceTimer) it.next()).stopTiming();
-		}
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/PerformanceTestRunner.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/PerformanceTestRunner.java
deleted file mode 100644
index 951d80d..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/PerformanceTestRunner.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the 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.tests.harness;
-
-import junit.framework.TestCase;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.test.performance.Performance;
-import org.eclipse.test.performance.PerformanceMeter;
-
-/**
- * Helper class for executing a performance test. Takes care of starting, stopping,
- * and commiting performance timers.
- */
-public abstract class PerformanceTestRunner {
-	
-	private String regressionReason;
-	
-	public void setRegressionReason(String comment) {
-		this.regressionReason = comment;
-	}
-
-	/**
-	 * Implemented by subclasses to perform the work to be measured.
-	 */
-	protected abstract void test();
-
-	/**
-	 * Executes the performance test the given number of times. Use the outer time
-	 * to execute the test several times in order to obtain a normalized average. Use
-	 * the inner loop for very fast tests that would otherwise be difficult to measure
-	 * due to Java's poor timer granularity.  The inner loop is not needed for long
-	 * tests that typically take more than a second to execute.
-	 * 
-	 * @param testCase The test that is running (used to obtain an appropriate meter)
-	 * @param outer The number of repetitions of the test.
-	 * @param inner The number of repetitions within the performance timer.
-	 */
-	public final void run(TestCase testCase, int outer, int inner) {
-		Performance perf = Performance.getDefault();
-		PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(testCase));
-		if (regressionReason != null)
-			perf.setComment(meter, Performance.EXPLAINS_DEGRADATION_COMMENT, regressionReason);
-		try {
-			for (int i = 0; i < outer; i++) {
-				setUp();
-				meter.start();
-				for (int j = 0; j < inner; j++)
-					test();
-				meter.stop();
-				tearDown();
-			}
-			meter.commit();
-			perf.assertPerformance(meter);
-		} catch (CoreException e) {
-			CoreTest.fail("Failed performance test", e);
-		} finally {
-			meter.dispose();
-		}
-	}
-	protected void setUp() throws CoreException{
-		// subclasses to override
-	}
-
-	protected void tearDown() throws CoreException {
-		// subclasses to override
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/PerformanceTimer.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/PerformanceTimer.java
deleted file mode 100644
index a43a4b2..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/PerformanceTimer.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-/**
- * The timer class used by performance tests.
- */
-class PerformanceTimer {
-	private String fName;
-	private long fElapsedTime;
-	private long fStartTime;
-
-	/**
-	 * 
-	 */
-	public PerformanceTimer(String name) {
-		fName = name;
-		fElapsedTime = 0;
-		fStartTime = 0;
-	}
-
-	/**
-	 * Return the elapsed time.
-	 */
-	public long getElapsedTime() {
-		return fElapsedTime;
-	}
-
-	/**
-	 * Return the timer name.
-	 */
-	public String getName() {
-		return fName;
-	}
-
-	/**
-	 * Start the timer.
-	 */
-	public void startTiming() {
-		fStartTime = System.currentTimeMillis();
-	}
-
-	/**
-	 * Stop the timer, add the elapsed time to the total.
-	 */
-	public void stopTiming() {
-		if (fStartTime == 0)
-			return;
-		long timeNow = System.currentTimeMillis();
-		fElapsedTime += (timeNow - fStartTime);
-		fStartTime = 0;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestBarrier.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestBarrier.java
deleted file mode 100644
index 0dfccc0..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestBarrier.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import junit.framework.Assert;
-
-/**
- * This class acts as an implementation of a barrier that is appropriate for
- * concurrency test cases that want to fail if a thread fails to achieve a
- * particular state in a reasonable amount of time. This prevents test suites
- * from hanging indefinitely if a concurrency bug is found that would normally
- * result in an indefinite hang.
- */
-public class TestBarrier {
-
-	/**
-	 * Convience status constant that can be interpreted differently by each
-	 * test.
-	 */
-	public static final int STATUS_BLOCKED = 6;
-	/**
-	 * Convience status constant that can be interpreted differently by each
-	 * test.
-	 */
-	public static final int STATUS_DONE = 5;
-	/**
-	 * Convience status constant that can be interpreted differently by each
-	 * test.
-	 */
-	public static final int STATUS_RUNNING = 3;
-	/**
-	 * Convience status constant that can be interpreted differently by each
-	 * test.
-	 */
-	public static final int STATUS_START = 1;
-	/**
-	 * Convience status constant that can be interpreted differently by each
-	 * test.
-	 */
-	public static final int STATUS_WAIT_FOR_DONE = 4;
-	/**
-	 * Convience status constant that can be interpreted differently by each
-	 * test.
-	 */
-	public static final int STATUS_WAIT_FOR_RUN = 2;
-	/**
-	 * Convience status constant that can be interpreted differently by each
-	 * test.
-	 */
-	public static final int STATUS_WAIT_FOR_START = 0;
-	private final int myIndex;
-	/**
-	 * The status array and index for this barrier object
-	 */
-	private final int[] myStatus;
-
-	/**
-	 * Blocks the calling thread until the status integer at the given index
-	 * is set to the given value. Fails if the status change does not occur in 
-	 * a reasonable amount of time.
-	 * @param statuses the array of statuses that represent the states of
-	 * an array of jobs or threads
-	 * @param index the index into the statuses array that the calling
-	 * thread is waiting for
-	 * @param status the status that the calling thread should wait for
-	 */
-	private static void doWaitForStatus(int[] statuses, int index, int status, int timeout) {
-		int i = 0;
-		while (statuses[index] != status) {
-			try {
-				Thread.yield();
-				Thread.sleep(100);
-				Thread.yield();
-			} catch (InterruptedException e) {
-				//ignore
-			}
-			//sanity test to avoid hanging tests
-			Assert.assertTrue("Timeout waiting for status to change from " + getStatus(statuses[index]) + " to " + getStatus(status), i++ < timeout);
-		}
-	}
-
-	private static String getStatus(int status) {
-		switch (status) {
-			case STATUS_WAIT_FOR_START :
-				return "WAIT_FOR_START";
-			case STATUS_START :
-				return "START";
-			case STATUS_WAIT_FOR_RUN :
-				return "WAIT_FOR_RUN";
-			case STATUS_RUNNING :
-				return "RUNNING";
-			case STATUS_WAIT_FOR_DONE :
-				return "WAIT_FOR_DONE";
-			case STATUS_DONE :
-				return "DONE";
-			case STATUS_BLOCKED :
-				return "BLOCKED";
-			default :
-				return "UNKNOWN_STATUS";
-		}
-	}
-
-	public static void waitForStatus(int[] location, int status) {
-		doWaitForStatus(location, 0, status, 100);
-	}
-
-	/**
-	 * Blocks the current thread until the given variable is set to the given
-	 * value Times out after a predefined period to avoid hanging tests
-	 */
-	public static void waitForStatus(int[] location, int index, int status) {
-		doWaitForStatus(location, index, status, 100);
-	}
-
-	/**
-	 * Creates a new test barrier suitable for a single thread
-	 */
-	public TestBarrier() {
-		this(new int[1], 0);
-	}
-
-	/**
-	 * Creates a new test barrier on the provided status array, suitable for 
-	 * acting as a barrier for multiple threads.
-	 */
-	public TestBarrier(int[] location, int index) {
-		this.myStatus = location;
-		this.myIndex = index;
-	}
-
-	/**
-	 * Sets this barrier object's status.
-	 */
-	public void setStatus(int status) {
-		myStatus[myIndex] = status;
-	}
-
-	/**
-	 * Blocks the current thread until the receiver's status is set to the given
-	 * value. Times out after a predefined period to avoid hanging tests
-	 */
-	public void waitForStatus(int status) {
-		waitForStatus(myStatus, myIndex, status);
-	}
-
-	/**
-	 * The same as other barrier methods, except it will not fail if the job
-	 * does not start in a "reasonable" time. This is only appropriate for tests
-	 * that are explicitly very long running.
-	 */
-	public void waitForStatusNoFail(int status) {
-		doWaitForStatus(myStatus, myIndex, status, 100000);
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestJob.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestJob.java
deleted file mode 100644
index eae1305..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestJob.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * A job that runs for a specified amount of ticks, where each tick is represented
- * by a sleep for a specified amount of milliseconds.
- */
-public class TestJob extends Job {
-	private int ticks;
-	private long tickLength;
-	private int runCount = 0;
-
-	/**
-	 * A job that runs for one second in 100 millisecond increments.
-	 */
-	public TestJob(String name) {
-		this(name, 10, 100);
-	}
-
-	/**
-	 * A job that runs for the specified number of ticks at the
-	 * given tick duration.
-	 * @param name The name of this test job
-	 * @param ticks The number of work ticks that this job should perform
-	 * @param tickDuration The duration in milliseconds of each work tick
-	 */
-	public TestJob(String name, int ticks, long tickDuration) {
-		super(name);
-		this.ticks = ticks;
-		this.tickLength = tickDuration;
-	}
-
-	/**
-	 * Returns the number of times this job instance has been run, possibly including 
-	 * the current invocation if the job is currently running.
-	 */
-	public synchronized int getRunCount() {
-		return runCount;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus run(IProgressMonitor monitor) {
-		setRunCount(getRunCount() + 1);
-		//must have positive work
-		monitor.beginTask(getName(), ticks <= 0 ? 1 : ticks);
-		try {
-			for (int i = 0; i < ticks; i++) {
-				monitor.subTask("Tick: " + i);
-				if (monitor.isCanceled())
-					return Status.CANCEL_STATUS;
-				try {
-					Thread.sleep(tickLength);
-				} catch (InterruptedException e) {
-					//ignore
-				}
-				monitor.worked(1);
-			}
-			if (ticks <= 0)
-				monitor.worked(1);
-		} finally {
-			monitor.done();
-		}
-		return Status.OK_STATUS;
-	}
-
-	private synchronized void setRunCount(int count) {
-		runCount = count;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestProgressMonitor.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestProgressMonitor.java
deleted file mode 100644
index 84301df..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestProgressMonitor.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-public abstract class TestProgressMonitor implements IProgressMonitor {
-
-	/**
-	 * @see IProgressMonitor#beginTask
-	 */
-	public void beginTask(String name, int totalWork) {
-		//do nothing
-	}
-
-	/**
-	 * @see IProgressMonitor#done
-	 */
-	public void done() {
-		//do nothing
-	}
-
-	public void internalWorked(double work) {
-		//do nothing
-	}
-
-	/**
-	 * @see IProgressMonitor#isCanceled
-	 */
-	public boolean isCanceled() {
-		return false;
-	}
-
-	/**
-	 * @see IProgressMonitor#setCanceled
-	 */
-	public void setCanceled(boolean b) {
-		//do nothing
-	}
-
-	/**
-	 * @see IProgressMonitor#setTaskName
-	 */
-	public void setTaskName(String name) {
-		//do nothing
-	}
-
-	/**
-	 * @see IProgressMonitor#subTask
-	 */
-	public void subTask(String name) {
-		//do nothing
-	}
-
-	/**
-	 * @see IProgressMonitor#worked
-	 */
-	public void worked(int work) {
-		//do nothing
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestRegistryChangeListener.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestRegistryChangeListener.java
deleted file mode 100644
index ce238dc..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/harness/TestRegistryChangeListener.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.harness;
-
-import java.util.LinkedList;
-import java.util.List;
-import org.eclipse.core.runtime.*;
-
-/**
- * Allows test cases to wait for event notification so they can make assertions on the event.  
- */
-public class TestRegistryChangeListener implements IRegistryChangeListener {
-	private List events = new LinkedList();
-	private String xpNamespace;
-	private String xpId;
-	private String extNamespace;
-	private String extId;
-
-	/**
-	 * Creates a new listener. The parameters allow filtering events based on extension point/extension's 
-	 * namespaces/ids.	
-	 */
-	public TestRegistryChangeListener(String xpNamespace, String xpId, String extNamespace, String extId) {
-		if (xpId != null && xpNamespace == null)
-			throw new IllegalArgumentException();
-		if (extId != null && extNamespace == null)
-			throw new IllegalArgumentException();
-		if (xpId == null && extId != null)
-			throw new IllegalArgumentException();
-		this.xpNamespace = xpNamespace;
-		this.xpId = xpId;
-		this.extNamespace = extNamespace;
-		this.extId = extId;
-	}
-
-	/**
-	 * @see IRegistryChangeListener#registryChanged
-	 */
-	public synchronized void registryChanged(IRegistryChangeEvent newEvent) {
-		if (xpId != null) {
-			if (extId != null) {
-				if (newEvent.getExtensionDelta(xpNamespace, xpId, extNamespace + '.' + extId) == null)
-					return;
-			} else if (newEvent.getExtensionDeltas(xpNamespace, xpId).length == 0)
-				return;
-		}
-		this.events.add(newEvent);
-		notify();
-	}
-
-	/**
-	 * Returns the first event that is received, blocking for at most <code>timeout</code> milliseconds.
-	 * Returns <code>null</code> if a event was not received for the time allowed.
-	 * 
-	 * @param timeout the maximum time to wait in milliseconds. If zero, this method will 
-	 * block until an event is received 
-	 * @return the first event received, or <code>null</code> if none was received
-	 */
-	public synchronized IRegistryChangeEvent getEvent(long timeout) {
-		if (!events.isEmpty())
-			return (IRegistryChangeEvent) events.remove(0);
-		try {
-			wait(timeout);
-		} catch (InterruptedException e) {
-			// who cares?
-		}
-		return events.isEmpty() ? null : (IRegistryChangeEvent) events.remove(0);
-	}
-
-	public void register() {
-		Platform.getExtensionRegistry().addRegistryChangeListener(this, xpNamespace);
-	}
-
-	public void unregister() {
-		Platform.getExtensionRegistry().removeRegistryChangeListener(this);
-	}
-	
-	public synchronized void reset() {
-		events.clear();
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/ConfigurationSessionTestSuite.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/ConfigurationSessionTestSuite.java
deleted file mode 100644
index 7441ce6..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/ConfigurationSessionTestSuite.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import java.io.*;
-import java.net.URL;
-import java.util.*;
-import junit.framework.*;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.tests.harness.CoreTest;
-import org.eclipse.core.tests.harness.FileSystemHelper;
-import org.eclipse.core.tests.session.SetupManager.SetupException;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.osgi.framework.Bundle;
-
-public class ConfigurationSessionTestSuite extends SessionTestSuite {
-	// include configurator as it is required by compatibility, but do not set it to start 	
-	public static String[] MINIMAL_BUNDLE_SET = {
-		// -- new portion:
-		"org.eclipse.equinox.common@2:start", 
-		"org.eclipse.core.jobs@2:start", 
-		"org.eclipse.core.runtime.compatibility.registry",
-		"org.eclipse.equinox.registry@2:start", 
-		"org.eclipse.equinox.preferences", 
-		"org.eclipse.core.contenttype", 
-		// -- end of new
-		"org.eclipse.core.runtime@2:start", 
-		"org.eclipse.core.runtime.compatibility", 
-		"org.eclipse.update.configurator", 
-		"org.eclipse.core.tests.harness", 
-		"org.eclipse.jdt.junit.runtime", 
-		"org.eclipse.pde.junit.runtime", 
-		"org.junit", 
-		"org.eclipse.test.performance"
-		};
-
-	private static final String PROP_CONFIG_AREA_READ_ONLY = InternalPlatform.PROP_CONFIG_AREA + ".readOnly";
-	private static final String PROP_CONFIG_CASCADED = "osgi.configuration.cascaded";
-	private static final String PROP_SHARED_CONFIG_AREA = "osgi.sharedConfiguration.area";
-	private Collection bundles = new ArrayList();
-	private boolean cascaded;
-
-	// by default we clean-up after ourselves
-	private boolean cleanUp = true;
-
-	private IPath configurationPath = FileSystemHelper.getRandomLocation(FileSystemHelper.getTempDir());
-	private boolean prime = true;
-	private boolean readOnly;
-	// should the test cases be run in alphabetical order?
-	private boolean shouldSort;
-
-	public ConfigurationSessionTestSuite(String pluginId) {
-		super(pluginId);
-	}
-
-	public ConfigurationSessionTestSuite(String pluginId, Class theClass) {
-		super(pluginId, theClass);
-		this.shouldSort = true;
-	}
-
-	public ConfigurationSessionTestSuite(String pluginId, Class theClass, String name) {
-		super(pluginId, theClass, name);
-		this.shouldSort = true;
-	}
-
-	public ConfigurationSessionTestSuite(String pluginId, String name) {
-		super(pluginId, name);
-	}
-
-	public void addBundle(String id) {
-		bundles.add(getURL(id));
-	}
-
-	private void createConfigINI() throws IOException {
-		Assert.assertTrue("1.0", !bundles.isEmpty());
-		Properties contents = new Properties();
-		StringBuffer osgiBundles = new StringBuffer();
-		for (Iterator i = this.bundles.iterator(); i.hasNext();) {
-			osgiBundles.append(i.next());
-			osgiBundles.append(',');
-		}
-		osgiBundles.deleteCharAt(osgiBundles.length() - 1);
-		contents.put("osgi.bundles", osgiBundles.toString());
-		String osgiFramework = getURL("org.eclipse.osgi");
-		contents.put("osgi.framework", osgiFramework);
-		contents.put("osgi.bundles.defaultStartLevel", "4");
-		contents.put("osgi.install.area", Platform.getInstallLocation().getURL().toExternalForm());
-		contents.put(PROP_CONFIG_CASCADED, Boolean.toString(cascaded));
-		if (cascaded)
-			contents.put(PROP_SHARED_CONFIG_AREA, Platform.getConfigurationLocation().getURL().toExternalForm());
-		contents.put(PROP_CONFIG_AREA_READ_ONLY, Boolean.toString(readOnly));
-		// save the properties
-		File configINI = configurationPath.append("config.ini").toFile();
-		OutputStream out = null;
-		try {
-			out = new BufferedOutputStream(new FileOutputStream(configINI));
-			contents.store(out, null);
-		} finally {
-			if (out != null)
-				out.close();
-		}
-	}
-
-	protected void fillTestDescriptor(TestDescriptor test) throws SetupException {
-		super.fillTestDescriptor(test);
-		if (prime) {
-			test.getSetup().setSystemProperty(PROP_CONFIG_AREA_READ_ONLY, Boolean.FALSE.toString());
-			prime = false;
-		}
-	}
-
-	public IPath getConfigurationPath() {
-		return configurationPath;
-	}
-
-	private String getURL(String id) {
-		String suffix = "";
-		int atIndex = id.indexOf("@");
-		if (atIndex >= 0) {
-			suffix = id.substring(atIndex);
-			id = id.substring(0, atIndex);
-		}
-		Bundle bundle = Platform.getBundle(id);
-		Assert.assertNotNull("0.1 " + id, bundle);
-		URL url = bundle.getEntry("/");
-		Assert.assertNotNull("0.2 " + id, url);
-		try {
-			url = Platform.resolve(url);
-		} catch (IOException e) {
-			CoreTest.fail("0.3 " + url, e);
-		}
-		String externalForm;
-		if (url.getProtocol().equals("jar")) {
-			// if it is a JAR'd plug-in, URL is jar:file:/path/file.jar!/ - see bug 86195
-			String path = url.getPath();
-			// change it to be file:/path/file.jar
-			externalForm = path.substring(0, path.length() - 2);
-		} else
-			externalForm = url.toExternalForm();
-		// workaround for bug 88070		
-		externalForm = "reference:" + externalForm;
-		return externalForm + suffix;
-	}
-
-	public boolean isCascaded() {
-		return cascaded;
-	}
-
-	public boolean isReadOnly() {
-		return readOnly;
-	}
-
-	/**
-	 * Ensures setup uses this suite's instance location.
-	 * @throws SetupException
-	 */
-	protected Setup newSetup() throws SetupException {
-		Setup base = super.newSetup();
-		// the base implementation will have set this to the host configuration
-		base.setEclipseArgument(Setup.CONFIGURATION, null);
-		base.setSystemProperty(InternalPlatform.PROP_CONFIG_AREA, configurationPath.toOSString());
-		return base;
-	}
-
-	/**
-	 * Ensures workspace location is empty before running the first test, and after
-	 * running the last test. Also sorts the test cases to be run if this suite was
-	 * created by reifying a test case class.
-	 */
-	public void run(TestResult result) {
-		configurationPath.toFile().mkdirs();
-		try {
-			if (prime)
-				try {
-					createConfigINI();
-				} catch (IOException e) {
-					CoreTest.fail("0.1", e);
-				}
-			if (!shouldSort || isSharedSession()) {
-				// for shared sessions, we don't control the execution of test cases
-				super.run(result);
-				return;
-			}
-			// we have to sort the tests cases
-			Test[] allTests = getTests(true);
-			// now run the tests in order			
-			for (int i = 0; i < allTests.length && !result.shouldStop(); i++)
-				runTest(allTests[i], result);
-		} finally {
-			if (cleanUp)
-				FileSystemHelper.clear(configurationPath.toFile());
-		};
-
-	}
-
-	public void setCascaded(boolean cascaded) {
-		this.cascaded = cascaded;
-	}
-
-	public void setCleanup(boolean cleanUp) {
-		this.cleanUp = cleanUp;
-	}
-
-	public void setConfigurationPath(IPath configurationPath) {
-		this.configurationPath = configurationPath;
-	}
-
-	public void setPrime(boolean prime) {
-		this.prime = prime;
-	}
-
-	public void setReadOnly(boolean readOnly) {
-		this.readOnly = readOnly;
-	}
-
-	public static File getConfigurationDir() {
-		Location configurationLocation = Platform.getConfigurationLocation();
-		URL configurationURL = configurationLocation.getURL();
-		if (!"file".equals(configurationURL.getProtocol()))
-			// only works if configuration is file: based
-			throw new IllegalStateException();
-		File configurationDir = new File(configurationURL.getFile());
-		return configurationDir;
-	}
-
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/PerformanceSessionTestSuite.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/PerformanceSessionTestSuite.java
deleted file mode 100644
index 51e0a35..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/PerformanceSessionTestSuite.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import junit.framework.*;
-import org.eclipse.core.tests.session.SetupManager.SetupException;
-
-/**
- * Runs perfomance test cases multiple times (if they don't fail), 
- * enabling assertions for the first run.
- */
-public class PerformanceSessionTestSuite extends SessionTestSuite {
-
-	/**
-	 * This custom test result allows multiple test runs to show up as a 
-	 * single run. 
-	 */
-	private static class ConsolidatedTestResult extends TestResult {
-		private boolean failed;
-		private int runs = 0;
-		private boolean started = false;
-		private TestResult target;
-		private int timesToRun;
-
-		public ConsolidatedTestResult(TestResult target, int timesToRun) {
-			this.target = target;
-			this.timesToRun = timesToRun;
-		}
-
-		public void addError(Test test, Throwable t) {
-			failed = true;
-			target.addError(test, t);
-		}
-
-		public void addFailure(Test test, AssertionFailedError t) {
-			failed = true;
-			target.addFailure(test, t);
-		}
-
-		public void endTest(Test test) {
-			runs++;
-			if (!failed && runs < timesToRun)
-				return;
-			target.endTest(test);
-		}
-
-		public boolean shouldStop() {
-			if (failed)
-				return true;
-			return target.shouldStop();
-		}
-
-		public void startTest(Test test) {
-			// should not try to start again ater failing once
-			if (failed)
-				throw new IllegalStateException();
-			if (started)
-				return;
-			started = true;
-			target.startTest(test);
-		}
-	}
-
-	public static final String PROP_PERFORMANCE = "perf_ctrl";
-
-	private int timesToRun;
-
-	public PerformanceSessionTestSuite(String pluginId, int timesToRun) {
-		super(pluginId);
-		this.timesToRun = timesToRun;
-	}
-
-	public PerformanceSessionTestSuite(String pluginId, int timesToRun, Class theClass) {
-		super(pluginId, theClass);
-		this.timesToRun = timesToRun;
-	}
-
-	public PerformanceSessionTestSuite(String pluginId, int timesToRun, Class theClass, String name) {
-		super(pluginId, theClass, name);
-		this.timesToRun = timesToRun;
-	}
-
-	public PerformanceSessionTestSuite(String pluginId, int timesToRun, String name) {
-		super(pluginId, name);
-		this.timesToRun = timesToRun;
-	}
-
-	protected void runSessionTest(TestDescriptor descriptor, TestResult result) {
-		try {
-			fillTestDescriptor(descriptor);
-		} catch (SetupException e) {
-			Throwable cause = e.getCause() == null ? e : e.getCause();
-			result.addError(descriptor.getTest(), cause);
-			return;
-		}
-		descriptor.getSetup().setSystemProperty("eclipse.perf.dbloc", System.getProperty("eclipse.perf.dbloc"));
-		descriptor.getSetup().setSystemProperty("eclipse.perf.config", System.getProperty("eclipse.perf.config"));
-		// run test cases n-1 times
-		ConsolidatedTestResult consolidated = new ConsolidatedTestResult(result, timesToRun);
-		for (int i = 0; !consolidated.shouldStop() && i < timesToRun - 1; i++)
-			descriptor.run(consolidated);
-		if (consolidated.shouldStop())
-			return;
-		// for the n-th run, enable assertions
-		descriptor.getSetup().setSystemProperty("eclipse.perf.assertAgainst", System.getProperty("eclipse.perf.assertAgainst"));
-		descriptor.run(consolidated);
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/ProcessController.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/ProcessController.java
deleted file mode 100644
index e9b16ca..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/ProcessController.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import java.io.*;
-
-/**
- * Executes an external process synchronously, allowing the client to define 
- * a maximum amount of time for the process to complete.
- */
-public class ProcessController {
-	/**
-	 * Thrown when a process being executed exceeds the maximum amount
-	 * of time allowed for it to complete.
-	 */
-	public class TimeOutException extends Exception {
-		/**
-		 * All serializable objects should have a stable serialVersionUID
-		 */
-		private static final long serialVersionUID = 1L;
-
-		public TimeOutException() {
-			super();
-		}
-
-		public TimeOutException(String message) {
-			super(message);
-		}
-	}
-
-	private boolean finished;
-	private OutputStream forwardStdErr;
-	private InputStream forwardStdIn;
-	private OutputStream forwardStdOut;
-	private boolean killed;
-	private String[] params;
-	private Process process;
-	private long startupTime;
-	private long timeLimit;
-
-	/**
-	 * Constructs an instance of ProcessController. This does not creates an
-	 * OS process. <code>run()</code> does that.
-	 * 
-	 * @param timeout the maximum time the process should take to run 
-	 * @param params the parameters to be passed to the controlled process
-	 */
-	public ProcessController(long timeout, String[] params) {
-		this.timeLimit = timeout;
-		this.params = params;
-	}
-
-	private void controlProcess() {
-		new Thread("Process controller") {
-			public void run() {
-				while (!isFinished() && !timedOut())
-					synchronized (this) {
-						try {
-							wait(100);
-						} catch (InterruptedException e) {
-							break;
-						}
-					}
-				kill();
-			}
-		}.start();
-	}
-
-	/**
-	 * Causes the process to start executing. This call will block until the 
-	 * process has completed. If <code>timeout</code> is specified, the 
-	 * process will be interrupted if it takes more than the specified amount 
-	 * of time to complete, causing a <code>TimedOutException</code> to be thrown. 
-	 * Specifying zero as <code>timeout</code> means 
-	 * the process is not time constrained.  
-	 * 
-	 * @return the process exit value
-	 * @throws InterruptedException
-	 * @throws IOException
-	 * @throws TimeOutException if the process did not complete in time
-	 */
-	public int execute() throws InterruptedException, IOException, TimeOutException {
-		this.startupTime = System.currentTimeMillis();
-		// starts the process
-		process = Runtime.getRuntime().exec(params);
-		if (forwardStdErr != null)
-			forwardStream("stderr", process.getErrorStream(), forwardStdErr);
-		if (forwardStdOut != null)
-			forwardStream("stdout", process.getInputStream(), forwardStdOut);
-		if (forwardStdIn != null)
-			forwardStream("stdin", forwardStdIn, process.getOutputStream());
-		if (timeLimit > 0)
-			// ensures process execution time does not exceed the time limit 
-			controlProcess();
-		try {
-			return process.waitFor();
-		} finally {
-			markFinished();
-			if (wasKilled())
-				throw new TimeOutException();
-		}
-	}
-
-	/**
-	 * Forwards the process standard error output to the given output stream.
-	 * Must be called before execution has started.
-	 * 
-	 * @param err an output stream where to forward the process 
-	 * standard error output to
-	 */
-	public void forwardErrorOutput(OutputStream err) {
-		this.forwardStdErr = err;
-	}
-
-	/**
-	 * Forwards the process standard output to the given output stream.
-	 * Must be called before execution has started.
-	 * 
-	 * @param out an output stream where to forward the process 
-	 * standard output to
-	 */
-	public void forwardOutput(OutputStream out) {
-		this.forwardStdOut = out;
-	}
-
-	private void forwardStream(final String name, final InputStream in, final OutputStream out) {
-		new Thread("Stream forwarder [" + name + "]") {
-			public void run() {
-				try {
-					while (!isFinished()) {
-						while (in.available() > 0)
-							out.write(in.read());
-						synchronized (this) {
-							this.wait(100);
-						}
-					}
-					out.flush();
-				} catch (IOException ioe) {
-					//TODO only log/show if debug is on
-					ioe.printStackTrace();
-				} catch (InterruptedException e) {
-					//TODO only log/show if debug is on
-					e.printStackTrace();
-				}
-			}
-		}.start();
-	}
-
-	/**
-	 * Returns the controled process. Will return <code>null</code> before 
-	 * <code>execute</code> is called. 
-	 * 
-	 * @return the underlying process
-	 */
-	public Process getProcess() {
-		return process;
-	}
-
-	protected synchronized boolean isFinished() {
-		return finished;
-	}
-
-	/**
-	 * Kills the process. Does nothing if it has been finished already.
-	 */
-	public void kill() {
-		synchronized (this) {
-			if (isFinished())
-				return;
-			killed = true;
-		}
-		process.destroy();
-	}
-
-	private synchronized void markFinished() {
-		finished = true;
-		notifyAll();
-	}
-
-	protected synchronized boolean timedOut() {
-		return System.currentTimeMillis() - startupTime > timeLimit;
-	}
-
-	/**
-	 * Returns whether the process was killed due to a time out.
-	 * 
-	 * @return <code>true</code> if the process was killed, 
-	 * <code>false</code> if the completed normally
-	 */
-	public boolean wasKilled() {
-		return killed;
-	}
-
-	/**
-	 * Forwards the given input stream to the process standard input.
-	 * Must be called before execution has started.
-	 * 
-	 * @param in an input stream where the process 
-	 * standard input will be forwarded to 
-	 */
-	public void forwardInput(InputStream in) {
-		forwardStdIn = in;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/RemoteAssertionFailedError.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/RemoteAssertionFailedError.java
deleted file mode 100644
index ec2639f..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/RemoteAssertionFailedError.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import junit.framework.AssertionFailedError;
-
-public class RemoteAssertionFailedError extends AssertionFailedError {
-	/**
-	 * All serializable objects should have a stable serialVersionUID
-	 */
-	private static final long serialVersionUID = 1L;
-
-	private Object stackText;
-	private String message;
-
-	public RemoteAssertionFailedError(String message, String stackText) {
-		this.message = message;
-		this.stackText = stackText;
-	}
-
-	public void printStackTrace(PrintWriter stream) {
-		stream.print(stackText);
-	}
-
-	public void printStackTrace(PrintStream stream) {
-		stream.print(stackText);
-	}
-
-	public String getMessage() {
-		return message;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/RemoteTestException.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/RemoteTestException.java
deleted file mode 100644
index eff9be7..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/RemoteTestException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
-public class RemoteTestException extends Exception {
-	/**
-	 * All serializable objects should have a stable serialVersionUID
-	 */
-	private static final long serialVersionUID = 1L;
-
-	private String stackText;
-	private String message;
-
-	public RemoteTestException(String message, String stackText) {
-		this.message = message;
-		this.stackText = stackText;
-	}
-
-	public void printStackTrace(PrintWriter stream) {
-		stream.print(stackText);
-	}
-
-	public void printStackTrace(PrintStream stream) {
-		stream.print(stackText);
-	}
-
-	public String getMessage() {
-		return message;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/SessionTestRunner.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/SessionTestRunner.java
deleted file mode 100644
index 94f4f03..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/SessionTestRunner.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.Assert;
-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.tests.harness.CoreTest;
-
-/**
- * This class is responsible for launching JUnit tests on a separate Eclipse session and collect
- * the tests results sent back through a socket . 
- */
-public class SessionTestRunner {
-
-	class Result {
-		final static int ERROR = 2;
-		final static int FAILURE = 1;
-		final static int SUCCESS = 0;
-
-		String message;
-
-		String stackTrace;
-		Test test;
-		int type;
-
-		public Result(Test test) {
-			this.test = test;
-		}
-	}
-
-	/**
-	 * Collectors can be used a single time only.
-	 */
-	class ResultCollector implements Runnable {
-		private boolean finished;
-		private Result newResult;
-		private Map results = new HashMap();
-		ServerSocket serverSocket;
-		private boolean shouldRun = true;
-		private StringBuffer stack;
-		private TestResult testResult;
-		// tests completed during this session
-		private int testsRun;
-
-		ResultCollector(Test test, TestResult testResult) throws IOException {
-			serverSocket = new ServerSocket(0);
-			this.testResult = testResult;
-			initResults(test);
-		}
-
-		public int getPort() {
-			return serverSocket.getLocalPort();
-		}
-
-		public int getTestsRun() {
-			return testsRun;
-		}
-
-		private void initResults(Test test) {
-			if (test instanceof TestSuite) {
-				for (Enumeration e = ((TestSuite) test).tests(); e.hasMoreElements();)
-					initResults((Test) e.nextElement());
-				return;
-			}
-			results.put(test.toString(), new Result(test));
-		}
-
-		public synchronized boolean isFinished() {
-			return finished;
-		}
-
-		private synchronized void markAsFinished() {
-			finished = true;
-			notifyAll();
-		}
-
-		private String parseTestId(String message) {
-			if (message.length() == 0 || message.charAt(0) != '%')
-				return null;
-			int firstComma = message.indexOf(',');
-			if (firstComma == -1)
-				return null;
-			int secondComma = message.indexOf(',', firstComma + 1);
-			if (secondComma == -1)
-				secondComma = message.length();
-			return message.substring(firstComma + 1, secondComma);
-		}
-
-		private void processAvailableMessages(BufferedReader messageReader) throws IOException {
-			while (messageReader.ready()) {
-				String message = messageReader.readLine();
-				processMessage(message);
-			}
-		}
-
-		private void processMessage(String message) {
-			if (message.startsWith("%TESTS")) {
-				String testId = parseTestId(message);
-				if (!results.containsKey(testId))
-					throw new IllegalStateException("Unknown test id: " + testId);
-				newResult = (Result) results.get(testId);
-				testResult.startTest(newResult.test);
-				return;
-			}
-			if (message.startsWith("%TESTE")) {
-				if (newResult.type == Result.FAILURE)
-					testResult.addFailure(newResult.test, new RemoteAssertionFailedError(newResult.message, newResult.stackTrace));
-				else if (newResult.type == Result.ERROR)
-					testResult.addError(newResult.test, new RemoteTestException(newResult.message, newResult.stackTrace));
-				testResult.endTest(newResult.test);
-				testsRun++;
-				newResult = null;
-				return;
-			}
-			if (message.startsWith("%ERROR")) {
-				newResult.type = Result.ERROR;
-				newResult.message = "";
-				return;
-			}
-			if (message.startsWith("%FAILED")) {
-				newResult.type = Result.FAILURE;
-				newResult.message = "";
-				return;
-			}
-			if (message.startsWith("%TRACES")) {
-				// just create the string buffer that will hold all the frames of the stack trace
-				stack = new StringBuffer();
-				return;
-			}
-			if (message.startsWith("%TRACEE")) {
-				// stack trace fully read - fill the slot in the result object and reset the string buffer
-				newResult.stackTrace = stack.toString();
-				stack = null;
-				return;
-			}
-			if (message.startsWith("%"))
-				// ignore any other messages
-				return;
-			if (stack != null) {
-				// build the stack trace line by line
-				stack.append(message);
-				stack.append(System.getProperty("line.separator"));
-				return;
-			}
-		}
-
-		public void run() {
-			Socket connection = null;
-			try {
-				// someone asked us to stop before we could do anything
-				if (!shouldRun())
-					return;
-				try {
-					connection = serverSocket.accept();
-				} catch (SocketException se) {
-					if (!shouldRun())
-						// we have been finished without ever getting any connections
-						// no need to throw exception
-						return;
-					// something else stopped us
-					throw se;
-				}
-				BufferedReader messageReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
-				try {
-					// main loop
-					while (true) {
-						synchronized (this) {
-							processAvailableMessages(messageReader);
-							if (!shouldRun())
-								return;
-							this.wait(150);
-						}
-					}
-				} catch (InterruptedException e) {
-					// not expected
-				}
-			} catch (IOException e) {
-				CoreTest.log(CoreTest.PI_HARNESS, e);
-			} finally {
-				// remember we are already finished
-				markAsFinished();
-				// cleanup
-				try {
-					if (connection != null && !connection.isClosed())
-						connection.close();
-				} catch (IOException e) {
-					CoreTest.log(CoreTest.PI_HARNESS, e);
-				}
-				try {
-					if (serverSocket != null && !serverSocket.isClosed())
-						serverSocket.close();
-				} catch (IOException e) {
-					CoreTest.log(CoreTest.PI_HARNESS, e);
-				}
-			}
-		}
-
-		private synchronized boolean shouldRun() {
-			return shouldRun;
-		}
-
-		/*
-		 * Politely asks the collector thread to stop and wait until it is finished.
-		 */
-		public void shutdown() {
-			// ask the collector to stop
-			synchronized (this) {
-				if (isFinished())
-					return;
-				shouldRun = false;
-				try {
-					serverSocket.close();
-				} catch (IOException e) {
-					CoreTest.log(CoreTest.PI_HARNESS, e);
-				}
-				notifyAll();
-			}
-			// wait until the collector is done
-			synchronized (this) {
-				while (!isFinished())
-					try {
-						wait(100);
-					} catch (InterruptedException e) {
-						// we don't care
-					}
-			}
-		}
-
-	}
-
-	/**
-	 * Runs the setup. Returns a status object indicating the outcome of the operation.
-	 *   
-	 * @return a status object indicating the outcome 
-	 */
-	private IStatus launch(Setup setup) {
-		Assert.isNotNull(setup.getEclipseArgument(Setup.APPLICATION), "test application is not defined");
-		Assert.isNotNull(setup.getEclipseArgument("testpluginname"), "test plug-in id not defined");
-		Assert.isTrue(setup.getEclipseArgument("classname") != null ^ setup.getEclipseArgument("test") != null, "either a test suite or a test case must be provided");
-		// to prevent changes in the protocol from breaking us, 
-		// force the version we know we can work with 
-		setup.setEclipseArgument("version", "3");
-		IStatus outcome = Status.OK_STATUS;
-		try {
-			int returnCode = setup.run();
-			if (returnCode != 0)
-				outcome = new Status(IStatus.WARNING, Platform.PI_RUNTIME, returnCode, "Process returned non-zero code: " + returnCode + "\n\tCommand: " + setup, null);
-		} catch (Exception e) {
-			outcome = new Status(IStatus.ERROR, Platform.PI_RUNTIME, -1, "Error running process\n\tCommand: " + setup, e);
-		}
-		return outcome;
-	}
-
-	/**
-	 * Runs the test described  in a separate session.
-	 */
-	public final void run(Test test, TestResult result, Setup setup, boolean crashTest) {
-		ResultCollector collector = null;
-		try {
-			collector = new ResultCollector(test, result);
-		} catch (IOException e) {
-			result.addError(test, e);
-			return;
-		}
-		setup.setEclipseArgument("port", Integer.toString(collector.getPort()));
-		new Thread(collector, "Test result collector").start();
-		IStatus status = launch(setup);
-		collector.shutdown();
-		// ensure the session ran without any errors
-		if (!status.isOK()) {
-			CoreTest.log(CoreTest.PI_HARNESS, status);
-			if (status.getSeverity() == IStatus.ERROR) {
-				result.addError(test, new CoreException(status));
-				return;
-			}
-		}
-		if (collector.getTestsRun() == 0) {
-			if (crashTest)
-				// explicitly end test since process crashed before test could finish
-				result.endTest(test);
-			else
-				result.addError(test, new Exception("Test did not run: " + test.toString()));
-		} else if (crashTest)
-			result.addError(test, new Exception("Should have caused crash"));
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/SessionTestSuite.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/SessionTestSuite.java
deleted file mode 100644
index cafb8d7..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/SessionTestSuite.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import java.util.*;
-import junit.framework.*;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.tests.session.SetupManager.SetupException;
-
-public class SessionTestSuite extends TestSuite {
-	public static final String CORE_TEST_APPLICATION = "org.eclipse.pde.junit.runtime.coretestapplication"; //$NON-NLS-1$	
-	public static final String UI_TEST_APPLICATION = "org.eclipse.pde.junit.runtime.uitestapplication"; //$NON-NLS-1$	
-	protected String applicationId = CORE_TEST_APPLICATION;
-	private Set crashTests = new HashSet();
-	private Set localTests = new HashSet();
-	// the id for the plug-in whose classloader ought to be used to load the test case class
-	protected String pluginId;
-	private Setup setup;
-	// true if test cases should run in the same (shared) session
-	private boolean sharedSession;
-	protected SessionTestRunner testRunner;
-
-	public SessionTestSuite(String pluginId) {
-		super();
-		this.pluginId = pluginId;
-	}
-
-	public SessionTestSuite(String pluginId, Class theClass) {
-		super(theClass);
-		this.pluginId = pluginId;
-	}
-
-	public SessionTestSuite(String pluginId, Class theClass, String name) {
-		super(theClass, name);
-		this.pluginId = pluginId;
-	}
-
-	public SessionTestSuite(String pluginId, String name) {
-		super(name);
-		this.pluginId = pluginId;
-	}
-
-	/**
-	 * Crash tests are not expected to complete (they fail if they do).
-	 */
-	public void addCrashTest(TestCase test) {
-		crashTests.add(test);
-		super.addTest(test);
-	}
-
-	/**
-	 * Adds a local test, a test that is run locally, not in a separate session.
-	 */
-	public void addLocalTest(TestCase test) {
-		localTests.add(test);
-		super.addTest(test);
-	}
-
-	protected void fillTestDescriptor(TestDescriptor test) throws SetupException {
-		if (test.getApplicationId() == null)
-			test.setApplicationId(applicationId);
-		if (test.getPluginId() == null)
-			test.setPluginId(pluginId);
-		if (test.getSetup() == null)
-			test.setSetup(getSetup());
-		if (!test.isCrashTest() && crashTests.contains(test.getTest()))
-			test.setCrashTest(true);
-		test.setTestRunner(getTestRunner());
-	}
-
-	public String getApplicationId() {
-		return applicationId;
-	}
-
-	public Setup getSetup() throws SetupException {
-		if (setup == null)
-			setup = newSetup();
-		return setup;
-	}
-
-	protected SessionTestRunner getTestRunner() {
-		if (testRunner == null)
-			testRunner = new SessionTestRunner();
-		return testRunner;
-	}
-
-	protected Test[] getTests(boolean sort) {
-		Test[] allTests = new Test[testCount()];
-		Enumeration e = tests();
-		for (int i = 0; i < allTests.length; i++)
-			allTests[i] = (Test) e.nextElement();
-		if (sort)
-			Arrays.sort(allTests, new Comparator() {
-				public int compare(Object o1, Object o2) {
-					return ((TestCase) o1).getName().compareTo(((TestCase) o2).getName());
-				}
-			});
-		return allTests;
-	}
-
-	private boolean isLocalTest(Test test) {
-		return localTests.contains(test);
-	}
-
-	public boolean isSharedSession() {
-		return sharedSession;
-	}
-
-	protected Setup newSetup() throws SetupException {
-		return SetupManager.getInstance().getDefaultSetup();
-	}
-
-	/**
-	 * Runs this session test suite.  
-	 */
-	public void run(TestResult result) {
-		if (!sharedSession) {
-			super.run(result);
-			return;
-		}
-		// running this session test suite in shared mode
-		Enumeration tests = tests();
-		Assert.isTrue(tests.hasMoreElements(), "A single test suite must be provided");
-		Test onlyTest = (Test) tests.nextElement();
-		Assert.isTrue(!tests.hasMoreElements(), "Only a single test suite can be run");
-		Assert.isTrue(onlyTest instanceof TestSuite, "Only test suites can be run in shared session mode");
-		TestSuite nested = (TestSuite) onlyTest;
-		try {
-			// in shared mode no TestDescriptors are used, need to set up environment ourselves
-			Setup localSetup = (Setup) getSetup().clone();
-			localSetup.setEclipseArgument(Setup.APPLICATION, applicationId);
-			localSetup.setEclipseArgument("testpluginname", pluginId);
-			localSetup.setEclipseArgument("classname", (nested.getName() != null ? nested.getName() : nested.getClass().getName()));
-			// run the session tests
-			new SessionTestRunner().run(this, result, localSetup, false);
-		} catch (SetupException e) {
-			result.addError(this, e.getCause());
-			return;
-		}
-	}
-
-	protected void runSessionTest(TestDescriptor test, TestResult result) {
-		try {
-			fillTestDescriptor(test);
-			test.run(result);
-		} catch (SetupException e) {
-			result.addError(test.getTest(), e.getCause());
-		}
-	}
-
-	public final void runTest(Test test, TestResult result) {
-		if (sharedSession)
-			// just for safety, prevent anybody from calling this API - we don't run individual tests when in shared mode
-			throw new UnsupportedOperationException();
-
-		if (test instanceof TestDescriptor)
-			runSessionTest((TestDescriptor) test, result);
-		else if (test instanceof TestCase) {
-			if (isLocalTest(test))
-				// local, ordinary test - just run it
-				test.run(result);
-			else
-				runSessionTest(new TestDescriptor((TestCase) test), result);
-		} else if (test instanceof TestSuite)
-			// find and run the test cases that make up the suite
-			runTestSuite((TestSuite) test, result);
-		else
-			// we don't support session tests for things that are not TestCases 
-			// or TestSuites (e.g. TestDecorators) 
-			test.run(result);
-	}
-
-	/*
-	 * Traverses the test suite to find individual test cases to be run with the SessionTestRunner.
-	 */
-	protected void runTestSuite(TestSuite suite, TestResult result) {
-		for (Enumeration e = suite.tests(); e.hasMoreElements();) {
-			if (result.shouldStop())
-				break;
-			Test test = (Test) e.nextElement();
-			runTest(test, result);
-		}
-	}
-
-	public void setApplicationId(String applicationId) {
-		this.applicationId = applicationId;
-	}
-
-	void setSetup(Setup setup) {
-		this.setup = setup;
-	}
-
-	public void setSharedSession(boolean sharedSession) {
-		this.sharedSession = sharedSession;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/Setup.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/Setup.java
deleted file mode 100644
index 4d66633..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/Setup.java
+++ /dev/null
@@ -1,484 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.*;
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.tests.session.ProcessController.TimeOutException;
-
-/*
- * Implementation note: vmArguments and eclipseArguments are HashMap (and not
- * just Map) because we are interested in features that are specific to HashMap
- * (is Cloneable, allows null values).
- */
-public class Setup implements Cloneable {
-
-	public static final String APPLICATION = "application";
-
-	private static final String ARCH = "arch";
-
-	public static final String CONFIGURATION = "configuration";
-
-	public static final String DATA = "data";
-
-	public static final String DEBUG = "debug";
-
-	private static final int DEFAULT_TIMEOUT = 0;
-
-	public static final String DEV = "dev";
-
-	public static final String INSTALL = "install";
-
-	private static final String NL = "nl";
-
-	private static final String OS = "os";
-
-	public static final String VM = "vm";
-
-	private static final String WS = "ws";
-	
-	private static final String PROP_BOOT_DELEGATION = "org.osgi.framework.bootdelegation";
-
-	public static String getDefaultArchOption() {
-		return System.getProperty(InternalPlatform.PROP_ARCH);
-	}
-
-	public static String getDefaultConfiguration() {
-		return System.getProperty(InternalPlatform.PROP_CONFIG_AREA);
-	}
-
-	public static String getDefaultDebugOption() {
-		return System.getProperty(InternalPlatform.PROP_DEBUG);
-	}
-
-	public static String getDefaultDevOption() {
-		return System.getProperty(InternalPlatform.PROP_DEV);
-	}
-
-	public static String getDefaultInstallLocation() {
-		String currentInstall = System.getProperty(InternalPlatform.PROP_INSTALL_AREA);
-		if (currentInstall != null)
-			try {
-				return new URI(currentInstall).getPath();
-			} catch (URISyntaxException e) {
-				// nothing to be done
-			}
-		return null;
-	}
-
-	public static String getDefaultInstanceLocation() {
-		return new File(System.getProperty("java.io.tmpdir"), "workspace").toString();
-	}
-
-	public static String getDefaultNLOption() {
-		return System.getProperty(InternalPlatform.PROP_NL);
-	}
-
-	public static String getDefaultOSOption() {
-		return System.getProperty(InternalPlatform.PROP_OS);
-	}
-
-	/**
-	 * Creates a setup containing default settings. The default settings will
-	 * vary depending on the running environment.
-	 * 
-	 * @see #getDefaultConfiguration()
-	 * @see #getDefaultDebugOption()
-	 * @see #getDefaultDevOption()
-	 * @see #getDefaultInstallLocation()
-	 * @see #getDefaultInstanceLocation()
-	 * @see #getDefaultVMLocation()
-	 * @return a setup with all default settings
-	 */
-	static Setup getDefaultSetup(SetupManager manager) {
-		Setup defaultSetup = new Setup(manager);
-		// see bug 93343
-		defaultSetup.setSystemProperty(PROP_BOOT_DELEGATION, System.getProperty(PROP_BOOT_DELEGATION));
-		defaultSetup.setSystemProperty(InternalPlatform.PROP_CONSOLE_LOG, System.getProperty(InternalPlatform.PROP_CONSOLE_LOG, "true"));
-		if (Setup.getDefaultVMLocation() != null)
-			defaultSetup.setEclipseArgument(VM, Setup.getDefaultVMLocation());
-		if (Setup.getDefaultConfiguration() != null)
-			defaultSetup.setEclipseArgument(CONFIGURATION, Setup.getDefaultConfiguration());
-		if (Setup.getDefaultDebugOption() != null)
-			defaultSetup.setSystemProperty(InternalPlatform.PROP_DEBUG, Setup.getDefaultDebugOption());
-		if (Setup.getDefaultDevOption() != null)
-			defaultSetup.setEclipseArgument(DEV, Setup.getDefaultDevOption());
-		if (Setup.getDefaultInstallLocation() != null)
-			defaultSetup.setEclipseArgument(INSTALL, Setup.getDefaultInstallLocation());
-		if (Setup.getDefaultInstanceLocation() != null)
-			defaultSetup.setEclipseArgument(DATA, Setup.getDefaultInstanceLocation());
-		if (Setup.getDefaultArchOption() != null)
-			defaultSetup.setEclipseArgument(ARCH, Setup.getDefaultArchOption());
-		String defaultOS = Setup.getDefaultOSOption();
-		if (defaultOS != null) {
-			defaultSetup.setEclipseArgument(OS, defaultOS);
-			if (Platform.OS_MACOSX.equals(defaultOS))
-				// see bug 98508 
-				defaultSetup.setVMArgument("XstartOnFirstThread", "");
-		}
-		if (Setup.getDefaultWSOption() != null)
-			defaultSetup.setEclipseArgument(WS, Setup.getDefaultWSOption());
-		if (Setup.getDefaultNLOption() != null)
-			defaultSetup.setEclipseArgument(NL, Setup.getDefaultNLOption());
-		defaultSetup.setTimeout(DEFAULT_TIMEOUT);
-		return defaultSetup;
-	}
-
-	public static String getDefaultVMLocation() {
-		String javaVM = System.getProperty("eclipse.vm");
-		if (javaVM != null)
-			return javaVM;
-		javaVM = System.getProperty("java.home");
-		if (javaVM == null)
-			return null;
-		// XXX: this is a hack and will not work with some VMs...
-		return new File(new File(javaVM, "bin"), "java").toString();
-	}
-
-	public static String getDefaultWSOption() {
-		return System.getProperty(InternalPlatform.PROP_WS);
-	}
-
-	private String[] baseSetups;
-
-	private HashMap eclipseArguments = new HashMap();
-
-	private String id;
-
-	private SetupManager manager;
-
-	private String name;
-
-	private String[] requiredSets;
-
-	private HashMap systemProperties = new HashMap();
-
-	private int timeout;
-
-	private HashMap vmArguments = new HashMap();
-
-	public Setup(SetupManager manager) {
-		this.manager = manager;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#clone()
-	 */
-	public Object clone() {
-		Setup clone = null;
-		try {
-			clone = (Setup) super.clone();
-			// ensure we don't end up sharing references to mutable objects
-			clone.eclipseArguments = (HashMap) eclipseArguments.clone();
-			clone.vmArguments = (HashMap) vmArguments.clone();
-			clone.systemProperties = (HashMap) systemProperties.clone();
-		} catch (CloneNotSupportedException e) {
-			// just does not happen: we do implement Cloneable
-		}
-		return clone;
-	}
-
-	private void fillClassPath(List params) {
-		if (vmArguments.containsKey("cp") || vmArguments.containsKey("classpath"))
-			// classpath was specified as VM argument
-			return;
-		String inheritedClassPath = System.getProperty("java.class.path");
-		if (inheritedClassPath == null) {
-			String installLocation = getEclipseArgument(INSTALL);
-			if (installLocation == null)
-				throw new IllegalStateException("Classpath could not be computed");
-			inheritedClassPath = new File(installLocation, "startup.jar").toString();
-		}
-		params.add("-classpath");
-		params.add(inheritedClassPath);
-	}
-
-	public void fillCommandLine(List commandLine) {
-		String vmLocation = getEclipseArgument(VM);
-		if (vmLocation == null)
-			throw new IllegalStateException("VM location not set");
-		commandLine.add(vmLocation);
-		fillClassPath(commandLine);
-		fillVMArgs(commandLine);
-		fillSystemProperties(commandLine);
-		commandLine.add("org.eclipse.core.launcher.Main");
-		fillEclipseArgs(commandLine);
-	}
-
-	private void fillEclipseArgs(List params) {
-		for (Iterator i = eclipseArguments.entrySet().iterator(); i.hasNext();) {
-			Map.Entry entry = (Map.Entry) i.next();
-			params.add('-' + (String) entry.getKey());
-			if (entry.getValue() != null && ((String) entry.getValue()).length() > 0)
-				params.add(entry.getValue());
-		}
-	}
-
-	private void fillSystemProperties(List command) {
-		for (Iterator iter = systemProperties.entrySet().iterator(); iter.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			// null-valued properties are ignored
-			if (entry.getValue() == null)
-				continue;
-			StringBuffer property = new StringBuffer("-D");
-			property.append(entry.getKey());
-			if (((String) entry.getValue()).length() > 0) {
-				property.append('=');
-				property.append(entry.getValue());
-			}
-			command.add(property.toString());
-		}
-	}
-
-	private void fillVMArgs(List params) {
-		for (Iterator i = vmArguments.entrySet().iterator(); i.hasNext();) {
-			Map.Entry entry = (Map.Entry) i.next();
-			params.add('-' + (String) entry.getKey());
-			if (entry.getValue() != null && ((String) entry.getValue()).length() > 0)
-				params.add(entry.getValue());
-		}
-	}
-
-	String[] getBaseSetups() {
-		return baseSetups;
-	}
-
-	public String[] getCommandLine() {
-		List commandLine = new ArrayList();
-		fillCommandLine(commandLine);
-		return (String[]) commandLine.toArray(new String[commandLine.size()]);
-	}
-
-	public String getEclipseArgsLine() {
-		List eclipseArgs = new ArrayList();
-		fillEclipseArgs(eclipseArgs);
-		StringBuffer result = new StringBuffer();
-		for (Iterator i = eclipseArgs.iterator(); i.hasNext();) {
-			result.append(i.next());
-			result.append(' ');
-		}
-		return result.length() > 0 ? result.substring(0, result.length() - 1) : null;
-	}
-
-	public String getEclipseArgument(String key) {
-		return (String) eclipseArguments.get(key);
-	}
-
-	public Map getEclipseArguments() {
-		return (Map) eclipseArguments.clone();
-	}
-
-	public String getId() {
-		return id;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	String[] getRequiredSets() {
-		return requiredSets;
-	}
-
-	public Map getSystemProperties() {
-		return (Map) systemProperties.clone();
-	}
-
-	public String getSystemPropertiesLine() {
-		List sysProperties = new ArrayList();
-		fillSystemProperties(sysProperties);
-		StringBuffer result = new StringBuffer();
-		for (Iterator i = sysProperties.iterator(); i.hasNext();) {
-			result.append(i.next());
-			result.append(' ');
-		}
-		return result.length() > 0 ? result.substring(0, result.length() - 1) : null;
-	}
-
-	public int getTimeout() {
-		return timeout;
-	}
-
-	public String getVMArgsLine() {
-		List vmArgs = new ArrayList();
-		fillVMArgs(vmArgs);
-		StringBuffer result = new StringBuffer();
-		for (Iterator i = vmArgs.iterator(); i.hasNext();) {
-			result.append(i.next());
-			result.append(' ');
-		}
-		return result.length() > 0 ? result.substring(0, result.length() - 1) : null;
-	}
-
-	public String getVMArgument(String key) {
-		return (String) vmArguments.get(key);
-	}
-
-	public Map getVMArguments() {
-		return (Map) vmArguments.clone();
-	}
-
-	public boolean isA(String baseOptionSet) {
-		if (baseOptionSet.equals(id))
-			return true;
-		if (baseSetups == null)
-			return false;
-		for (int i = 0; i < baseSetups.length; i++) {
-			Setup base = manager.getSetup(baseSetups[i]);
-			if (base != null && base.isA(baseOptionSet))
-				return true;
-		}
-		return false;
-	}
-
-	public boolean isSatisfied(String[] availableSets) {
-		for (int i = 0; i < requiredSets.length; i++) {
-			boolean satisfied = false;
-			for (int j = 0; !satisfied && j < availableSets.length; j++) {
-				Setup available = manager.getSetup(availableSets[j]);
-				if (available != null && available.isA(requiredSets[i]))
-					satisfied = true;
-			}
-			if (!satisfied)
-				return false;
-		}
-		return true;
-	}
-
-	public void merge(Setup variation) {
-		eclipseArguments.putAll(variation.eclipseArguments);
-		vmArguments.putAll(variation.vmArguments);
-		systemProperties.putAll(variation.systemProperties);
-	}
-
-	public int run() throws InterruptedException, IOException, TimeOutException {
-		if (SetupManager.inDebugMode()) {
-			System.out.print("Command line: ");
-			System.out.println(toCommandLineString());
-		}
-		ProcessController process = new ProcessController(getTimeout(), getCommandLine());
-		process.forwardErrorOutput(System.err);
-		process.forwardOutput(System.out);
-		//if necessary to interact with the spawned process, this would have
-		// to be done
-		//process.forwardInput(System.in);
-		return process.execute();
-	}
-
-	void setBaseSetups(String[] baseSetups) {
-		this.baseSetups = baseSetups;
-	}
-
-	public void setEclipseArgument(String key, String value) {
-		if (value == null)
-			eclipseArguments.remove(key);
-		else
-			eclipseArguments.put(key, value);
-	}
-
-	public void setEclipseArguments(Map newArguments) {
-		if (newArguments == null)
-			eclipseArguments.clear();
-		else
-			eclipseArguments.putAll(newArguments);
-	}
-
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	void setRequiredSets(String[] requiredSets) {
-		this.requiredSets = requiredSets;
-	}
-
-	public void setSystemProperties(Map newProperties) {
-		if (newProperties == null)
-			systemProperties.clear();
-		else
-			systemProperties.putAll(newProperties);
-	}
-
-	public void setSystemProperty(String key, String value) {
-		if (value == null)
-			systemProperties.remove(key);
-		else
-			systemProperties.put(key, value);
-	}
-
-	public void setTimeout(int timeout) {
-		this.timeout = timeout;
-	}
-
-	public void setVMArgument(String key, String value) {
-		if (value == null)
-			vmArguments.remove(key);
-		else
-			vmArguments.put(key, value);
-	}
-
-	public void setVMArguments(Map newArguments) {
-		if (newArguments == null)
-			vmArguments.clear();
-		else
-			vmArguments.putAll(newArguments);
-	}
-
-	public String toCommandLineString() {
-		String[] commandLine = getCommandLine();
-		StringBuffer result = new StringBuffer();
-		result.append("[\n");
-		for (int i = 0; i < commandLine.length; i++) {
-			result.append('\t');
-			result.append(commandLine[i]);
-			result.append('\n');
-		}
-		result.append(']');
-		return result.toString();
-	}
-
-	public String toString() {
-		StringBuffer result = new StringBuffer();
-		if (id != null || name != null) {
-			if (id != null) {
-				result.append(id);
-				result.append(' ');
-			}
-			if (name != null) {
-				if (name != null) {
-					result.append("(");
-					result.append(name);
-					result.append(") ");
-				}
-			}
-			result.append("= ");
-		}
-		result.append("[");
-		result.append("\n\teclipseArguments: ");
-		result.append(eclipseArguments);
-		result.append("\n\tvmArguments: ");
-		result.append(vmArguments);
-		result.append("\n\tsystemProperties: ");
-		result.append(systemProperties);
-		result.append("\n]");
-		return result.toString();
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/SetupManager.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/SetupManager.java
deleted file mode 100644
index 2637b93..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/SetupManager.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.*;
-import javax.xml.parsers.*;
-import org.eclipse.core.runtime.Platform;
-import org.w3c.dom.*;
-import org.xml.sax.SAXException;
-
-public class SetupManager {
-	public class SetupException extends Exception {
-		/**
-		 * All serializable objects should have a stable serialVersionUID
-		 */
-		private static final long serialVersionUID = 1L;
-
-		public SetupException(String message, Throwable cause) {
-			super(message, cause);
-		}
-
-		public SetupException(String message) {
-			super(message);
-		}
-	}
-
-	private static SetupManager instance;
-	private static final String SETUP_DEBUG = "setup.debug";
-	private static final String SETUP_FILES = "setup.files";
-	private static final String SETUP_OPTIONS = "setup.options";
-	private static final String SETUP_OVERRIDE_ECLIPSEARGS = "setup.override.eclipseArgs";
-	private static final String SETUP_OVERRIDE_SYSTEMPROPERTIES = "setup.override.systemProperties";
-	private static final String SETUP_OVERRIDE_VMARGS = "setup.override.vmArgs";
-	private String defaultOptionSetIds = "";
-	private Map setupById;
-	private Collection setups;
-
-	private static boolean contains(Object[] set, Object element) {
-		for (int i = 0; i < set.length; i++)
-			if (element.equals(set[i]))
-				return true;
-		return false;
-	}
-
-	public synchronized static SetupManager getInstance() throws SetupException {
-		if (instance != null)
-			return instance;
-		instance = new SetupManager();
-		return instance;
-	}
-
-	public static boolean inDebugMode() {
-		return Boolean.getBoolean(SETUP_DEBUG);
-	}
-
-	public static void main(String[] args) throws Exception {
-		SetupManager manager = SetupManager.getInstance();
-		System.out.println(manager.getDefaultSetup());
-	}
-
-	static String[] parseItems(String string) {
-		if (string == null)
-			return new String[0];
-		StringTokenizer tokenizer = new StringTokenizer(string, ","); //$NON-NLS-1$
-		if (!tokenizer.hasMoreTokens())
-			return new String[0];
-		String first = tokenizer.nextToken().trim();
-		if (!tokenizer.hasMoreTokens())
-			return new String[] {first};
-		ArrayList items = new ArrayList();
-		items.add(first);
-		do {
-			items.add(tokenizer.nextToken().trim());
-		} while (tokenizer.hasMoreTokens());
-		return (String[]) items.toArray(new String[items.size()]);
-	}
-
-	protected SetupManager() throws SetupException {
-		setups = new ArrayList();
-		setupById = new HashMap();
-		try {
-			loadSetups();
-		} catch (SetupException e) {
-			throw e;
-		} catch (Exception e) {
-			throw new SetupException("Problems initializing SetupManager", e);
-		}
-	}
-
-	public Setup buildSetup(String[] optionSets) {
-		Setup defaultSetup = Setup.getDefaultSetup(this);
-		for (Iterator i = setups.iterator(); i.hasNext();) {
-			Setup customSetup = (Setup) i.next();
-			if ((customSetup.getId() == null || contains(optionSets, customSetup.getId())) && customSetup.isSatisfied(optionSets))
-				defaultSetup.merge(customSetup);
-		}
-		defaultSetup.setEclipseArguments(parseOptions(System.getProperty(SETUP_OVERRIDE_ECLIPSEARGS)));
-		defaultSetup.setVMArguments(parseOptions(System.getProperty(SETUP_OVERRIDE_VMARGS)));
-		defaultSetup.setSystemProperties(parseOptions(System.getProperty(SETUP_OVERRIDE_SYSTEMPROPERTIES)));
-		return defaultSetup;
-	}
-
-	private String getAttribute(NamedNodeMap attributes, String name) {
-		Node selected = attributes.getNamedItem(name);
-		return selected == null ? null : selected.getNodeValue();
-	}
-
-	private String[] getDefaultOptionSets() {
-		return parseItems(System.getProperty(SETUP_OPTIONS, defaultOptionSetIds));
-	}
-
-	/**
-	 * Returns a brand new setup object configured according to the current
-	 * default setup settings.
-	 * 
-	 * @return a new setup object
-	 */
-	public Setup getDefaultSetup() {
-		return buildSetup(getDefaultOptionSets());
-	}
-
-	public Setup getSetup(String id) {
-		return (Setup) setupById.get(id);
-	}
-
-	private void loadEclipseArgument(Setup newSetup, Element toParse) {
-		newSetup.setEclipseArgument(toParse.getAttribute("option"), toParse.getAttribute("value"));
-	}
-
-	private void loadProperty(Setup newSetup, Element toParse) {
-		newSetup.setSystemProperty(toParse.getAttribute("key"), toParse.getAttribute("value"));
-	}
-
-	private void loadSetup(Element markup) {
-		NamedNodeMap attributes = markup.getAttributes();
-		if (attributes == null)
-			return;
-		Setup newSetup = new Setup(this);
-		newSetup.setId(getAttribute(attributes, "id"));
-		newSetup.setName(getAttribute(attributes, "name"));
-		String timeout = getAttribute(attributes, "timeout");
-		newSetup.setBaseSetups(parseItems(getAttribute(attributes, "base")));
-		newSetup.setRequiredSets(parseItems(getAttribute(attributes, "with")));
-
-		if (timeout != null)
-			newSetup.setTimeout(Integer.parseInt(timeout));
-		NodeList children = markup.getChildNodes();
-		for (int i = 0; i < children.getLength(); i++) {
-			Node next = children.item(i);
-			if (!(next instanceof Element))
-				continue;
-			Element toParse = (Element) next;
-			if (toParse.getTagName().equals("eclipseArg"))
-				loadEclipseArgument(newSetup, toParse);
-			else if (toParse.getTagName().equals("vmArg"))
-				loadVMArgument(newSetup, toParse);
-			else if (toParse.getTagName().equals("systemProperty"))
-				loadProperty(newSetup, toParse);
-		}
-		setups.add(newSetup);
-		if (newSetup.getId() != null)
-			setupById.put(newSetup.getId(), newSetup);
-	}
-
-	private void loadSetups() throws ParserConfigurationException, FactoryConfigurationError, SAXException, IOException, SetupException {
-		String setupFilesProperty = System.getProperty(SETUP_FILES);
-		boolean defaultLocation = false;
-		if (setupFilesProperty == null) {
-			setupFilesProperty = "default-setup.xml";
-			defaultLocation = true;
-		}
-		String[] setupFileNames = parseItems(setupFilesProperty);
-		File[] setupFiles = new File[setupFileNames.length];
-		int found = 0;
-		for (int i = 0; i < setupFiles.length; i++) {
-			setupFiles[found] = new File(setupFileNames[i]);
-			if (!setupFiles[found].isFile()) {
-				if (!defaultLocation)
-					// warn if user-provided location does not exist
-					System.out.println("No setup files found at '" + setupFiles[i].getAbsolutePath() + "'. ");
-				continue;
-			}
-			found++;
-		}
-		if (found == 0) {
-			if (Platform.isRunning()) {
-				// No setup descriptions found, only the default setup will be available
-				return;
-			}
-			// no setup files found, and we are not running in Eclipse...  
-			throw new SetupException("No setup descriptions found. Ensure you are specifying the path for an existing setup file (e.g. -Dsetup.files=<setup-file-location1>[...,<setup-file-locationN>])");
-		}
-		DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		for (int fileIndex = 0; fileIndex < found; fileIndex++) {
-			Document doc = docBuilder.parse(setupFiles[fileIndex]);
-			Element root = doc.getDocumentElement();
-			String setupDefaultOptionSets = root.getAttribute("default");
-			if (setupDefaultOptionSets != null)
-				defaultOptionSetIds = defaultOptionSetIds == null ? setupDefaultOptionSets : (defaultOptionSetIds + ',' + setupDefaultOptionSets);
-			NodeList optionSets = root.getChildNodes();
-			for (int i = 0; i < optionSets.getLength(); i++) {
-				Node next = optionSets.item(i);
-				if (!(next instanceof Element))
-					continue;
-				Element toParse = (Element) next;
-				if (!toParse.getTagName().equals("optionSet"))
-					continue;
-				loadSetup(toParse);
-			}
-		}
-	}
-
-	private void loadVMArgument(Setup newSetup, Element toParse) {
-		newSetup.setVMArgument(toParse.getAttribute("option"), toParse.getAttribute("value"));
-	}
-
-	private Map parseOptions(String options) {
-		if (options == null)
-			return Collections.EMPTY_MAP;
-		Map result = new HashMap();
-		StringTokenizer tokenizer = new StringTokenizer(options.trim(), ";");
-		while (tokenizer.hasMoreTokens()) {
-			String option = tokenizer.nextToken();
-			int separatorIndex = option.indexOf('=');
-			if (separatorIndex == -1 || separatorIndex == option.length() - 1)
-				// property with no value defined
-				result.put(option, "");
-			else {
-				String key = option.substring(0, separatorIndex);
-				String value = option.substring(separatorIndex + 1);
-				result.put(key, value);
-			}
-		}
-		return result;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/TestDescriptor.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/TestDescriptor.java
deleted file mode 100644
index 6c4d4b5..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/TestDescriptor.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import junit.framework.*;
-
-/**
- * A test descriptor represents a test case. It is used by the session 
- * test framework to run tests remotely. Using test descriptors, one 
- * can run any test case provided by any plug-in by just providing the
- * plug-in id, the test class and the test case name.  
- */
-public class TestDescriptor extends TestCase {
-	private String applicationId;
-	private boolean crashTest;
-	private String method;
-	private String pluginId;
-	private Setup setup;
-	private Test test;
-	private String testClass;
-	private SessionTestRunner testRunner;
-
-	public TestDescriptor(String testClass, String method) {
-		this.testClass = testClass;
-		this.method = method;
-	}
-
-	public TestDescriptor(TestCase test) {
-		this.testClass = test.getClass().getName();
-		this.method = test.getName();
-		this.test = test;
-	}
-
-	public int countTestCases() {
-		return 1;
-	}
-
-	public String getApplicationId() {
-		return applicationId;
-	}
-
-	public String getName() {
-		return getTestMethod();
-	}
-
-	public String getPluginId() {
-		return pluginId;
-	}
-
-	public Setup getSetup() {
-		return setup;
-	}
-
-	public Test getTest() {
-		return test == null ? this : test;
-	}
-
-	public String getTestClass() {
-		return testClass;
-	}
-
-	public String getTestMethod() {
-		return method;
-	}
-
-	public SessionTestRunner getTestRunner() {
-		return testRunner;
-	}
-
-	public boolean isCrashTest() {
-		return crashTest;
-	}
-
-	public void run(TestResult result) {
-		Setup localSetup = (Setup) setup.clone();
-		localSetup.setEclipseArgument(Setup.APPLICATION, applicationId);
-		localSetup.setEclipseArgument("testpluginname", pluginId);
-		localSetup.setEclipseArgument("test", testClass + ':' + method);
-		getTestRunner().run(getTest(), result, localSetup, crashTest);
-	}
-
-	public void setApplicationId(String applicationId) {
-		this.applicationId = applicationId;
-	}
-
-	public void setCrashTest(boolean crashTest) {
-		this.crashTest = crashTest;
-	}
-
-	public void setPluginId(String pluginId) {
-		this.pluginId = pluginId;
-	}
-
-	public void setSetup(Setup setup) {
-		this.setup = setup == null ? null : (Setup) setup.clone();
-	}
-
-	public void setTestRunner(SessionTestRunner testRunner) {
-		this.testRunner = testRunner;
-	}
-
-	public String toString() {
-		return getName() + "(" + getTestClass() + ")";
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/UIPerformanceSessionTestSuite.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/UIPerformanceSessionTestSuite.java
deleted file mode 100644
index 4f7c211..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/UIPerformanceSessionTestSuite.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import org.eclipse.core.tests.session.SetupManager.SetupException;
-
-/**
- * TODO It should live in the UI tests instead.
- */
-public class UIPerformanceSessionTestSuite extends PerformanceSessionTestSuite {
-
-	public UIPerformanceSessionTestSuite(String pluginId, int timesToRun) {
-		super(pluginId, timesToRun);
-		setApplicationId(SessionTestSuite.UI_TEST_APPLICATION);
-	}
-
-	public UIPerformanceSessionTestSuite(String pluginId, int timesToRun, Class theClass) {
-		super(pluginId, timesToRun, theClass);
-		setApplicationId(SessionTestSuite.UI_TEST_APPLICATION);
-	}
-
-	public UIPerformanceSessionTestSuite(String pluginId, int timesToRun, Class theClass, String name) {
-		super(pluginId, timesToRun, theClass, name);
-		setApplicationId(SessionTestSuite.UI_TEST_APPLICATION);
-	}
-
-	public UIPerformanceSessionTestSuite(String pluginId, int timesToRun, String name) {
-		super(pluginId, timesToRun, name);
-		setApplicationId(SessionTestSuite.UI_TEST_APPLICATION);
-	}
-
-	/**
-	 * Ensures setup uses this suite's instance location.
-	 * @throws SetupException
-	 */
-	protected Setup newSetup() throws SetupException {
-		Setup base = super.newSetup();
-		base.setSystemProperty("org.eclipse.ui.testsWaitForEarlyStartup", "false");
-		return base;
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/WorkspaceSessionTestSuite.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/WorkspaceSessionTestSuite.java
deleted file mode 100644
index e223d36..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/WorkspaceSessionTestSuite.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.tests.harness.FileSystemHelper;
-import org.eclipse.core.tests.session.SetupManager.SetupException;
-
-public class WorkspaceSessionTestSuite extends SessionTestSuite {
-
-	private IPath instanceLocation = FileSystemHelper.getRandomLocation(FileSystemHelper.getTempDir());
-	// should the test cases be run in alphabetical order?
-	private boolean shouldSort;
-
-	public WorkspaceSessionTestSuite(String pluginId) {
-		super(pluginId);
-	}
-
-	public WorkspaceSessionTestSuite(String pluginId, Class theClass) {
-		super(pluginId, theClass);
-		this.shouldSort = true;
-	}
-
-	public WorkspaceSessionTestSuite(String pluginId, Class theClass, String name) {
-		super(pluginId, theClass, name);
-		this.shouldSort = true;
-	}
-
-	public WorkspaceSessionTestSuite(String pluginId, String name) {
-		super(pluginId, name);
-	}
-
-	/**
-	 * Ensures setup uses this suite's instance location.
-	 * @throws SetupException
-	 */
-	protected Setup newSetup() throws SetupException {
-		Setup base = super.newSetup();
-		base.setEclipseArgument(Setup.DATA, instanceLocation.toOSString());
-		return base;
-	}
-
-	/**
-	 * Ensures workspace location is empty before running the first test, and after
-	 * running the last test. Also sorts the test cases to be run if this suite was
-	 * created by reifying a test case class.
-	 */
-	public void run(TestResult result) {
-		try {
-			if (!shouldSort) {
-				super.run(result);
-				return;
-			}
-			// we have to sort the tests cases 			
-			Test[] allTests = getTests(true);
-			// now run the tests in order
-			for (int i = 0; i < allTests.length && !result.shouldStop(); i++)
-				runTest(allTests[i], result);
-		} finally {
-			FileSystemHelper.clear(instanceLocation.toFile());
-		}
-
-	}
-
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/MultipleRunsTest.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/MultipleRunsTest.java
deleted file mode 100644
index ca7895b..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/MultipleRunsTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session.samples;
-
-import junit.framework.*;
-import org.eclipse.core.tests.harness.CoreTest;
-import org.eclipse.core.tests.session.*;
-import org.eclipse.test.performance.*;
-
-public class MultipleRunsTest extends TestCase {
-	public void testMultipleRuns() throws SetupManager.SetupException {
-		// the test case to run multiple times
-		TestDescriptor test = new TestDescriptor(SampleSessionTest.class.getName(), "testApplicationStartup");
-		test.setApplicationId(SessionTestSuite.CORE_TEST_APPLICATION);
-		test.setPluginId(CoreTest.PI_HARNESS);
-		test.setTestRunner(new SessionTestRunner());
-		// setup the command line to be passed to the multiple runs so it has the right system properties			
-		test.setSetup(SetupManager.getInstance().getDefaultSetup());
-		test.getSetup().setSystemProperty("eclipse.perf.dbloc", System.getProperty("eclipse.perf.dbloc"));
-		test.getSetup().setSystemProperty("eclipse.perf.config", System.getProperty("eclipse.perf.config"));		
-		// runs the test case several times - only to collect data, won't do any assertions
-		TestResult result = new TestResult();
-		for (int i = 0; i < 5; i++) {
-			test.run(result);
-			if (result.failureCount() > 0) {
-				((TestFailure) result.failures().nextElement()).thrownException().printStackTrace();
-				return;
-			}
-			if (result.errorCount() > 0) {
-				((TestFailure) result.errors().nextElement()).thrownException().printStackTrace();
-				return;
-			}
-		}
-		// create a performance meter whose scenario id matches the one used in the test case run
-		// our convention: scenario IDs are <test case class name> + '.' + <test case method name> 
-		PerformanceMeter meter = Performance.getDefault().createPerformanceMeter(test.getTestClass() + '.' + test.getTestMethod());
-		// finally do the assertion
-		Performance.getDefault().assertPerformanceInRelativeBand(meter, Dimension.ELAPSED_PROCESS, -50, 5);
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/MultipleRunsTest2.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/MultipleRunsTest2.java
deleted file mode 100644
index 496cb28..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/MultipleRunsTest2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session.samples;
-
-import junit.framework.*;
-import org.eclipse.core.tests.harness.CoreTest;
-import org.eclipse.core.tests.session.PerformanceSessionTestSuite;
-import org.eclipse.core.tests.session.TestDescriptor;
-
-public class MultipleRunsTest2 extends TestCase {
-	public static Test suite() {
-		PerformanceSessionTestSuite suite = new PerformanceSessionTestSuite(CoreTest.PI_HARNESS, 10);
-		suite.addTest(new TestDescriptor(SampleSessionTest.class.getName(), "testApplicationStartup"));
-		return suite;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SameSessionTest.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SameSessionTest.java
deleted file mode 100644
index 98a70bb..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SameSessionTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session.samples;
-
-import junit.framework.*;
-
-public class SameSessionTest extends TestCase {
-
-	static String lastTestCase;
-
-	public SameSessionTest(String name) {
-		super(name);
-	}
-
-	public void test1() {
-		lastTestCase = getName();
-	}
-
-	public void test2() {
-		assertEquals("test1", lastTestCase);
-		lastTestCase = getName();
-	}
-
-	public void test3() {
-		assertEquals("test2", lastTestCase);
-	}
-
-	public static Test suite() {
-		TestSuite root = new TestSuite("root");
-		TestSuite node1 = new TestSuite("node1");
-		node1.addTest(new SameSessionTest("test1"));
-		root.addTest(node1);
-		TestSuite node2 = new TestSuite("node2");
-		root.addTest(node2);
-		TestSuite node21 = new TestSuite("node21");
-		node2.addTest(node21);
-		node21.addTest(new SameSessionTest("test2"));
-		node2.addTest(new SameSessionTest("test3"));
-		return root;
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SampleCrashTest.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SampleCrashTest.java
deleted file mode 100644
index a4c1c42..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SampleCrashTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session.samples;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import org.eclipse.core.tests.harness.CoreTest;
-import org.eclipse.core.tests.session.SessionTestSuite;
-
-public class SampleCrashTest extends TestCase {
-	public SampleCrashTest(String methodName) {
-		super(methodName);
-	}
-
-	public void test1() {
-		// Everything is fine...
-		System.out.println(getName());
-	}
-
-	public void test2() {
-		// crash
-		System.out.println(getName());
-		System.exit(2);
-	}
-
-	public void test3() {
-		// Everything is again...
-		System.out.println(getName());
-	}
-
-	public static Test suite() {
-		SessionTestSuite sameSession = new SessionTestSuite(CoreTest.PI_HARNESS);
-		sameSession.addTest(new SampleCrashTest("test1"));
-		sameSession.addCrashTest(new SampleCrashTest("test2"));
-		sameSession.addTest(new SampleCrashTest("test3"));
-		return sameSession;
-	}
-
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SampleSessionTest.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SampleSessionTest.java
deleted file mode 100644
index 7eff16f..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SampleSessionTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session.samples;
-
-import junit.framework.*;
-import org.eclipse.core.tests.harness.CoreTest;
-import org.eclipse.core.tests.session.SessionTestSuite;
-import org.eclipse.test.performance.*;
-
-public class SampleSessionTest extends TestCase {
-	public SampleSessionTest(String methodName) {
-		super(methodName);
-	}
-
-	public void testBasic1() {
-		// Everything is fine...
-	}
-
-	public void testBasic2() {
-		fail("Breaking the test " + System.currentTimeMillis());
-	}
-
-	public void testBasic3() {
-		throw new RuntimeException("Will break the test as well " + System.currentTimeMillis());
-	}
-
-	public void testApplicationStartup() {
-		PerformanceMeter meter = Performance.getDefault().createPerformanceMeter(getClass().getName() + ".testPerformance");
-		try {
-			meter.stop();
-			meter.commit();
-			Performance.getDefault().assertPerformanceInRelativeBand(meter, Dimension.ELAPSED_PROCESS, -50, 5);
-		} finally {
-			meter.dispose();
-		}
-	}
-
-	public static Test suite() {
-		TestSuite sameSession = new SessionTestSuite(CoreTest.PI_HARNESS, SampleSessionTest.class);
-		return sameSession;
-	}
-
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SampleTests.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SampleTests.java
deleted file mode 100644
index 62f4478..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/SampleTests.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session.samples;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.eclipse.core.tests.harness.CoreTest;
-import org.eclipse.core.tests.session.SessionTestSuite;
-
-public class SampleTests extends TestSuite {
-	public SampleTests() {
-		addTest(SampleSessionTest.suite());
-		addTest(UISampleSessionTest.suite());
-		TestSuite another = new SessionTestSuite(CoreTest.PI_HARNESS);
-		another.addTestSuite(SampleSessionTest.class);
-		addTest(another);
-		// these tests should run in the same session (don't add to a non-shared session test suite)
-		SessionTestSuite shared = new SessionTestSuite(CoreTest.PI_HARNESS);
-		shared.addTestSuite(SameSessionTest.class);
-		shared.setSharedSession(true);
-		addTest(shared);
-		// play with a crash test
-		addTest(SampleCrashTest.suite());
-	}
-
-	public static Test suite() {
-		return new SampleTests();
-	}
-}
diff --git a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/UISampleSessionTest.java b/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/UISampleSessionTest.java
deleted file mode 100644
index cc4cea3..0000000
--- a/tests/org.eclipse.core.tests.harness/src/org/eclipse/core/tests/session/samples/UISampleSessionTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.session.samples;
-
-import java.util.Date;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import org.eclipse.core.tests.harness.CoreTest;
-import org.eclipse.core.tests.session.SessionTestSuite;
-import org.eclipse.test.performance.*;
-
-public class UISampleSessionTest extends TestCase {
-	public UISampleSessionTest(String methodName) {
-		super(methodName);
-	}
-	
-	/**
-	 * Print a debug message to the console. 
-	 * Pre-pend the message with the current date and the name of the current thread.
-	 */
-	public static void message(String message) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(new Date(System.currentTimeMillis()));
-		buffer.append(" - ["); //$NON-NLS-1$
-		buffer.append(Thread.currentThread().getName());
-		buffer.append("] "); //$NON-NLS-1$
-		buffer.append(message);
-		System.out.println(buffer.toString());
-	}
-
-	public void testApplicationStartup() {
-		message("Running " + getName());
-		PerformanceMeter meter = Performance.getDefault().createPerformanceMeter(getClass().getName() + ".UIStartup");
-		try {
-			meter.stop();
-			meter.commit();
-			Performance.getDefault().assertPerformanceInRelativeBand(meter, Dimension.ELAPSED_PROCESS, -50, 5);
-		} finally {
-			meter.dispose();
-		}
-	}
-
-	public static Test suite() {
-		SessionTestSuite suite = new SessionTestSuite(CoreTest.PI_HARNESS);
-		suite.setApplicationId(SessionTestSuite.UI_TEST_APPLICATION);
-		for (int i = 0; i < 3; i++)
-			suite.addTest(new UISampleSessionTest("testApplicationStartup"));
-		return suite;
-	}
-
-}
