diff --git a/platform/org.eclipse.platform/.classpath b/platform/org.eclipse.platform/.classpath
deleted file mode 100644
index 618ac00..0000000
--- a/platform/org.eclipse.platform/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry output="bin-intro" kind="src" path="src-intro"/>
-	<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/platform/org.eclipse.platform/.cvsignore b/platform/org.eclipse.platform/.cvsignore
deleted file mode 100644
index 2f6d5a5..0000000
--- a/platform/org.eclipse.platform/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-bin-intro
diff --git a/platform/org.eclipse.platform/.project b/platform/org.eclipse.platform/.project
deleted file mode 100644
index e28fafc..0000000
--- a/platform/org.eclipse.platform/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.platform</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.ui.intro</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/platform/org.eclipse.platform/SplashFinal_500x330.psd b/platform/org.eclipse.platform/SplashFinal_500x330.psd
deleted file mode 100644
index b82e877..0000000
--- a/platform/org.eclipse.platform/SplashFinal_500x330.psd
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/about.html b/platform/org.eclipse.platform/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/platform/org.eclipse.platform/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/about.ini b/platform/org.eclipse.platform/about.ini
deleted file mode 100644
index cbdcb66..0000000
--- a/platform/org.eclipse.platform/about.ini
+++ /dev/null
@@ -1,25 +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 feature details in the "About" 
-# dialog (translated).  Maximum 15 lines and 75 characters per line.
-aboutText=%blurb
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# ($nl$/ prefix to permit locale-specific translations of entire file)
-welcomePage=$nl$/welcome.xml
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-# Property "tipsAndTricksHref" contains the Help topic href to a tips and tricks page 
-# optional
-tipsAndTricksHref=/org.eclipse.platform.doc.user/tips/platform_tips.html
-
diff --git a/platform/org.eclipse.platform/about.mappings b/platform/org.eclipse.platform/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/platform/org.eclipse.platform/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/platform/org.eclipse.platform/about.properties b/platform/org.eclipse.platform/about.properties
deleted file mode 100644
index 90a4aa2..0000000
--- a/platform/org.eclipse.platform/about.properties
+++ /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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-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.
-#
-# Do not translate any values surrounded by {}
-
-blurb=Eclipse Platform\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2004.  All rights reserved.\n\
-Visit http://www.eclipse.org/platform\n\
-\n\
-This product includes software developed by the\n\
-Apache Software Foundation http://www.apache.org/
diff --git a/platform/org.eclipse.platform/build.properties b/platform/org.eclipse.platform/build.properties
deleted file mode 100644
index 30e9bf8..0000000
--- a/platform/org.eclipse.platform/build.properties
+++ /dev/null
@@ -1,34 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = about.html,\
-               about.ini,\
-               about.mappings,\
-               about.properties,\
-               eclipse_lg.gif,\
-               eclipse.gif,\
-               eclipse32.gif,\
-               plugin_customization.ini,\
-               plugin_customization.properties,\
-               plugin.xml,\
-               plugin.properties,\
-               splash.bmp,\
-               css/,\
-               cheatsheets/,\
-               welcome.xml,\
-               introContent.xml,\
-               platform.jar,\
-               intro.gif
-src.includes = about.html,\
-               launchersrc.zip,\
-               platformsrc.zip
-source.startup.jar = src/
-source.platform.jar = src-intro/
-manifest.startup.jar = META-INF/MANIFEST.MF
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/cheatsheets/CVS_1.xml b/platform/org.eclipse.platform/cheatsheets/CVS_1.xml
deleted file mode 100644
index ca75638..0000000
--- a/platform/org.eclipse.platform/cheatsheets/CVS_1.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?> 
-<cheatsheet title="CVS - Merging from one branch to another">
-
-	<intro 
-		href="/org.eclipse.platform.doc.user/reference/ref-cheatsheets.htm">
-		<description>
-This cheat sheet will automatically launch wizards, perform actions, and guide you through the individual steps to merge changes from a CVS branch into another branch, or into HEAD. To learn more about using cheat sheets or to see a list of available cheat sheets click help (?).To start working on this cheat sheet, click the "Click to begin" button below.
-		</description>
-	</intro>
-
-	<item
-		href="/org.eclipse.platform.doc.user/tasks/tasks-100b.htm"
-		title="Determine Branch and Version Information">
-		<description>
-In this step you must determine the name of the branch or version that contains your changes and the version from which the branch was created. This is a manual task, you will need to perform the work and click the "Click to complete" button to move to the next step. 
-		</description>
-	</item>
-
-	<item
-		href="/org.eclipse.platform.doc.user/tasks/tasks-100b.htm"
-		title="Load the Destination into your Workspace">
-		<description>
-Select the project and choose Replace With &gt; Another Branch or Version from the context menu. Then select the branch to replace with. In this step you must ensure that the destination is loaded into your workspace. This is a manual task, you will need to perform the work and click the "Click to complete" button to move to the next step.
-		</description>
-	</item>
-
-	<item
-		href="/org.eclipse.platform.doc.user/tasks/tasks-100b.htm" 
-		title="Merge Details">
-		<description>
-Select the project, choose Team &gt; Merge and complete the wizard as required. This step specifies the details of the merge.  This is a manual task, you will need to perform the work and click the "Click to complete" button to move to the next step.
-		</description>
-	</item>
-
-	<item
-		href="/org.eclipse.platform.doc.user/tasks/tasks-100b.htm"
-		title="Work with the Merge Editor">
-		<description>
-In the Merge editor manually merge the changes. This step loads the required changes into the workspace. This is a manual task, you will need to perform the work and click the "Click to complete" button to move to the next step.
-		</description>
-	</item>
-
-	<item
-		href="/org.eclipse.platform.doc.user/tasks/tasks-100b.htm"
-		title="Commit your changes">
-		<description>
-Select Team &gt; Synchronize with Repository and then commit all the changes to the repository. This step finalizes the transfer of the changes from the workspace to the CVS repository. This is a manual task, you will need to perform the work and click the "Click to complete" button to move to the next step.
-		</description>
-	</item>
-
-</cheatsheet>
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/background.jpg b/platform/org.eclipse.platform/css/graphics/contentpage/background.jpg
deleted file mode 100644
index ce1cada..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/background.jpg
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/backgroundcurve.gif b/platform/org.eclipse.platform/css/graphics/contentpage/backgroundcurve.gif
deleted file mode 100644
index 8c5ec1d..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/backgroundcurve.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/content_background.jpg b/platform/org.eclipse.platform/css/graphics/contentpage/content_background.jpg
deleted file mode 100644
index ce1cada..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/content_background.jpg
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/overview_wtr.jpg b/platform/org.eclipse.platform/css/graphics/contentpage/overview_wtr.jpg
deleted file mode 100644
index 733e48c..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/overview_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/samples_wtr.jpg b/platform/org.eclipse.platform/css/graphics/contentpage/samples_wtr.jpg
deleted file mode 100644
index 78e703a..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/samples_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/section1.gif b/platform/org.eclipse.platform/css/graphics/contentpage/section1.gif
deleted file mode 100644
index 6147513..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/section1.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/section2.gif b/platform/org.eclipse.platform/css/graphics/contentpage/section2.gif
deleted file mode 100644
index 0ee148b..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/section2.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/section3.gif b/platform/org.eclipse.platform/css/graphics/contentpage/section3.gif
deleted file mode 100644
index b5d24e6..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/section3.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/section4.gif b/platform/org.eclipse.platform/css/graphics/contentpage/section4.gif
deleted file mode 100644
index 258d4a8..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/section4.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/tutorials_wtr.jpg b/platform/org.eclipse.platform/css/graphics/contentpage/tutorials_wtr.jpg
deleted file mode 100644
index e74c7c0..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/tutorials_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/whatsnew_wtr.jpg b/platform/org.eclipse.platform/css/graphics/contentpage/whatsnew_wtr.jpg
deleted file mode 100644
index c2a42da..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/whatsnew_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/contentpage/wordmark.gif b/platform/org.eclipse.platform/css/graphics/contentpage/wordmark.gif
deleted file mode 100644
index 27ca85d..0000000
--- a/platform/org.eclipse.platform/css/graphics/contentpage/wordmark.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/overview48.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/overview48.gif
deleted file mode 100644
index 7da24bd..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/overview48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/overview48sel.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/overview48sel.gif
deleted file mode 100644
index 3d1c45b..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/overview48sel.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/overview72.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/overview72.gif
deleted file mode 100644
index d34b4b3..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/overview72.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/samples48.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/samples48.gif
deleted file mode 100644
index 3213de6..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/samples48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/samples48sel.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/samples48sel.gif
deleted file mode 100644
index f9c0469..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/samples48sel.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/samples72.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/samples72.gif
deleted file mode 100644
index 4c63a9a..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/samples72.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/tutorials48.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/tutorials48.gif
deleted file mode 100644
index 1a3f06a..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/tutorials48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/tutorials48sel.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/tutorials48sel.gif
deleted file mode 100644
index 3d687bd..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/tutorials48sel.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/tutorials72.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/tutorials72.gif
deleted file mode 100644
index a2aa343..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/tutorials72.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/wb48.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/wb48.gif
deleted file mode 100644
index c2fd06a..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/wb48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/whatsnew48.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/whatsnew48.gif
deleted file mode 100644
index 2bfb9be..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/whatsnew48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/whatsnew48sel.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/whatsnew48sel.gif
deleted file mode 100644
index 0da843f..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/whatsnew48sel.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/ctool/whatsnew72.gif b/platform/org.eclipse.platform/css/graphics/icons/ctool/whatsnew72.gif
deleted file mode 100644
index 74bf6ff..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/ctool/whatsnew72.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/dtool/back.gif b/platform/org.eclipse.platform/css/graphics/icons/dtool/back.gif
deleted file mode 100644
index f0d0929..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/dtool/back.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/dtool/forward.gif b/platform/org.eclipse.platform/css/graphics/icons/dtool/forward.gif
deleted file mode 100644
index dbe58b2..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/dtool/forward.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/dtool/overview.gif b/platform/org.eclipse.platform/css/graphics/icons/dtool/overview.gif
deleted file mode 100644
index 2bc7b0d..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/dtool/overview.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/dtool/restore_welcome.gif b/platform/org.eclipse.platform/css/graphics/icons/dtool/restore_welcome.gif
deleted file mode 100644
index 4997b20..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/dtool/restore_welcome.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/dtool/samples.gif b/platform/org.eclipse.platform/css/graphics/icons/dtool/samples.gif
deleted file mode 100644
index 5cf3cae..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/dtool/samples.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/dtool/tutorials.gif b/platform/org.eclipse.platform/css/graphics/icons/dtool/tutorials.gif
deleted file mode 100644
index 63826a5..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/dtool/tutorials.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/dtool/whatsnew.gif b/platform/org.eclipse.platform/css/graphics/icons/dtool/whatsnew.gif
deleted file mode 100644
index 8056c99..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/dtool/whatsnew.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/back.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/back.gif
deleted file mode 100644
index 1c81cb6..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/back.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/forward.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/forward.gif
deleted file mode 100644
index 3e4a4f4..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/forward.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/overview.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/overview.gif
deleted file mode 100644
index 3fe629a..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/overview.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/overview48.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/overview48.gif
deleted file mode 100644
index 8e2f8c1..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/overview48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/overview48sel.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/overview48sel.gif
deleted file mode 100644
index 1275a4a..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/overview48sel.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/overview72.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/overview72.gif
deleted file mode 100644
index e3f7648..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/overview72.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/restore_welcome.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/restore_welcome.gif
deleted file mode 100644
index 7736bce..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/restore_welcome.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/samples.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/samples.gif
deleted file mode 100644
index c695884..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/samples.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/samples48.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/samples48.gif
deleted file mode 100644
index 63d405b..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/samples48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/samples48sel.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/samples48sel.gif
deleted file mode 100644
index 4c3135d..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/samples48sel.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/samples72.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/samples72.gif
deleted file mode 100644
index 9216426..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/samples72.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials.gif
deleted file mode 100644
index a18d7dd..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials48.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials48.gif
deleted file mode 100644
index 718ca6c..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials48sel.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials48sel.gif
deleted file mode 100644
index 10680e5..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials48sel.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials72.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials72.gif
deleted file mode 100644
index bab3498..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/tutorials72.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/wb48.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/wb48.gif
deleted file mode 100644
index 50ca287..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/wb48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew.gif
deleted file mode 100644
index f022324..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew48.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew48.gif
deleted file mode 100644
index 6e00d7a..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew48.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew48sel.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew48sel.gif
deleted file mode 100644
index be9fa0c..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew48sel.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew72.gif b/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew72.gif
deleted file mode 100644
index 410093b..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/etool/whatsnew72.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/community_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/community_obj.gif
deleted file mode 100644
index 5d132a8..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/community_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/communityhov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/communityhov_obj.gif
deleted file mode 100644
index acb2a58..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/communityhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/features_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/features_obj.gif
deleted file mode 100644
index 364fd48..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/features_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/featureshov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/featureshov_obj.gif
deleted file mode 100644
index fbfdf03..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/featureshov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapp_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapp_obj.gif
deleted file mode 100644
index ce00d50..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapphov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapphov_obj.gif
deleted file mode 100644
index 35e9f58..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapplet_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapplet_obj.gif
deleted file mode 100644
index b19a952..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapplet_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapplethov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapplethov_obj.gif
deleted file mode 100644
index 5da3db9..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/javaapplethov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/javadev_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/javadev_obj.gif
deleted file mode 100644
index f6526a2..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/javadev_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/javadevhov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/javadevhov_obj.gif
deleted file mode 100644
index 36b47d3..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/javadevhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/migrate_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/migrate_obj.gif
deleted file mode 100644
index 0c2fe88..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/migrate_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/migratehov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/migratehov_obj.gif
deleted file mode 100644
index ee34e2a..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/migratehov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/new_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/new_obj.gif
deleted file mode 100644
index f46b81b..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/new_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/newhov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/newhov_obj.gif
deleted file mode 100644
index 593e63b..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/newhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/plugin_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/plugin_obj.gif
deleted file mode 100644
index d92d2c5..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/plugin_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/pluginhov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/pluginhov_obj.gif
deleted file mode 100644
index 1de8ccc..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/pluginhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/rcpapp_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/rcpapp_obj.gif
deleted file mode 100644
index 830ab56..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/rcpapp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/rcpapphov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/rcpapphov_obj.gif
deleted file mode 100644
index 5bd80a9..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/rcpapphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/samplepurp_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/samplepurp_obj.gif
deleted file mode 100644
index c4e56fc..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/samplepurp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/samplepurphov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/samplepurphov_obj.gif
deleted file mode 100644
index 60481e2..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/samplepurphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/samplered_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/samplered_obj.gif
deleted file mode 100644
index f6d104e..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/samplered_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/sampleredhov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/sampleredhov_obj.gif
deleted file mode 100644
index 687d6b2..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/sampleredhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/script_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/script_obj.gif
deleted file mode 100644
index b48b7cd..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/script_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/scripthov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/scripthov_obj.gif
deleted file mode 100644
index d67203e..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/scripthov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/swtapp_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/swtapp_obj.gif
deleted file mode 100644
index 9ba9a33..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/swtapp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/swtapphov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/swtapphov_obj.gif
deleted file mode 100644
index c4fbb5d..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/swtapphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/teamsup_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/teamsup_obj.gif
deleted file mode 100644
index 4b9def9..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/teamsup_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/teamsuphov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/teamsuphov_obj.gif
deleted file mode 100644
index 4bdf819..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/teamsuphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/updates_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/updates_obj.gif
deleted file mode 100644
index 1608b30..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/updates_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/updateshov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/updateshov_obj.gif
deleted file mode 100644
index 22a0ace..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/updateshov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/wbbasics_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/wbbasics_obj.gif
deleted file mode 100644
index 8b82563..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/wbbasics_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/icons/obj48/wbbasicshov_obj.gif b/platform/org.eclipse.platform/css/graphics/icons/obj48/wbbasicshov_obj.gif
deleted file mode 100644
index 230be9c..0000000
--- a/platform/org.eclipse.platform/css/graphics/icons/obj48/wbbasicshov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/rootpage/background.jpg b/platform/org.eclipse.platform/css/graphics/rootpage/background.jpg
deleted file mode 100644
index 969fcf3..0000000
--- a/platform/org.eclipse.platform/css/graphics/rootpage/background.jpg
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/rootpage/brandmark.gif b/platform/org.eclipse.platform/css/graphics/rootpage/brandmark.gif
deleted file mode 100644
index 93f25f7..0000000
--- a/platform/org.eclipse.platform/css/graphics/rootpage/brandmark.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/rootpage/dots.gif b/platform/org.eclipse.platform/css/graphics/rootpage/dots.gif
deleted file mode 100644
index 6621b7c..0000000
--- a/platform/org.eclipse.platform/css/graphics/rootpage/dots.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/graphics/swt/form_banner.gif b/platform/org.eclipse.platform/css/graphics/swt/form_banner.gif
deleted file mode 100644
index aebc0b2..0000000
--- a/platform/org.eclipse.platform/css/graphics/swt/form_banner.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/overview/overview.css b/platform/org.eclipse.platform/css/overview/overview.css
deleted file mode 100644
index 859a390..0000000
--- a/platform/org.eclipse.platform/css/overview/overview.css
+++ /dev/null
@@ -1,69 +0,0 @@
-body {
-	background-image : url(../graphics/contentpage/overview_wtr.jpg);
-}
-
-.page { min-height : 700px; }
-
-/* show the "selected" image for this page */
-#navigation-links a#overview img, #navigation-links a#overview:hover img { background-image : url(../graphics/icons/ctool/overview48sel.gif); }
-
-/* 
- * Set up the Overview links to be displayed in two columns
- * that are centered in the middle of the page.
- */
-
-#overview-links {
-	text-align : left;
-	width : 760px;
-	/* To center in Moz (have to use text-align for IE) */
-	margin : 0px auto;
-}
-
-#overview-links a { 
-	width : 370px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 5px;
-	margin-bottom : -20px;
-	vertical-align : top;
-}
-
-#overview-links > a { vertical-align : middle; }
-
-#overview-links a img {
-	height : 57px;
-	width : 57px;
-	vertical-align : middle;
-}	
-
-#overview-links a .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-#overview-links a p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-/* Special case for Mozilla, because the links are displayed
-   in 1 vertical column instead of 2 centered columns */
-#overview-links > a { 	width : 700px; }
-#overview-links a > .link-label { width : 700px; }
-#overview-links a p > .text { width : 700px; }
-
-#overview-links a:hover { border-right : 5px; }
-
-a#basics img { background-image : url(../graphics/icons/obj48/wbbasics_obj.gif); }
-a#basics:hover img { background-image : url(../graphics/icons/obj48/wbbasicshov_obj.gif); }
-
-a#team img { background-image : url(../graphics/icons/obj48/teamsup_obj.gif); }
-a#team:hover img { background-image : url(../graphics/icons/obj48/teamsuphov_obj.gif); }
-
diff --git a/platform/org.eclipse.platform/css/overview/swt.properties b/platform/org.eclipse.platform/css/overview/swt.properties
deleted file mode 100644
index 540306b..0000000
--- a/platform/org.eclipse.platform/css/overview/swt.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-
-overview.layout.ncolumns = 2
-overview.page-content.overview-links.layout.vspacing = 35
-
-overview.page-content.overview-links.basics.link-icon = css/graphics/icons/obj48/wbbasics_obj.gif
-overview.page-content.overview-links.team.link-icon = css/graphics/icons/obj48/teamsup_obj.gif
-overview.page-content.overview-links.layout.ncolumns = 2
-
-overview.subtitle-id = overview/page-content/page-title
-overview.description-id = overview/page-content/page-description
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/css/root.css b/platform/org.eclipse.platform/css/root.css
deleted file mode 100644
index 629eae9..0000000
--- a/platform/org.eclipse.platform/css/root.css
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/css/root_swt.properties b/platform/org.eclipse.platform/css/root_swt.properties
deleted file mode 100644
index bbbdb55..0000000
--- a/platform/org.eclipse.platform/css/root_swt.properties
+++ /dev/null
@@ -1,29 +0,0 @@
-
-root.links-background.page-links.overview.link-icon = css/graphics/icons/etool/overview72.gif
-root.links-background.page-links.tutorials.link-icon = css/graphics/icons/etool/tutorials72.gif
-root.links-background.page-links.samples.link-icon= css/graphics/icons/etool/samples72.gif
-root.links-background.page-links.news.link-icon = css/graphics/icons/etool/whatsnew72.gif
-root.action-links.workbench.link-icon = css/graphics/icons/etool/wb48.gif
-
-root.links-background.page-links.overview.hover-icon = css/graphics/icons/ctool/overview72.gif
-root.links-background.page-links.tutorials.hover-icon = css/graphics/icons/ctool/tutorials72.gif
-root.links-background.page-links.samples.hover-icon = css/graphics/icons/ctool/samples72.gif
-root.links-background.page-links.news.hover-icon = css/graphics/icons/ctool/whatsnew72.gif
-root.action-links.workbench.hover-icon = css/graphics/icons/ctool/wb48.gif
-
-
-root.links-background.page-links.overview.small-link-icon = css/graphics/icons/etool/overview48.gif
-root.links-background.page-links.tutorials.small-link-icon = css/graphics/icons/etool/tutorials48.gif
-root.links-background.page-links.samples.small-link-icon = css/graphics/icons/etool/samples48.gif
-root.links-background.page-links.news.small-link-icon = css/graphics/icons/etool/whatsnew48.gif
-root.action-links.workbench.small-link-icon = css/graphics/icons/etool/wb48.gif
-
-root.links-background.page-links.overview.small-hover-icon = css/graphics/icons/ctool/overview48.gif
-root.links-background.page-links.tutorials.small-hover-icon = css/graphics/icons/ctool/tutorials48.gif
-root.links-background.page-links.samples.small-hover-icon = css/graphics/icons/ctool/samples48.gif
-root.links-background.page-links.news.small-hover-icon = css/graphics/icons/ctool/whatsnew48.gif
-root.action-links.workbench.small-hover-icon = css/graphics/icons/ctool/wb48.gif
-
-root.layout.ncolumns = 1
-root.links-background.page-links.layout.hspacing = 40
-root.layout.vspacing = 35
diff --git a/platform/org.eclipse.platform/css/samples/samples.css b/platform/org.eclipse.platform/css/samples/samples.css
deleted file mode 100644
index 3ccb2cd..0000000
--- a/platform/org.eclipse.platform/css/samples/samples.css
+++ /dev/null
@@ -1,94 +0,0 @@
-body {
-	background-image : url(../graphics/contentpage/samples_wtr.jpg);
-}
-
-.page { min-height : 700px; }
-
-/* show the "selected" image for this page */
-#navigation-links a#samples img, #navigation-links a#samples:hover img { background-image : url(../graphics/icons/ctool/samples48sel.gif); }
-
-/* Lay out the real content of the samples page: */
-
-.samples-group {
-	width : 750px;
-	/* To center in Moz (have to use text-align for IE) */	
-	margin : 0px auto;
-	margin-bottom : 10px;
-	text-align : left;
-	float : none;
-	clear : both;
-}
-
-.samples-group H4 { margin-top : 10px; }
-
-.sample-link { 
-	width : 360px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 10px;
-	margin-bottom : -30px;
-	vertical-align : top;
-}
-
-/* specialize the swt samples group to be spread over only 1 column */
-#swt .sample-link { 
-	width : 720px;
-}
-
-.samples-group > .sample-link {
-	float : left;
-	height : 150px;
-	vertical-align : middle;
-}
-
-
-.sample-link .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-#swt .sample-link .link-label {
-	width : 600px;	
-} 
-
-.sample-link p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-#swt .sample-link .text {
-	width : 620px;	
-} 
-
-.sample-link img {
-	height : 56px;
-	width : 56px;
-	vertical-align : middle;
-}
-
-.sample-link:hover { border-right : 0px; }
-
-
-#swt .sample-link img {
-	background-image : url(../graphics/icons/obj48/samplered_obj.gif);
-}
-
-#swt .sample-link:hover img {
-	background-image : url(../graphics/icons/obj48/sampleredhov_obj.gif);
-}
-
-#workbench .sample-link img {
-	background-image : url(../graphics/icons/obj48/samplepurp_obj.gif);
-}
-
-#workbench .sample-link:hover img {
-	background-image : url(../graphics/icons/obj48/samplepurphov_obj.gif);
-}
-
diff --git a/platform/org.eclipse.platform/css/samples/swt.properties b/platform/org.eclipse.platform/css/samples/swt.properties
deleted file mode 100644
index 1976209..0000000
--- a/platform/org.eclipse.platform/css/samples/swt.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-samples.link-icon = css/graphics/icons/obj48/samplepurp_obj.gif
-samples.page-content.swt.swt-examples.link-icon = css/graphics/icons/obj48/samplered_obj.gif
-
-samples.page-content.layout.vspacing = 40
-samples.page-content.swt.layout.ncolumns = 2
-samples.page-content.swt.layout.vspacing = 30
-samples.page-content.swt.layout.hspacing = 30
-samples.page-content.workbench.layout.ncolumns = 2
-samples.page-content.workbench.layout.vspacing = 30
-samples.page-content.workbench.layout.hspacing = 30
-
-description-style-id = group-description
-samples.subtitle-id = samples/page-content/page-title
-samples.description-id = samples/page-content/page-description
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/css/shared.css b/platform/org.eclipse.platform/css/shared.css
deleted file mode 100644
index a82597c..0000000
--- a/platform/org.eclipse.platform/css/shared.css
+++ /dev/null
@@ -1,264 +0,0 @@
-/* 
- * Set up general fonts, sizes and colors 
- */
-body { font-family : Arial, sans-serif; }
-
-H1, H2, H3, H4, p, a { color : #4D4D4D; }
-
-.intro-header H1 {
-	font-size : 16pt;
-	font-weight : normal;
-	color : #E5E5E5;
-}
-
-h2 {
-	font-size : 13pt;
-	font-weight : normal;
-	color : #7B8694;
-}
-/* For regular div labels */
-H4 .div-label {
-	font-size : 10pt;
-	font-weight : bold;
-}
-
-/* For the main page content's title */
-#content-header H4 .div-label {
-	font-size : 14pt;
-	font-weight : normal;
-	color : #8C96A2;
-	float : none;
-	clear : both;
-}
-
-.page-description { 
-	font-size : 10pt;
-	float : none;
-	clear : both;
-}
-
-a {
-	font-weight : bold;
-	text-decoration : none;
-	color : #4D4D4D;
-}
-
-a .link-label {
-	font-size : 10pt;
-	font-weight : normal;
-}
-
-#navigation-links a .link-label {
-	font-size : 9pt;
-	font-weight : normal;
-	color : #E5E5E5;
-}
-
-a .text {
-	font-size : 8pt;
-	font-weight : normal;
-}
-
-p .group-description {
-	font-size : 10pt;
-	font-weight : normal;
-}
-
-
-/* 
- * Set up other general properties like padding/margins
- */
-html, body { width : 100%; height : 100%; }
-
-html, body, div, h1, h4, p, a { margin : 0px; padding : 0px; }
-
-.intro-header H1 { padding-top : 10px; margin-left : 10px; }
-
-/* For regular div labels */
-#page-content div H4 {
-	padding : 10px;
-	padding-bottom : 0px;
-}
-
-/* For the main page content's div label */
-#page-content #content-header H4 {
-	padding-bottom : 10px;
-	padding-top : 0px;
-}
-
-/* special case for Mozilla's main content-header label.
-   Mozilla 1.4 needs more room at the top */
-#page-content > #content-header H4 { padding-top : 10px; }
-
-/* Needed in IE to get shift+tab to show the active image properly */
-a:active {
-	border : solid 0px;
-}
-
-a img {
-	border-width : 0;
-	background-repeat : no-repeat;
-}
-
-/*
- * to get scrollbars working in both IE and Mozilla
- */
-html,body { overflow: auto; }
-html>body { overflow: visible; }
-
-/*
- * Set up the body, decorative background, and navigation for the content 
- * pages. 
- * Note: the root page handles its own background and navigation; these
- * settings primarily apply to the content pages
- */
-body {
-	background-color : #FFFFFF;
-	background-repeat : no-repeat;
-	background-position : bottom right;
-}
-
-#background-image {
-	width : 100%;
-	min-width : 770px;
-	height : 164px;
-	background-image : url(graphics/contentpage/background.jpg);
-	background-repeat : no-repeat;
-	background-position : top left;	
-	position : absolute;
-	top : 0px;
-	z-index : -100;
-}
-
-#curve-image { 
-	width : 100%;
-	height : 164px;
-	position : absolute;
-	top : 0px;
-	background-image : url(graphics/contentpage/backgroundcurve.gif);
-	background-repeat : no-repeat;
-	background-position : top center;
-	margin : 0;
-	padding : 0;
-}
-
-.intro-header {	background-color : transparent; z-index : 100;}
-
-body, .page{
-	min-width : 770px;
-	/* since IE doesn't support min-width, try expression */
-	width:expression(document.body.clientWidth < 770? "770px": "auto" );
-	min-height : 425px;
-	height : 100%;
-	height : expression(document.body.clientHeight < 425? "425px": "100%" );
-}
-
-.page { 
-	background-image : url(graphics/contentpage/wordmark.gif);
-	background-repeat : no-repeat;
-	background-position : bottom left;
-	min-height : 475px;
-}
-
-#page-content {
-	background-repeat : no-repeat;
-	background-position : bottom right;
-	height : 70%;
-}
-
-/* 
- * Lay out the navigation links 
- * (Root page does something similar for its navigation)
- */
-#navigation-links {
-	position : relative;
-	left : 10px;
-	top : 5px;
-	height : 60;
-	width : 98%;
-}
-
-#navigation-links a {
-	padding-left : 5px;
-	padding-right : 5px;
-	float : left;
-	text-align : center;
-}
-
-#navigation-links a img {
-	height : 52px;
-	width : 52px;
-	vertical-align : middle;
-}
-
-#navigation-links a .link-label { display : block; margin-top : 5px;}
-
-#navigation-links a .text { display : none; }
-
-#navigation-links a:hover, 
-#navigation-links a:focus 
-#navigation-links a:active { border-right : 0px;}
-
-/* properties for each of the navigation-links  */
-#navigation-links a#overview img { background-image : url(graphics/icons/etool/overview48.gif); }
-#navigation-links a#overview:hover img,
-#navigation-links a#overview:focus img,
-#navigation-links a#overview:active img { background-image : url(graphics/icons/ctool/overview48.gif); }
-/*#navigation-links a#overview:active img { background-image : url(graphics/icons/ctool/overview48sel.gif); }*/
-
-#navigation-links a#tutorials img { background-image : url(graphics/icons/etool/tutorials48.gif); }
-#navigation-links a#tutorials:hover img,
-#navigation-links a#tutorials:active img,
-#navigation-links a#tutorials:focus img { background-image : url(graphics/icons/ctool/tutorials48.gif); }
-/*#navigation-links a#tutorials:active img { background-image : url(graphics/icons/ctool/tutorials48sel.gif); }*/
-
-#navigation-links a#samples img { background-image : url(graphics/icons/etool/samples48.gif); }
-#navigation-links a#samples:hover img,
-#navigation-links a#samples:active img,
-#navigation-links a#samples:focus img { background-image : url(graphics/icons/ctool/samples48.gif); }
-/*#navigation-links a#samples:active img { background-image : url(graphics/icons/ctool/samples48sel.gif); }*/
-
-#navigation-links a#news img { background-image : url(graphics/icons/etool/whatsnew48.gif); }
-#navigation-links a#news:hover img,
-#navigation-links a#news:focus img,
-#navigation-links a#news:active img { background-image : url(graphics/icons/ctool/whatsnew48.gif); }
-/*#navigation-links a#news:active img { background-image : url(graphics/icons/ctool/whatsnew48sel.gif); }*/
-
-#navigation-links a#workbench { position : absolute;  right : 0px; top : -35px; text-align : right;}
-#navigation-links a#workbench .text { display : none; }
-#navigation-links a#workbench img { background-image : url(graphics/icons/etool/wb48.gif); width : 53px; height : 53px;}
-#navigation-links a#workbench:hover img,
-#navigation-links a#workbench:focus img,
-#navigation-links a#workbench:active img { background-image : url(graphics/icons/ctool/wb48.gif); }
-
-/* 
- * Lay out the page title and description 
- */
-h1, p { margin-left : 10px; } /* required in mozilla so the page description is properly indented */
-
-/* position the page content so that the page title overlays the bottom
- * of the background image, but make sure the content is always on top 
- * (using z-index) */
-#page-content {
-	float : none;
-	clear : both;
-	text-align : center;
-	margin-top : 35px;
-}
-
-.page > #page-content { margin-top : 50px; }
-
-#page-content p { 
-	padding-bottom : 15px; 
-	text-align : left; 
-	float : none;
-	clear : both;
-}
-
-#page-content #content-header H4, .page-description {
-	text-align : left;
-	margin-right : 10px;
-	float : none;
-	clear : both;
-}
-
diff --git a/platform/org.eclipse.platform/css/standby_root.css b/platform/org.eclipse.platform/css/standby_root.css
deleted file mode 100644
index 661d2c4..0000000
--- a/platform/org.eclipse.platform/css/standby_root.css
+++ /dev/null
@@ -1,121 +0,0 @@
-/* 
- * Set up general font colours, sizes, etc.  Some of these will override
- * settings from the shared CSS 
- */
-.intro-header H1 {
-	font-size : 15pt;
-}
-
-#page-links a .link-label, #action-links a .link-label {
-	font-size : 10pt;
-	font-weight : 600;
-	color : #E5E5E5;
-}
-
-#page-links a p .text, #action-links a p .text {
-	font-size : 10pt;
-	font-weight : 500;
-	color : #E5E5E5;
-}
-
-/*
- * Set up the content for the standby page.
- */
-body {
-	min-width : 230px;
-	/* since IE doesn't support min-width, use expression */
-	width:expression(document.body.clientWidth < 230? "230px": "auto" );
-	background-image : url(graphics/rootpage/background.jpg);
-	background-repeat : no-repeat;
-	background-position : top left;
-	background-color : #7169D1;
-}
-
-.page { 
-	background-image : url(graphics/rootpage/brandmark.gif);
-	background-repeat : no-repeat;
-	background-position : bottom left;
-	min-width : 230px;
-	/* since IE doesn't support min-width, use expression */
-	width:expression(document.body.clientWidth < 230? "230px": "auto" );
- 	min-height : 610px;
-	height : 100%;
-	height : expression(document.body.clientHeight < 450? "450px": "100%" );
-}
-
-/* 
- * Set up the navigation bar.  It should be centered in the middle
- * of the page
- */
-
-#links-background { 
-	width : 100%; 
- 	margin-top : 10%; 
-	margin-bottom : auto;
-	text-align : center;
-}
-
-#page-links a {
-	display : block;
-	width : 220px;
-	text-align : left; 
-	margin-left : auto;
-	margin-right : auto;
-	margin-top : 0px;
-	vertical-align : top;
-}
-#page-links a span, #page-links a p {
-	display : block;
-	width : 160px;
-	margin : 0px;
-	padding : 0px;
-}
-
-#page-links a .link-label {
-	position : relative;
-	left : 60px;
-	top : -50px;
-}
-
-#page-links a p .text {
-	position : relative;
-	left : 60px;
-	top : -50px;
-
-}
-
-#page-links a img {
-	height : 52px;
-	width : 52px;
-	vertical-align : middle;
-}
-
-#page-links a:hover,
-#page-links a:focus,
-#page-links a:active  { border : 0px; }
-
-#page-links a:hover p,
-#page-links a:focus p,
-#page-links a:active p  { margin : 0px; padding : 0px; }
-
-/* properties for each of the page-links  */
-a#overview img { background-image : url(graphics/icons/etool/overview48.gif); }
-a#overview:hover img,
-a#overview:focus img,
-a#overview:active img { background-image : url(graphics/icons/ctool/overview48.gif); }
-
-a#tutorials img { background-image : url(graphics/icons/etool/tutorials48.gif); }
-a#tutorials:hover img,
-a#tutorials:focus img,
-a#tutorials:active img { background-image : url(graphics/icons/ctool/tutorials48.gif); }
-
-a#samples img { background-image : url(graphics/icons/etool/samples48.gif); }
-a#samples:hover img,
-a#samples:focus img,
-a#samples:active img { background-image : url(graphics/icons/ctool/samples48.gif); }
-
-a#news img { background-image : url(graphics/icons/etool/whatsnew48.gif); }
-a#news:hover img,
-a#news:focus img,
-a#news:active img { background-image : url(graphics/icons/ctool/whatsnew48.gif); }
-
diff --git a/platform/org.eclipse.platform/css/standby_swt.properties b/platform/org.eclipse.platform/css/standby_swt.properties
deleted file mode 100644
index 5a5f0ac..0000000
--- a/platform/org.eclipse.platform/css/standby_swt.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-standby.links-background.page-links.overview.link-icon = css/graphics/icons/etool/overview72.gif
-standby.links-background.page-links.tutorials.link-icon = css/graphics/icons/etool/tutorials72.gif
-standby.links-background.page-links.samples.link-icon= css/graphics/icons/etool/samples72.gif
-standby.links-background.page-links.news.link-icon = css/graphics/icons/etool/whatsnew72.gif
-
-
-standby.links-background.page-links.overview.hover-icon = css/graphics/icons/ctool/overview72.gif
-standby.links-background.page-links.tutorials.hover-icon = css/graphics/icons/ctool/tutorials72.gif
-standby.links-background.page-links.samples.hover-icon = css/graphics/icons/ctool/samples72.gif
-standby.links-background.page-links.news.hover-icon = css/graphics/icons/ctool/whatsnew72.gif
-
-
-standby.links-background.page-links.layout.vspacing = 30
-standby.layout.vspacing = 35
-standby.show-link-description = false
-standby.show-home-page-navigation = false
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/css/tutorials/swt.properties b/platform/org.eclipse.platform/css/tutorials/swt.properties
deleted file mode 100644
index c0ad472..0000000
--- a/platform/org.eclipse.platform/css/tutorials/swt.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-
-tutorials.page-content.layout.vspacing = 40
-
-tutorials.subtitle-id = tutorials/page-content/page-title
-tutorials.description-id = tutorials/page-content/page-description
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/css/tutorials/tutorials.css b/platform/org.eclipse.platform/css/tutorials/tutorials.css
deleted file mode 100644
index 053efe8..0000000
--- a/platform/org.eclipse.platform/css/tutorials/tutorials.css
+++ /dev/null
@@ -1,79 +0,0 @@
-body {
-	background-image : url(../graphics/contentpage/tutorials_wtr.jpg);
-}
-
-.page { min-height : 700px; }
-
-/* show the "selected" image for this page */
-#navigation-links a#tutorials img, #navigation-links a#tutorials:hover img { background-image : url(../graphics/icons/ctool/tutorials48sel.gif); }
-
-/* 
- * Set up the content of the tutorials page into two
- * columns that are centered in the page
- */
-
-
-/* a group of tutorial links */
-.tutorials-group {
-	/* To center in Moz (have to use text-align for IE) */
-	margin-left : auto;
-	margin-right : auto;
-	width : 750px;
-	margin-bottom : 30px;
-	float : none;
-	clear : both;
-	text-align : left;
-}
-
-.tutorials-link { 
-	width : 360px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 10px;
-	margin-bottom : -20px;
-	vertical-align : top;
-}
-
-.tutorials-group > .tutorials-link {
-	float : left;
-	height : 150px;
-	vertical-align : middle;
-}
-
-
-.tutorials-link img  {
-	height : 57px;
-	width : 57px;
-	vertical-align : middle;
-}
-
-.tutorials-group h4 {
-	float : none;
-	clear : both;
-}
-
-p #group-description {
-	padding-bottom : 10px;
-	float : none;
-	clear : both;
-}
-
-.tutorials-link .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-
-.tutorials-link p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-.tutorials-link:hover { border-right : 0px; }
diff --git a/platform/org.eclipse.platform/css/whatsnew/swt.properties b/platform/org.eclipse.platform/css/whatsnew/swt.properties
deleted file mode 100644
index be302da..0000000
--- a/platform/org.eclipse.platform/css/whatsnew/swt.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-
-news.page-content.news-links.layout.ncolumns = 2
-news.page-content.news-links.layout.vspacing = 30
-
-news.page-content.news-links.new-and-noteworthy.link-icon = css/graphics/icons/obj48/new_obj.gif
-news.page-content.news-links.migration.link-icon = css/graphics/icons/obj48/migrate_obj.gif
-news.page-content.news-links.updates.link-icon = css/graphics/icons/obj48/updates_obj.gif
-news.page-content.news-links.eclipse.link-icon = css/graphics/icons/obj48/community_obj.gif
-
-news.page-content.noteworthy-links.layout.ncolumns = 2
-news.page-content.noteworthy-links.layout.vspacing = 15 
-news.page-content.news-links.layout.vspacing = 15 
-news.page-content.layout.vspacing = 40 
-
-news.link-icon = css/graphics/icons/obj48/new_obj.gif
-
-news.subtitle-id = news/page-content/page-title
diff --git a/platform/org.eclipse.platform/css/whatsnew/whatsnew.css b/platform/org.eclipse.platform/css/whatsnew/whatsnew.css
deleted file mode 100644
index db426eb..0000000
--- a/platform/org.eclipse.platform/css/whatsnew/whatsnew.css
+++ /dev/null
@@ -1,129 +0,0 @@
-body {
-	background-image : url(../graphics/contentpage/whatsnew_wtr.jpg);
-}
-
-.page { min-height : 500px; }
-
-/* show the "selected" image for this page */
-#navigation-links a#news img, #navigation-links a#news:hover img { background-image : url(../graphics/icons/ctool/whatsnew48sel.gif); }
-
-/* 
- * Set up the content of the Whats New page to be displayed in 
- * two columns that are centered in the middle of the page.
- */
-
-#noteworthy-links {
-	text-align : left;
-	width : 760px;
-	/* To center in Moz (have to use text-align for IE) */	
-	margin: 0px auto;
-}
-
-#noteworthy-links a { 
-	width : 370px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 5px;
-	margin-bottom : -20px;
-	vertical-align : top;
-}
-
-#noteworthy-links > a { vertical-align : middle; }
-
-#noteworthy-links a img {
-	height : 57px;
-	width : 57px;
-	vertical-align : middle;
-}
-
-#noteworthy-links a .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-#noteworthy-links a p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-/* Special case for Mozilla, because the links are displayed
-   in 1 vertical column instead of 2 centered columns */
-#noteworthy-links > a { width : 700px; }
-#noteworthy-links a > .link-label { width : 700px; }
-#noteworthy-links a p > .text { width : 700px; }
-
-#noteworthy-links a:hover { border-right : 5px; }
-
-#noteworthy-links a img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
-#noteworthy-links a:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
-
-
-#news-links {
-	text-align : left;
-	width : 760px;
-	/* To center in Moz (have to use text-align for IE) */	
-	margin: 0px auto;
-}
-
-#news-links a { 
-	width : 370px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 5px;
-	margin-bottom : -20px;
-	vertical-align : top;
-}
-
-#news-links > a { vertical-align : middle; }
-
-#news-links a img {
-	height : 57px;
-	width : 57px;
-	vertical-align : middle;
-}
-
-#news-links a .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-#news-links a p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-/* Special case for Mozilla, because the links are displayed
-   in 1 vertical column instead of 2 centered columns */
-#news-links > a { 	width : 700px; }
-#news-links a > .link-label { width : 700px; }
-#news-links a p > .text { width : 700px; }
-
-#news-links a:hover { border-right : 5px; }
-
-a#new-and-noteworthy img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
-a#new-and-noteworthy:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
-
-a#migration img { background-image : url(../graphics/icons/obj48/migrate_obj.gif); }
-a#migration:hover img { background-image : url(../graphics/icons/obj48/migratehov_obj.gif); }
-
-a#updates img { background-image : url(../graphics/icons/obj48/updates_obj.gif); }
-a#updates:hover img { background-image : url(../graphics/icons/obj48/updateshov_obj.gif); }
-
-a#eclipse img { background-image : url(../graphics/icons/obj48/community_obj.gif); }
-a#eclipse:hover img { background-image : url(../graphics/icons/obj48/communityhov_obj.gif); }
-
-
diff --git a/platform/org.eclipse.platform/eclipse.gif b/platform/org.eclipse.platform/eclipse.gif
deleted file mode 100644
index 6ca37e0..0000000
--- a/platform/org.eclipse.platform/eclipse.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/eclipse32.gif b/platform/org.eclipse.platform/eclipse32.gif
deleted file mode 100644
index f71a8f6..0000000
--- a/platform/org.eclipse.platform/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/eclipse_lg.gif b/platform/org.eclipse.platform/eclipse_lg.gif
deleted file mode 100644
index 27c0838..0000000
--- a/platform/org.eclipse.platform/eclipse_lg.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/intro.gif b/platform/org.eclipse.platform/intro.gif
deleted file mode 100644
index eb7b90c..0000000
--- a/platform/org.eclipse.platform/intro.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/introContent.xml b/platform/org.eclipse.platform/introContent.xml
deleted file mode 100644
index 35bd732..0000000
--- a/platform/org.eclipse.platform/introContent.xml
+++ /dev/null
@@ -1,195 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<introContent>
-  <!-- 
-
--->
-  <page alt-style="css/root_swt.properties" style="css/root.css" id="root" style-id="page">
-    <title style-id="intro-header">Welcome to Eclipse 3.0</title>
-    <group id="links-background">
-      <group id="page-links">
-        <link label="Overview" url="http://org.eclipse.ui.intro/showPage?id=overview" id="overview" style-id="left">
-          <img id="overview_img" style-id="content-img" src="css/graphics/icons/etool/overview72.gif" alt="Overview"></img>
-          <text>Find out what Eclipse is all about</text>
-        </link>
-        <link label="Tutorials" url="http://org.eclipse.ui.intro/showPage?id=tutorials" id="tutorials" style-id="left">
-	      <img id="tutorials_img" style-id="content-img" src="css/graphics/icons/etool/tutorials72.gif" alt="Tutorials"></img>
-          <text>Let us guide you through Eclipse end-to-end tutorials</text>
-        </link>
-        <link label="Samples" url="http://org.eclipse.ui.intro/showPage?id=samples" id="samples" style-id="right">
-          <img id="samples_img" style-id="content-img" src="css/graphics/icons/etool/samples72.gif" alt="Samples"></img>
-          <text>Explore Eclipse development through code samples</text>
-        </link>
-        <link label="What&apos;s New" url="http://org.eclipse.ui.intro/showPage?id=news" id="news" style-id="right">
-          <img id="whatsnew_img" style-id="content-img" src="css/graphics/icons/etool/whatsnew72.gif" alt="What&apos;s New"></img>
-          <text>Find out what is new in this release</text>
-        </link>
-      </group>
-    </group>
-    <group id="action-links">
-      <link url="http://org.eclipse.ui.intro/close" label="Workbench" id="workbench">
-        <img id="workbench_img" style-id="content-img" src="css/graphics/icons/etool/wb48.gif" alt="Go to the workbench"></img>
-        <text>Go to the workbench</text>
-      </link>
-    </group>
-  </page>
-  <!-- 
-
--->
-  <page alt-style="css/standby_swt.properties" style="css/standby_root.css" id="standby" style-id="page">
-    <title style-id="intro-header">Welcome to Eclipse 3.0</title>
-    <group id="links-background">
-      <group id="page-links">
-        <link label="Overview" url="http://org.eclipse.ui.intro/showPage?id=overview&amp;standby=false" id="overview" style-id="left">
-          <text>Find out what Eclipse is all about</text>
-        </link>
-        <link label="Tutorials" url="http://org.eclipse.ui.intro/showPage?id=tutorials&amp;standby=false" id="tutorials" style-id="left">
-          <text>Let us guide you through Eclipse end-to-end tutorials</text>
-        </link>
-        <link label="Samples" url="http://org.eclipse.ui.intro/showPage?id=samples&amp;standby=false" id="samples" style-id="right">
-          <text>Explore Eclipse development through code samples</text>
-        </link>
-        <link label="What&apos;s New" url="http://org.eclipse.ui.intro/showPage?id=news&amp;standby=false" id="news" style-id="right">
-          <text>Find out what is new in this release</text>
-        </link>
-      </group>
-    </group>
-  </page>
-  <!--
-
--->
-  <page style="css/overview/overview.css" alt-style="css/overview/swt.properties" id="overview" style-id="page">
-    <title style-id="intro-header">Welcome to Eclipse 3.0</title>
-    <group id="background-image" filteredFrom="swt"/>
-    <group id="curve-image" filteredFrom="swt"/>
-    <group id="navigation-links" filteredFrom="swt">
-      <group id="page-links">
-        <link label="Overview" url="http://org.eclipse.ui.intro/showPage?id=overview" id="overview" style-id="left">
-          <text>Find out what Eclipse is all about</text>
-        </link>
-        <link label="Tutorials" url="http://org.eclipse.ui.intro/showPage?id=tutorials" id="tutorials" style-id="left">
-          <text>Let us guide you through Eclipse end-to-end tutorials</text>
-        </link>
-        <link label="Samples" url="http://org.eclipse.ui.intro/showPage?id=samples" id="samples" style-id="right">
-          <text>Explore Eclipse development through code samples</text>
-        </link>
-        <link label="What&apos;s New" url="http://org.eclipse.ui.intro/showPage?id=news" id="news" style-id="right">
-          <text>Find out what is new in this release</text>
-        </link>
-      </group>
-      <group id="action-links">
-      	<link url="http://org.eclipse.ui.intro/close" label="Workbench" id="workbench">
-        	<text>Go to the workbench</text>
-      	</link>
-      </group>
-    </group>
-    <!-- -->
-    <group id="page-content">
-      <group id="content-header" label="OVERVIEW" filteredFrom="swt"></group>
-      <text style-id="page-title" id="page-title" filteredFrom="html">OVERVIEW</text>
-      <text style-id="page-description" id="page-description">Eclipse is a kind of universal tool platform - an open extensible IDE for anything and nothing in particular. It provides a feature-rich development environment that allows the developer to efficiently create tools that integrate seamlessly into the Eclipse Platform.</text>
-      <group id="overview-links">
-	<anchor id="beginAnchor"/>
-        <link label="Workbench basics" url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.platform.doc.user/concepts/concepts-2.htm" id="basics">
-          <text>Learn about basic Eclipse workbench concepts</text>
-        </link>
-        <link label="Team support" url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.platform.doc.user/concepts/concepts-26.htm" id="team">
-          <text>Find out how to collaborate with other developers</text>
-        </link>
-        <anchor id="jdtAnchor"/>
-        <anchor id="pdeAnchor"/>
-	<anchor id="endAnchor"/>
-      </group>
-    </group>
-  </page>
-  <!-- 
-
--->
-  <page style="css/tutorials/tutorials.css" alt-style="css/tutorials/swt.properties" id="tutorials" style-id="page">
-    <title style-id="intro-header">Welcome to Eclipse 3.0</title>
-    <group id="background-image" filteredFrom="swt"/>
-    <group id="curve-image" filteredFrom="swt"/>
-    <include path="overview/navigation-links"/>
-    <group id="page-content">
-      <group id="content-header" label="TUTORIALS" filteredFrom="swt"></group>
-      <text style-id="page-title" id="page-title" filteredFrom="html">TUTORIALS</text>
-      <text style-id="page-description" id="page-description">Learn how to be productive using Eclipse by completing end-to-end tutorials that will guide you along the way.</text>
-      <anchor id="beginAnchor"/>
-      <anchor id="jdtAnchor"/>
-      <anchor id="pdeAnchor"/>
-      <anchor id="endAnchor"/>
-    </group>
-  </page>
-  <!-- 
-
--->
-  <page style="css/samples/samples.css" alt-style="css/samples/swt.properties" id="samples" style-id="page">
-    <title style-id="intro-header">Welcome to Eclipse 3.0</title>
-    <group id="background-image" filteredFrom="swt"/>
-    <group id="curve-image" filteredFrom="swt"/>
-    <include path="overview/navigation-links"/>
-    <group id="page-content">
-      <group id="content-header" label="SAMPLES" filteredFrom="swt"></group>
-      <text style-id="page-title" id="page-title" filteredFrom="html">SAMPLES</text>
-      <text style-id="page-description" id="page-description">Explore Eclipse by installing prefabricated samples (may require Internet connection).</text>
-      <anchor id="beginAnchor"/>
-      <group label="SWT" id="swt" style-id="samples-group">
-        <text style-id="group-description">Run SWT samples using either the standalone SWT launcher or as an integrated workbench view.</text>
-        <link label="Workbench views and standalone applications" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.pde.ui&amp;class=org.eclipse.pde.ui.internal.samples.ShowSampleAction&amp;id=org.eclipse.sdk.samples.swt.examples" id="swt-examples" style-id="sample-link">
-          <text>The SWT Example launcher will allow you to launch a collection of SWT examples.  Some of the examples can be run independent of the eclipse platform and others will be available as views inside the workbench.</text>
-        </link>
-        
-        <anchor id="swtGroupAnchor"/>
-      </group>
-      <group label="Workbench" id="workbench" style-id="samples-group">
-        <text style-id="group-description">The following samples demonstrate how to tightly integrate into the Eclipse workbench.</text>
-        <link label="Multi-page editor" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.pde.ui&amp;class=org.eclipse.pde.ui.internal.samples.ShowSampleAction&amp;id=org.eclipse.sdk.samples.multipageeditor" id="multi-page-editor" style-id="sample-link">
-          <text>Shows how to create an editor with multiple pages</text>
-        </link>
-        <link label="Property sheet and outline" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.pde.ui&amp;class=org.eclipse.pde.ui.internal.samples.ShowSampleAction&amp;id=org.eclipse.sdk.samples.propertysheet" id="property-sheet" style-id="sample-link">
-          <text>Demonstrates how to use property sheet and outline views</text>
-        </link>
-        <link label="Readme tool" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.pde.ui&amp;class=org.eclipse.pde.ui.internal.samples.ShowSampleAction&amp;id=org.eclipse.sdk.samples.readmetool" id="readmetool" style-id="sample-link">
-          <text>Shows how to create your own extension points</text>
-        </link>
-        <anchor id="jdtAnchor"/>
-        <anchor id="workbenchGroupAnchor"/>
-      </group>
-      <anchor id="endAnchor"/>
-    </group>
-  </page>
-  <!-- 
-
--->
-  <page style="css/whatsnew/whatsnew.css" alt-style="css/whatsnew/swt.properties" id="news" style-id="page">
-    <title style-id="intro-header">Welcome to Eclipse 3.0</title>
-    <group id="background-image" filteredFrom="swt"/>
-    <group id="curve-image" filteredFrom="swt"/>
-    <include path="overview/navigation-links"/>
-    <group id="page-content">
-      <group id="content-header" label="WHAT'S NEW" filteredFrom="swt"></group>
-      <text style-id="page-title" id="page-title" filteredFrom="html">WHAT'S NEW</text>
-      <anchor id="beginAnchor"/>
-      <group id="noteworthy-links" label="New and Noteworthy">
-        <link label="Eclipse Platform" url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.platform.doc.user/whatsNew/platform_whatsnew.html" id="platform-noteworthy" style-id="noteworthy-link">
-          <text>Find out about the major new features in this release</text>
-        </link>
-        <anchor id="jdtAnchor"/>
-        <anchor id="pdeAnchor"/>
-        <anchor id="generalAnchor"/>
-      </group>
-      <group id="news-links" label="General">
-        <link label="Migration from the previous release" url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.platform.doc.isv/porting/eclipse_3_0_porting_guide.html" id="migration">
-          <text>Learn what you need to do to make your old code work in Eclipse 3.0</text>
-        </link>
-        <link label="New Updates" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.ui.ide&amp;class=org.eclipse.ui.internal.ide.update.InstallWizardAction" id="updates">
-          <text>Get the latest updates from Eclipse.org</text>
-        </link>
-        <link label="Eclipse community" url="http://www.eclipse.org" id="eclipse">
-          <text>Join the community, read articles and news on Eclipse.org</text>
-        </link>
-	<anchor id="linksAnchor"/>
-      </group>
-      <anchor id="endAnchor"/>
-    </group>
-  </page>
-</introContent>
diff --git a/platform/org.eclipse.platform/plugin.properties b/platform/org.eclipse.platform/plugin.properties
deleted file mode 100644
index 0290c90..0000000
--- a/platform/org.eclipse.platform/plugin.properties
+++ /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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName=Eclipse Platform
-providerName=Eclipse.org
-
-productName=Eclipse Platform
-productBlurb=Eclipse Platform\n\
-\n\
-Version: 3.1.0\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2004.  All rights reserved.\n\
-Visit http://www.eclipse.org/platform\n\
-\n\
-This product includes software developed by the\n\
-Apache Software Foundation http://www.apache.org/
-
-cheatsheet.cvs.name= CVS Tasks
-cheatsheet.cvs.desc= Go through the main CVS tasks using the cheat sheet
-shortcut.overview.tooltip = Overview
-shortcut.tutorials.tooltip = Tutorials
-shortcut.samples.tooltip = Samples
-shortcut.whatsnew.tooltip = What's New
diff --git a/platform/org.eclipse.platform/plugin.xml b/platform/org.eclipse.platform/plugin.xml
deleted file mode 100644
index 1a398d4..0000000
--- a/platform/org.eclipse.platform/plugin.xml
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.platform"
-   name="%pluginName"
-   version="3.1.0"
-   provider-name="%providerName">
-
-   <runtime>
-      <library name="startup.jar"/>
-      <library name="platform.jar">
-         <export name="*"/>
-      </library>
-   </runtime>   
-   <requires>
-      <import plugin="org.eclipse.ui.intro" optional="true"/>
-      <import plugin="org.eclipse.ui.cheatsheets" optional="true"/>
-      <import plugin="org.eclipse.ui.forms" optional="true"/>
-      <import plugin="org.eclipse.ui" optional="true"/>
-   </requires>
-   
-   <extension id="ide" point="org.eclipse.core.runtime.products"> 
-      <product name="%productName" application="org.eclipse.ui.ide.workbench" description="%productBlurb"> 
-          <property name="windowImages" value="eclipse.gif,eclipse32.gif"/> 
-          <property name="aboutImage" value="eclipse_lg.gif"/> 
-          <property name="aboutText" value="%productBlurb"/> 
-          <property name="appName" value="Eclipse"/> 
-          <property name="preferenceCustomization" value="plugin_customization.ini"/> 
-      </product> 
-   </extension> 
-
-   <extension  
-         point="org.eclipse.ui.intro">
-      <intro
-            class="org.eclipse.ui.intro.config.CustomizableIntroPart"
-            id="org.eclipse.platform.intro"
-            icon="intro.gif">
-      </intro>
-      <introProductBinding
-            introId="org.eclipse.platform.intro"
-            productId="org.eclipse.platform.ide">
-      </introProductBinding>
-   </extension>
-   <extension   
-         id="intro"
-         point="org.eclipse.ui.intro.config">
-      <config
-            introId="org.eclipse.platform.intro"
-            id="org.eclipse.platform.introConfig"
-            content="$nl$/introContent.xml">
-         <presentation
-               home-page-id="root" standby-page-id="standby">
-            <implementation
-                  ws="win32"
-                  style="css/shared.css"
-                  kind="html"
-                  os="win32">
-            </implementation>
-            <implementation
-                  kind="swt">
-            </implementation>
-            <launchBar location="right">
-               <shortcut
-                     tooltip="%shortcut.overview.tooltip"
-                     icon="css/graphics/icons/etool/overview.gif"
-                     url="http://org.eclipse.ui.intro/showPage?id=overview"/>
-               <shortcut
-                     tooltip="%shortcut.tutorials.tooltip"
-                     icon="css/graphics/icons/etool/tutorials.gif"
-                     url="http://org.eclipse.ui.intro/showPage?id=tutorials"/>
-               <shortcut
-                     tooltip="%shortcut.samples.tooltip"
-                     icon="css/graphics/icons/etool/samples.gif"
-                     url="http://org.eclipse.ui.intro/showPage?id=samples"/>
-               <shortcut
-                     tooltip="%shortcut.whatsnew.tooltip"
-                     icon="css/graphics/icons/etool/whatsnew.gif"
-                     url="http://org.eclipse.ui.intro/showPage?id=news"/>                                             
-            </launchBar>
-         </presentation>
-      </config>
-   </extension>
-   <extension
-         point="org.eclipse.ui.cheatsheets.cheatSheetContent">
-      <cheatsheet
-            name="%cheatsheet.cvs.name"
-            contentFile="$nl$/cheatsheets/CVS_1.xml"
-            id="org.eclipse.platform.cvs_1">
-         <description>
-            %cheatsheet.cvs.desc
-         </description>
-      </cheatsheet>
-   </extension>
-   <!-- =====================================================  -->
-   <!-- Standby Content Part contributions                     -->
-   <!-- =====================================================  -->
-   <extension point="org.eclipse.ui.intro.configExtension">
-      <standbyContentPart
-            id="org.eclipse.platform.cheatsheet"
-            class="org.eclipse.platform.internal.CheatSheetStandbyContent"
-            pluginId="org.eclipse.platform"/>
-   </extension>
-
-</plugin>
diff --git a/platform/org.eclipse.platform/plugin_customization.ini b/platform/org.eclipse.platform/plugin_customization.ini
deleted file mode 100644
index f22863c..0000000
--- a/platform/org.eclipse.platform/plugin_customization.ini
+++ /dev/null
@@ -1,17 +0,0 @@
-# plugin_customization.ini 
-# sets default values for plug-in-specific preferences
-# keys are qualified by plug-in id
-# e.g., com.example.acmeplugin/myproperty=myvalue
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in plugin_customization.properties
-# This file does not need to be translated.
-
-# Property "org.eclipse.ui/defaultPerspectiveId" controls the 
-# perspective that the workbench opens initially
-org.eclipse.ui/defaultPerspectiveId=org.eclipse.ui.resourcePerspective
-
-# new-style tabs by default
-org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
-
-# put the perspective switcher on the top right
-org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight
diff --git a/platform/org.eclipse.platform/plugin_customization.properties b/platform/org.eclipse.platform/plugin_customization.properties
deleted file mode 100644
index dfdc241..0000000
--- a/platform/org.eclipse.platform/plugin_customization.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# plugin_customization.properties
-# contains externalized strings for plugin_customization.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
diff --git a/platform/org.eclipse.platform/splash.bmp b/platform/org.eclipse.platform/splash.bmp
deleted file mode 100644
index 8f98a73..0000000
--- a/platform/org.eclipse.platform/splash.bmp
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.platform/src-intro/org/eclipse/platform/internal/CheatSheetStandbyContent.java b/platform/org.eclipse.platform/src-intro/org/eclipse/platform/internal/CheatSheetStandbyContent.java
deleted file mode 100644
index bdfb019..0000000
--- a/platform/org.eclipse.platform/src-intro/org/eclipse/platform/internal/CheatSheetStandbyContent.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Common Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.platform.internal;
-
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.cheatsheets.*;
-import org.eclipse.ui.forms.widgets.*;
-import org.eclipse.ui.intro.*;
-import org.eclipse.ui.intro.config.*;
-
-public final class CheatSheetStandbyContent implements IStandbyContentPart {
-
-    private static String MEMENTO_CHEATSHEET_ID_ATT = "cheatsheetId"; //$NON-NLS-1$
-
-    private IIntroPart introPart;
-    private ICheatSheetViewer viewer;
-    private Composite container;
-    private String input;
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.intro.internal.parts.IStandbyContentPart#init(org.eclipse.ui.intro.IIntroPart)
-     */
-    public void init(IIntroPart introPart, IMemento memento) {
-        this.introPart = introPart;
-        // try to restore last state.
-        input = getCachedInput(memento);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.intro.internal.parts.IStandbyContentPart#createControl(org.eclipse.swt.widgets.Composite,
-     *      org.eclipse.ui.forms.widgets.FormToolkit)
-     */
-    public void createPartControl(Composite parent, FormToolkit toolkit) {
-        container = toolkit.createComposite(parent);
-        FillLayout layout = new FillLayout();
-        layout.marginWidth = layout.marginHeight = 0;
-        container.setLayout(layout);
-
-        viewer = CheatSheetViewerFactory.createCheatSheetView();
-        viewer.createPartControl(container);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.intro.internal.parts.IStandbyContentPart#getControl()
-     */
-    public Control getControl() {
-        return container;
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.intro.internal.parts.IStandbyContentPart#setInput(java.lang.Object)
-     */
-    public void setInput(Object input) {
-        // if the new input is null, use cacched input from momento.
-        if (input != null)
-            this.input = (String) input;
-        viewer.setInput(this.input);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.intro.internal.parts.IStandbyContentPart#setFocus()
-     */
-    public void setFocus() {
-        viewer.setFocus();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.intro.internal.parts.IStandbyContentPart#dispose()
-     */
-    public void dispose() {
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.intro.config.IStandbyContentPart#saveState(org.eclipse.ui.IMemento)
-     */
-    public void saveState(IMemento memento) {
-        String currentCheatSheetId = viewer.getCheatSheetID();
-        if (currentCheatSheetId != null)
-            memento.putString(MEMENTO_CHEATSHEET_ID_ATT, currentCheatSheetId);
-    }
-
-    /**
-     * Tries to create the last content part viewed, based on content part id..
-     * 
-     * @param memento
-     * @return
-     */
-    private String getCachedInput(IMemento memento) {
-        if (memento == null)
-            return null;
-        return memento.getString(MEMENTO_CHEATSHEET_ID_ATT);
-
-    }
-
-}
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/src/META-INF/MANIFEST.MF b/platform/org.eclipse.platform/src/META-INF/MANIFEST.MF
deleted file mode 100644
index 31877ee..0000000
--- a/platform/org.eclipse.platform/src/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: org.eclipse.core.launcher.Main
diff --git a/platform/org.eclipse.platform/src/org/eclipse/core/launcher/Main.java b/platform/org.eclipse.platform/src/org/eclipse/core/launcher/Main.java
deleted file mode 100644
index 7683b2f..0000000
--- a/platform/org.eclipse.platform/src/org/eclipse/core/launcher/Main.java
+++ /dev/null
@@ -1,1720 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.launcher;
-
-import java.io.*;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.*;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-/**
- * The launcher for Eclipse.
- */
-public class Main {
-	/**
-	 * Indicates whether this instance is running in debug mode.
-	 */
-	protected boolean debug = false;
-
-	/**
-	 * The location of the launcher to run.
-	 */
-	protected String bootLocation = null;
-
-	/**
-	 * The location of the install root
-	 */
-	protected URL installLocation = null;
-
-	/**
-	 * The location of the configuration information for this instance
-	 */
-	protected URL configurationLocation = null;
-
-	/**
-	 * The location of the configuration information in the install root
-	 */
-	protected String parentConfigurationLocation = null;
-
-	/**
-	 * The id of the bundle that will contain the framework to run.  Defaults to org.eclipse.osgi.
-	 */
-	protected String framework = OSGI;
-
-	/**
-	 * The extra development time class path entries.
-	 */
-	protected String devClassPath = null;
-
-	/**
-	 * Indicates whether this instance is running in development mode.
-	 */
-	protected boolean inDevelopmentMode = false;
-
-	private String exitData = null;
-	private String name = null; // The name to brand the launcher
-	private String launcher = null; // The full path to the launcher
-
-	private String vm = null;
-	private String[] vmargs = null;
-	private String[] commands = null;
-	private String[] extensionPaths = null;
-
-	// splash handling
-	private String showSplash = null;
-	private String endSplash = null;
-	private boolean initialize = false;
-	private Process showProcess = null;
-	private boolean splashDown = false;
-	private final Runnable endSplashHandler = new Runnable() {
-		public void run() {
-			takeDownSplash();
-		}
-	};
-
-	// command line args
-	private static final String FRAMEWORK = "-framework"; //$NON-NLS-1$
-	private static final String INSTALL = "-install"; //$NON-NLS-1$
-	private static final String INITIALIZE = "-initialize"; //$NON-NLS-1$
-	private static final String VM = "-vm"; //$NON-NLS-1$
-	private static final String VMARGS = "-vmargs"; //$NON-NLS-1$
-	private static final String DEBUG = "-debug"; //$NON-NLS-1$
-	private static final String DEV = "-dev"; //$NON-NLS-1$
-	private static final String CONFIGURATION = "-configuration"; //$NON-NLS-1$
-	private static final String EXITDATA = "-exitdata"; //$NON-NLS-1$
-	private static final String NOSPLASH = "-nosplash"; //$NON-NLS-1$
-	private static final String SHOWSPLASH = "-showsplash"; //$NON-NLS-1$
-	private static final String NAME = "-name"; //$NON-NLS-1$
-	private static final String LAUNCHER = "-launcher"; //$NON-NLS-1$
-
-	private static final String ENDSPLASH = "-endsplash"; //$NON-NLS-1$
-	private static final String SPLASH_IMAGE = "splash.bmp"; //$NON-NLS-1$
-
-	private static final String OSGI = "org.eclipse.osgi"; //$NON-NLS-1$
-	private static final String STARTER = "org.eclipse.core.runtime.adaptor.EclipseStarter"; //$NON-NLS-1$
-	private static final String PLATFORM_URL = "platform:/base/"; //$NON-NLS-1$
-	private static final String ECLIPSE_PROPERTIES = "eclipse.properties"; //$NON-NLS-1$
-	private static final String FILE_SCHEME = "file:"; //$NON-NLS-1$	
-
-	private static final String DEFAULT_JRE_REQUIRED = "1.4.1"; //$NON-NLS-1$
-	
-	// constants: configuration file location
-	private static final String CONFIG_DIR = "configuration/"; //$NON-NLS-1$
-	private static final String CONFIG_FILE = "config.ini"; //$NON-NLS-1$
-	private static final String CONFIG_FILE_TEMP_SUFFIX = ".tmp"; //$NON-NLS-1$
-	private static final String CONFIG_FILE_BAK_SUFFIX = ".bak"; //$NON-NLS-1$
-	private static final String ECLIPSE = "eclipse"; //$NON-NLS-1$
-	private static final String PRODUCT_SITE_MARKER = ".eclipseproduct"; //$NON-NLS-1$
-	private static final String PRODUCT_SITE_ID = "id"; //$NON-NLS-1$
-	private static final String PRODUCT_SITE_VERSION = "version"; //$NON-NLS-1$
-
-	// constants: System property keys and/or configuration file elements
-	private static final String PROP_USER_HOME = "user.home"; //$NON-NLS-1$
-	private static final String PROP_USER_DIR = "user.dir"; //$NON-NLS-1$
-	private static final String PROP_INSTALL_AREA = "osgi.install.area"; //$NON-NLS-1$
-	private static final String PROP_CONFIG_AREA = "osgi.configuration.area"; //$NON-NLS-1$
-	private static final String PROP_CONFIG_AREA_DEFAULT = "osgi.configuration.area.default"; //$NON-NLS-1$
-	private static final String PROP_BASE_CONFIG_AREA = "osgi.baseConfiguration.area"; //$NON-NLS-1$
-	private static final String PROP_SHARED_CONFIG_AREA = "osgi.sharedConfiguration.area"; //$NON-NLS-1$
-	private static final String PROP_CONFIG_CASCADED = "osgi.configuration.cascaded"; //$NON-NLS-1$
-	private static final String PROP_FRAMEWORK = "osgi.framework"; //$NON-NLS-1$
-	private static final String PROP_SPLASHPATH = "osgi.splashPath"; //$NON-NLS-1$
-	private static final String PROP_SPLASHLOCATION = "osgi.splashLocation"; //$NON-NLS-1$
-	private static final String PROP_CLASSPATH = "osgi.frameworkClassPath"; //$NON-NLS-1$
-	private static final String PROP_EXTENSIONS = "osgi.framework.extensions"; //$NON-NLS-1$
-	private static final String PROP_LOGFILE = "osgi.logfile"; //$NON-NLS-1$
-	private static final String PROP_REQUIRED_JAVA_VERSION = "osgi.requiredJavaVersion"; //$NON-NLS-1$
-	private static final String PROP_EOF = "eof"; //$NON-NLS-1$
-
-	private static final String PROP_EXITCODE = "eclipse.exitcode"; //$NON-NLS-1$
-	private static final String PROP_EXITDATA = "eclipse.exitdata"; //$NON-NLS-1$
-
-	private static final String PROP_VM = "eclipse.vm"; //$NON-NLS-1$
-	private static final String PROP_VMARGS = "eclipse.vmargs"; //$NON-NLS-1$
-	private static final String PROP_COMMANDS = "eclipse.commands"; //$NON-NLS-1$
-
-	// Data mode constants for user, configuration and data locations.
-	private static final String NONE = "@none"; //$NON-NLS-1$
-	private static final String NO_DEFAULT = "@noDefault"; //$NON-NLS-1$
-	private static final String USER_HOME = "@user.home"; //$NON-NLS-1$
-	private static final String USER_DIR = "@user.dir"; //$NON-NLS-1$
-
-	// log file handling
-	protected static final String SESSION = "!SESSION"; //$NON-NLS-1$
-	protected static final String ENTRY = "!ENTRY"; //$NON-NLS-1$
-	protected static final String MESSAGE = "!MESSAGE"; //$NON-NLS-1$
-	protected static final String STACK = "!STACK"; //$NON-NLS-1$
-	protected static final int ERROR = 4;
-	protected static final String PLUGIN_ID = "org.eclipse.core.launcher"; //$NON-NLS-1$
-	protected File logFile = null;
-	protected BufferedWriter log = null;
-	protected boolean newSession = true;
-	
-	/**
-	 * A structured form for a version identifier.
-	 * 
-	 * @see http://java.sun.com/j2se/versioning_naming.html for information on valid version strings
-	 */
-	static class Identifier {
-		private static final String DELIM = ". _-"; //$NON-NLS-1$
-		private int major, minor, service;
-		Identifier(int major, int minor, int service) {
-			super();
-			this.major = major;
-			this.minor = minor;
-			this.service = service;
-		}
-		/**
-		 * @throws NumberFormatException if cannot parse the major and minor version components
-		 */
-		Identifier(String versionString) {
-			super();
-			StringTokenizer tokenizer = new StringTokenizer(versionString, DELIM);
-
-			// major
-			if (tokenizer.hasMoreTokens())
-				major = Integer.parseInt(tokenizer.nextToken());
-
-			// minor
-			if (tokenizer.hasMoreTokens())
-				minor = Integer.parseInt(tokenizer.nextToken());
-
-			try {
-				// service
-				if (tokenizer.hasMoreTokens())
-					service = Integer.parseInt(tokenizer.nextToken());
-			} catch (NumberFormatException nfe) {
-				// ignore the service qualifier in that case and default to 0
-				// this will allow us to tolerate other non-conventional version numbers 
-			}
-		}
-		/**
-		 * Returns true if this id is considered to be greater than or equal to the given baseline.
-		 * e.g. 
-		 * 1.2.9 >= 1.3.1 -> false
-		 * 1.3.0 >= 1.3.1 -> false
-		 * 1.3.1 >= 1.3.1 -> true
-		 * 1.3.2 >= 1.3.1 -> true
-		 * 2.0.0 >= 1.3.1 -> true
-		 */
-		boolean isGreaterEqualTo(Identifier minimum) {
-			if (major < minimum.major)
-				return false;
-			if (major > minimum.major)
-				return true;
-			// major numbers are equivalent so check minor
-			if (minor < minimum.minor)
-				return false;
-			if (minor > minimum.minor)
-				return true;
-			// minor numbers are equivalent so check service
-			return service >= minimum.service;
-		}
-	}	
-
-	/**
-	 * Executes the launch.
-	 * 
-	 * @return the result of performing the launch
-	 * @param args command-line arguments
-	 * @exception Exception thrown if a problem occurs during the launch
-	 */
-	protected void basicRun(String[] args) throws Exception {
-		System.getProperties().setProperty("eclipse.startTime", Long.toString(System.currentTimeMillis())); //$NON-NLS-1$
-		commands = args;
-		String[] passThruArgs = processCommandLine(args);
-		setupVMProperties();
-		processConfiguration();
-		
-		//ensure minimum Java version
-		if (!checkVersion(System.getProperty("java.version"), System.getProperty(PROP_REQUIRED_JAVA_VERSION, DEFAULT_JRE_REQUIRED))) //$NON-NLS-1$
-			return;
-		
-		// need to ensure that getInstallLocation is called at least once to initialize the value.
-		// Do this AFTER processing the configuration to allow the configuration to set
-		// the install location.  
-		getInstallLocation();
-
-		// locate boot plugin (may return -dev mode variations)
-		URL[] bootPath = getBootPath(bootLocation);
-
-		// splash handling is done here, because the default case needs to know
-		// the location of the boot plugin we are going to use
-		handleSplash(bootPath);
-
-		// load the BootLoader and startup the platform
-		URLClassLoader loader = new StartupClassLoader(bootPath, null);
-		Class clazz = loader.loadClass(STARTER);
-		Method method = clazz.getDeclaredMethod("run", new Class[] {String[].class, Runnable.class}); //$NON-NLS-1$
-		try {
-			method.invoke(clazz, new Object[] {passThruArgs, endSplashHandler});
-		} catch (InvocationTargetException e) {
-			if (e.getTargetException() instanceof Error)
-				throw (Error) e.getTargetException();
-			else if (e.getTargetException() instanceof Exception)
-				throw (Exception) e.getTargetException();
-			else
-				//could be a subclass of Throwable!
-				throw e;
-		}
-	}
-
-	/**
-	 * Checks whether the given available version is greater or equal to the 
-	 * given required version.
-	 * <p>Will set PROP_EXITCODE/PROP_EXITDATA accordingly if check fails.</p>
-	 *   
-	 * @return a boolean indicating whether the checking passed 
-	 */
-	private boolean checkVersion(String availableVersion, String requiredVersion) {
-		if (requiredVersion == null || availableVersion == null)
-			return true;
-		try {
-			Identifier required = new Identifier(requiredVersion);
-			Identifier available = new Identifier(availableVersion);
-			boolean compatible = available.isGreaterEqualTo(required);
-			if (!compatible) {
-				// any non-zero value should do it - 14 used to be used for version incompatibility in Eclipse 2.1 
-				System.getProperties().put(PROP_EXITCODE, "14"); //$NON-NLS-1$
-				System.getProperties().put(PROP_EXITDATA, "Required Java version: "+ requiredVersion + ". Available: " + availableVersion + '.'); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			return compatible;
-		} catch (SecurityException e) {
-			// If the security manager won't allow us to get the system property, continue for
-			// now and let things fail later on their own if necessary.
-			return true;
-		} catch (NumberFormatException e) {
-			// If the version string was in a format that we don't understand, continue and
-			// let things fail later on their own if necessary.
-			return true;
-		}
-	}
-	
-	/**
-	 * Returns a string representation of the given URL String.  This converts
-	 * escaped sequences (%..) in the URL into the appropriate characters.
-	 * NOTE: due to class visibility there is a copy of this method
-	 *       in InternalBootLoader
-	 */
-	private String decode(String urlString) {
-		//try to use Java 1.4 method if available
-		try {
-			Class clazz = URLDecoder.class;
-			Method method = clazz.getDeclaredMethod("decode", new Class[] {String.class, String.class}); //$NON-NLS-1$
-			//first encode '+' characters, because URLDecoder incorrectly converts 
-			//them to spaces on certain class library implementations.
-			if (urlString.indexOf('+') >= 0) {
-				int len = urlString.length();
-				StringBuffer buf = new StringBuffer(len);
-				for (int i = 0; i < len; i++) {
-					char c = urlString.charAt(i);
-					if (c == '+')
-						buf.append("%2B"); //$NON-NLS-1$
-					else
-						buf.append(c);
-				}
-				urlString = buf.toString();
-			}
-			Object result = method.invoke(null, new Object[] {urlString, "UTF-8"}); //$NON-NLS-1$
-			if (result != null)
-				return (String) result;
-		} catch (Exception e) {
-			//JDK 1.4 method not found -- fall through and decode by hand
-		}
-		//decode URL by hand
-		boolean replaced = false;
-		byte[] encodedBytes = urlString.getBytes();
-		int encodedLength = encodedBytes.length;
-		byte[] decodedBytes = new byte[encodedLength];
-		int decodedLength = 0;
-		for (int i = 0; i < encodedLength; i++) {
-			byte b = encodedBytes[i];
-			if (b == '%') {
-				byte enc1 = encodedBytes[++i];
-				byte enc2 = encodedBytes[++i];
-				b = (byte) ((hexToByte(enc1) << 4) + hexToByte(enc2));
-				replaced = true;
-			}
-			decodedBytes[decodedLength++] = b;
-		}
-		if (!replaced)
-			return urlString;
-		try {
-			return new String(decodedBytes, 0, decodedLength, "UTF-8"); //$NON-NLS-1$
-		} catch (UnsupportedEncodingException e) {
-			//use default encoding
-			return new String(decodedBytes, 0, decodedLength);
-		}
-	}
-
-	/**
-	 * Returns the result of converting a list of comma-separated tokens into an array
-	 * 
-	 * @return the array of string tokens
-	 * @param prop the initial comma-separated string
-	 */
-	private 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()]);
-	}
-
-	/**
-	 * Returns the <code>URL</code>-based class path describing where the boot classes
-	 * are located when running in development mode.
-	 * 
-	 * @return the url-based class path
-	 * @param base the base location
-	 * @exception MalformedURLException if a problem occurs computing the class path
-	 */
-	private URL[] getDevPath(URL base) throws IOException {
-		ArrayList result = new ArrayList(5);
-		if (inDevelopmentMode)
-			addDevEntries(base, result); //$NON-NLS-1$
-		//The jars from the base always need to be added, even when running in dev mode (bug 46772)
-		addBaseJars(base, result);
-		return (URL[]) result.toArray(new URL[result.size()]);
-	}
-
-	private void readFrameworkExtensions(URL base, ArrayList result) throws IOException {
-		String[] extensions = getArrayFromList(System.getProperties().getProperty(PROP_EXTENSIONS));
-		String parent = new File(base.getFile()).getParent().toString();
-		ArrayList extensionResults = new ArrayList(extensions.length);
-		for (int i = 0; i < extensions.length; i++) {
-			//Search the extension relatively to the osgi plugin 
-			String path = searchFor(extensions[i], parent);
-			if (path == null) {
-				log("Could not find extension: " + extensions[i]); //$NON-NLS-1$
-				continue;
-			}
-			if (debug)
-				System.out.println("Loading extension: " + extensions[i]); //$NON-NLS-1$
-
-			URL extensionURL = null;
-			if (installLocation.getProtocol().equals("file")) { //$NON-NLS-1$
-				extensionResults.add(path);
-				extensionURL = new File(path).toURL();
-			} else
-				extensionURL = new URL(installLocation.getProtocol(), installLocation.getHost(), installLocation.getPort(), path);
-
-			//Load the eclipse.properties of the extension, merge its content, and in case of dev mode add the bin entries
-			Properties extensionProperties = loadProperties(new URL(extensionURL, ECLIPSE_PROPERTIES));
-			String extensionPath = extensionProperties.getProperty(PROP_CLASSPATH);
-			if (extensionPath != null) {
-				if (inDevelopmentMode) 
-					addDevEntries(extensionURL, result);
-				String[] entries = getArrayFromList(extensionPath);
-				String qualifiedPath = ""; //$NON-NLS-1$
-				for (int j = 0; j < entries.length; j++) 
-					qualifiedPath += ", file:" + path + entries[j]; //$NON-NLS-1$
-				extensionProperties.put(PROP_CLASSPATH, qualifiedPath);
-			}
-			mergeProperties(System.getProperties(), extensionProperties);
-		}
-		extensionPaths = (String[]) extensionResults.toArray(new String[extensionResults.size()]);
-	}
-
-	private void addBaseJars(URL base, ArrayList result) throws IOException {
-		String baseJarList = System.getProperty(PROP_CLASSPATH);
-		if (baseJarList == null) {
-			URL url = new URL(base, ECLIPSE_PROPERTIES);
-			if (debug)
-				System.out.println("Loading framework classpath from:\n    " + url.toExternalForm()); //$NON-NLS-1$
-			mergeProperties(System.getProperties(), loadProperties(url));
-			readFrameworkExtensions(base, result);
-			baseJarList = System.getProperties().getProperty(PROP_CLASSPATH);
-			if (baseJarList == null)
-				throw new IOException("Unable to initialize " + PROP_CLASSPATH); //$NON-NLS-1$
-		}
-		String[] baseJars = getArrayFromList(baseJarList);
-		for (int i = 0; i < baseJars.length; i++) {
-			String string = baseJars[i];
-			try {
-				// if the string is a file: URL then *carefully* construct the URL.  Otherwise
-				// just try to build a URL. In either case, if we fail, use string as something to tack
-				// on the end of the base.
-				URL url = null;
-				if (string.startsWith("file:")) //$NON-NLS-1$
-					url = new File(string.substring(5)).toURL();
-				else
-					url = new URL(string);
-				addEntry(url, result);
-			} catch (MalformedURLException e) {
-				addEntry(new URL(base, string), result);
-			}
-		}
-	}
-
-	private void addEntry(URL url, List result) {
-		if (new File(url.getFile()).exists())
-			result.add(url);
-	}
-
-	private void addDevEntries(URL base, List result) throws MalformedURLException {
-		String[] locations = getArrayFromList(devClassPath);
-		for (int i = 0; i < locations.length; i++) {
-			String location = locations[i];
-			File path = new File(location);
-			URL url;
-			if (path.isAbsolute())
-				url = path.toURL();
-			else {
-				// dev path is relative, combine with base location
-				char lastChar = location.charAt(location.length() - 1);
-				if ((location.endsWith(".jar") || (lastChar == '/' || lastChar == '\\'))) //$NON-NLS-1$
-					url = new URL(base, location);
-				else
-					url = new URL(base, location + "/"); //$NON-NLS-1$
-			}
-			addEntry(url, result);
-		}
-	}
-
-	/**
-	 * Returns the <code>URL</code>-based class path describing where the boot classes are located.
-	 * 
-	 * @return the url-based class path
-	 * @param base the base location
-	 * @exception MalformedURLException if a problem occurs computing the class path
-	 */
-	private URL[] getBootPath(String base) throws IOException {
-		URL url = null;
-		if (base != null) {
-			url = buildURL(base, true);
-		} else {
-			// search in the root location
-			url = getInstallLocation();
-			String path = new File(url.getFile(), "plugins").toString(); //$NON-NLS-1$
-			path = searchFor(framework, path);
-			if (path == null)
-				throw new RuntimeException("Could not find framework"); //$NON-NLS-1$
-			if (url.getProtocol().equals("file")) //$NON-NLS-1$
-				url = new File(path).toURL();
-			else
-				url = new URL(url.getProtocol(), url.getHost(), url.getPort(), path);
-		}
-		if (System.getProperty(PROP_FRAMEWORK) == null)
-			System.getProperties().put(PROP_FRAMEWORK, url.toExternalForm());
-		if (debug)
-			System.out.println("Framework located:\n    " + url.toExternalForm()); //$NON-NLS-1$
-		// add on any dev path elements
-		URL[] result = getDevPath(url);
-		if (debug) {
-			System.out.println("Framework classpath:"); //$NON-NLS-1$
-			for (int i = 0; i < result.length; i++)
-				System.out.println("    " + result[i].toExternalForm()); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	/**
-	 * Searches for the given target directory starting in the "plugins" subdirectory
-	 * of the given location.  If one is found then this location is returned; 
-	 * otherwise an exception is thrown.
-	 * 
-	 * @return the location where target directory was found
-	 * @param start the location to begin searching
-	 */
-	private String searchFor(final String target, String start) {
-		FileFilter filter = new FileFilter() {
-			public boolean accept(File candidate) {
-				return candidate.isDirectory() && (candidate.getName().equals(target) || candidate.getName().startsWith(target + "_")); //$NON-NLS-1$
-			}
-		};
-		File[] candidates = new File(start).listFiles(filter); //$NON-NLS-1$
-		if (candidates == null)
-			return null;
-		String result = null;
-		Object maxVersion = null;
-		for (int i = 0; i < candidates.length; i++) {
-			String name = candidates[i].getName();
-			String version = ""; //$NON-NLS-1$ // Note: directory with version suffix is always > than directory without version suffix
-			int index = name.indexOf('_');
-			if (index != -1)
-				version = name.substring(index + 1);
-			Object currentVersion = getVersionElements(version);
-			if (maxVersion == null) {
-				result = candidates[i].getAbsolutePath();
-				maxVersion = currentVersion;
-			} else {
-				if (compareVersion((Object[]) maxVersion, (Object[]) currentVersion) < 0) {
-					result = candidates[i].getAbsolutePath();
-					maxVersion = currentVersion;
-				}
-			}
-		}
-		if (result == null)
-			return null;
-		return result.replace(File.separatorChar, '/') + "/"; //$NON-NLS-1$
-	}
-
-	/**
-	 * Compares version strings. 
-	 * @return result of comparison, as integer;
-	 * <code><0</code> if left < right;
-	 * <code>0</code> if left == right;
-	 * <code>>0</code> if left > right;
-	 */
-	private int compareVersion(Object[] left, Object[] right) {
-
-		int result = ((Integer) left[0]).compareTo((Integer) right[0]); // compare major
-		if (result != 0)
-			return result;
-
-		result = ((Integer) left[1]).compareTo((Integer) right[1]); // compare minor
-		if (result != 0)
-			return result;
-
-		result = ((Integer) left[2]).compareTo((Integer) right[2]); // compare service
-		if (result != 0)
-			return result;
-
-		return ((String) left[3]).compareTo((String) right[3]); // compare qualifier
-	}
-
-	/**
-	 * Do a quick parse of version identifier so its elements can be correctly compared.
-	 * If we are unable to parse the full version, remaining elements are initialized
-	 * with suitable defaults.
-	 * @return an array of size 4; first three elements are of type Integer (representing
-	 * major, minor and service) and the fourth element is of type String (representing
-	 * qualifier). Note, that returning anything else will cause exceptions in the caller.
-	 */
-	private Object[] getVersionElements(String version) {
-		Object[] result = {new Integer(0), new Integer(0), new Integer(0), ""}; //$NON-NLS-1$
-		StringTokenizer t = new StringTokenizer(version, "."); //$NON-NLS-1$
-		String token;
-		int i = 0;
-		while (t.hasMoreTokens() && i < 4) {
-			token = t.nextToken();
-			if (i < 3) {
-				// major, minor or service ... numeric values
-				try {
-					result[i++] = new Integer(token);
-				} catch (Exception e) {
-					// invalid number format - use default numbers (0) for the rest
-					break;
-				}
-			} else {
-				// qualifier ... string value
-				result[i++] = token;
-			}
-		}
-		return result;
-	}
-
-	private static URL buildURL(String spec, boolean trailingSlash) {
-		if (spec == null)
-			return null;
-		boolean isFile = spec.startsWith("file:"); //$NON-NLS-1$
-		try {
-			if (isFile)
-				return adjustTrailingSlash(new File(spec.substring(5)).toURL(), trailingSlash);
-			else
-				return new URL(spec);
-		} catch (MalformedURLException e) {
-			// if we failed and it is a file spec, there is nothing more we can do
-			// otherwise, try to make the spec into a file URL.
-			if (isFile)
-				return null;
-			try {
-				return adjustTrailingSlash(new File(spec).toURL(), trailingSlash);
-			} catch (MalformedURLException e1) {
-				return null;
-			}
-		}
-	}
-
-	private static URL adjustTrailingSlash(URL url, boolean trailingSlash) throws MalformedURLException {
-		String file = url.getFile();
-		if (trailingSlash == (file.endsWith("/"))) //$NON-NLS-1$
-			return url;
-		file = trailingSlash ? file + "/" : file.substring(0, file.length() - 1); //$NON-NLS-1$
-		return new URL(url.getProtocol(), url.getHost(), file);
-	}
-
-	private URL buildLocation(String property, URL defaultLocation, String userDefaultAppendage) {
-		URL result = null;
-		String location = System.getProperty(property);
-		System.getProperties().remove(property);
-		// if the instance location is not set, predict where the workspace will be and 
-		// put the instance area inside the workspace meta area.
-		try {
-			if (location == null)
-				result = defaultLocation;
-			else if (location.equalsIgnoreCase(NONE))
-				return null;
-			else if (location.equalsIgnoreCase(NO_DEFAULT))
-				result = buildURL(location, true);
-			else {
-				if (location.startsWith(USER_HOME)) {
-					String base = substituteVar(location, USER_HOME, PROP_USER_HOME);
-					location = new File(base, userDefaultAppendage).getAbsolutePath();
-				} else if (location.startsWith(USER_DIR)) {
-					String base = substituteVar(location, USER_DIR, PROP_USER_DIR);
-					location = new File(base, userDefaultAppendage).getAbsolutePath();
-				}
-				result = buildURL(location, true);
-			}
-		} finally {
-			if (result != null)
-				System.getProperties().put(property, result.toExternalForm());
-		}
-		return result;
-	}
-
-	private String substituteVar(String source, String var, String prop) {
-		String value = System.getProperty(prop, "");
-		return value + source.substring(var.length());
-	}
-
-	/** 
-	 * Retuns the default file system path for the configuration location.
-	 * By default the configuration information is in the installation directory
-	 * if this is writeable.  Otherwise it is located somewhere in the user.home
-	 * area relative to the current product. 
-	 * @return the default file system path for the configuration information
-	 */
-	private String computeDefaultConfigurationLocation() {
-		// 1) We store the config state relative to the 'eclipse' directory if possible
-		// 2) If this directory is read-only 
-		//    we store the state in <user.home>/.eclipse/<application-id>_<version> where <user.home> 
-		//    is unique for each local user, and <application-id> is the one 
-		//    defined in .eclipseproduct marker file. If .eclipseproduct does not
-		//    exist, use "eclipse" as the application-id.
-
-		URL install = getInstallLocation();
-		// TODO a little dangerous here.  Basically we have to assume that it is a file URL.
-		if (install.getProtocol().equals("file")) { //$NON-NLS-1$
-			File installDir = new File(install.getFile());
-			if (canWrite(installDir))
-				return installDir.getAbsolutePath() + File.separator + CONFIG_DIR;
-		}
-		// We can't write in the eclipse install dir so try for some place in the user's home dir
-		return computeDefaultUserAreaLocation(CONFIG_DIR);
-	}
-
-	private static boolean canWrite(File installDir) {
-		if (installDir.canWrite() == false)
-			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;
-	}
-	
-	/**
-	 * Returns a files system path for an area in the user.home region related to the
-	 * current product.  The given appendage is added to this base location
-	 * @param pathAppendage the path segments to add to computed base
-	 * @return a file system location in the user.home area related the the current
-	 *   product and the given appendage
-	 */
-	private String computeDefaultUserAreaLocation(String pathAppendage) {
-		//    we store the state in <user.home>/.eclipse/<application-id>_<version> where <user.home> 
-		//    is unique for each local user, and <application-id> is the one 
-		//    defined in .eclipseproduct marker file. If .eclipseproduct does not
-		//    exist, use "eclipse" as the application-id.
-		URL installURL = getInstallLocation();
-		if (installURL == null)
-			return null;
-		File installDir = new File(installURL.getFile());
-		String appName = "." + ECLIPSE; //$NON-NLS-1$
-		File eclipseProduct = new File(installDir, PRODUCT_SITE_MARKER);
-		if (eclipseProduct.exists()) {
-			Properties props = new Properties();
-			try {
-				props.load(new FileInputStream(eclipseProduct));
-				String appId = props.getProperty(PRODUCT_SITE_ID);
-				if (appId == null || appId.trim().length() == 0)
-					appId = ECLIPSE;
-				String appVersion = props.getProperty(PRODUCT_SITE_VERSION);
-				if (appVersion == null || appVersion.trim().length() == 0)
-					appVersion = ""; //$NON-NLS-1$
-				appName += File.separator + appId + "_" + appVersion; //$NON-NLS-1$
-			} catch (IOException e) {
-				// Do nothing if we get an exception.  We will default to a standard location 
-				// in the user's home dir.
-			}
-		}
-		String userHome = System.getProperty(PROP_USER_HOME);
-		return new File(userHome, appName + "/" + pathAppendage).getAbsolutePath(); //$NON-NLS-1$
-	}
-
-	/**
-	 * Runs this launcher with the arguments specified in the given string.
-	 * 
-	 * @param argString the arguments string
-	 */
-	public static void main(String argString) {
-		Vector list = new Vector(5);
-		for (StringTokenizer tokens = new StringTokenizer(argString, " "); tokens.hasMoreElements();) //$NON-NLS-1$
-			list.addElement(tokens.nextElement());
-		main((String[]) list.toArray(new String[list.size()]));
-	}
-
-	/**
-	 * Runs the platform with the given arguments.  The arguments must identify
-	 * an application to run (e.g., <code>-application com.example.application</code>).
-	 * After running the application <code>System.exit(N)</code> is executed.
-	 * The value of N is derived from the value returned from running the application.
-	 * If the application's return value is an <code>Integer</code>, N is this value.
-	 * In all other cases, N = 0.
-	 * <p>
-	 * Clients wishing to run the platform without a following <code>System.exit</code>
-	 * call should use <code>run()</code>.
-	 * </p>
-	 * 
-	 * @param args the command line arguments
-	 * @see #run(String[])
-	 */
-	public static void main(String[] args) {
-		int result = new Main().run(args);
-		System.exit(result);
-	}
-
-	/**
-	 * Runs the platform with the given arguments.  The arguments must identify
-	 * an application to run (e.g., <code>-application com.example.application</code>).
-	 * Returns the value returned from running the application.
-	 * If the application's return value is an <code>Integer</code>, N is this value.
-	 * In all other cases, N = 0.
-	 *
-	 * @param args the command line arguments
-	 */
-	public int run(String[] args) {
-		int result = 0;
-		try {
-			basicRun(args);
-			String exitCode = System.getProperty(PROP_EXITCODE);
-			try {
-				result = exitCode == null ? 0 : Integer.parseInt(exitCode);
-			} catch (NumberFormatException e) {
-				result = 17;
-			}
-		} catch (Throwable e) {
-			// only log the exceptions if they have not been caught by the 
-			// EclipseStarter (i.e., if the exitCode is not 13) 
-			if (!"13".equals(System.getProperty(PROP_EXITCODE))) { //$NON-NLS-1$
-				log("Exception launching the Eclipse Platform:"); //$NON-NLS-1$
-				log(e);
-				String message = "An error has occurred"; //$NON-NLS-1$
-				if (logFile == null)
-					message += " and could not be logged: \n" + e.getMessage(); //$NON-NLS-1$
-				else
-					message += ".  See the log file\n" + logFile.getAbsolutePath(); //$NON-NLS-1$
-				System.getProperties().put(PROP_EXITDATA, message);
-			}
-			// Return "unlucky" 13 as the exit code. The executable will recognize
-			// this constant and display a message to the user telling them that
-			// there is information in their log file.
-			result = 13;
-		} finally {
-			// always try putting down the splash screen just in case the application failed to do so
-			takeDownSplash();			
-		}
-		// Return an int exit code and ensure the system property is set.
-		System.getProperties().put(PROP_EXITCODE, Integer.toString(result));
-		setExitData();
-		return result;
-	}
-
-	private void setExitData() {
-		String data = System.getProperty(PROP_EXITDATA);
-		if (exitData == null || data == null)
-			return;
-		// sync call to the launcher
-		runCommand(true, new String[] {EXITDATA, exitData, data}); //$NON-NLS-1$
-	}
-
-	/**
-	 * Processes the command line arguments.  The general principle is to NOT
-	 * consume the arguments and leave them to be processed by Eclipse proper.
-	 * There are a few args which are directed towards main() and a few others
-	 * which we need to know about. Very few should actually be consumed here.
-	 * 
-	 * @return the arguments to pass through to the launched application
-	 * @param args the command line arguments
-	 */
-	protected String[] processCommandLine(String[] args) {
-		if (args.length == 0)
-			return args;
-		int[] configArgs = new int[args.length];
-		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)
-			// check if debug should be enabled for the entire platform
-			if (args[i].equalsIgnoreCase(DEBUG)) {
-				debug = true;
-				// passed thru this arg (i.e., do not set found = true)
-				continue;
-			}
-
-			// look for and consume the nosplash directive.  This supercedes any
-			// -showsplash command that might be present.
-			if (args[i].equalsIgnoreCase(NOSPLASH)) {
-				splashDown = true;
-				found = true;
-			}
-
-			// check if this is initialization pass
-			if (args[i].equalsIgnoreCase(INITIALIZE)) {
-				initialize = true;
-				// passed thru this arg (i.e., do not set found = true)
-				continue;
-			}
-
-			// check if development mode should be enabled for the entire platform
-			// If this is the last arg or there is a following arg (i.e., arg+1 has a leading -), 
-			// simply enable development mode.  Otherwise, assume that that the following arg is
-			// actually some additional development time class path entries.  This will be processed below.
-			if (args[i].equalsIgnoreCase(DEV) && ((i + 1 == args.length) || ((i + 1 < args.length) && (args[i + 1].startsWith("-"))))) { //$NON-NLS-1$
-				inDevelopmentMode = true;
-				// do not mark the arg as found so it will be passed through
-				continue;
-			}
-
-			// done checking for args.  Remember where an arg was found 
-			if (found) {
-				configArgs[configArgIndex++] = i;
-				continue;
-			}
-
-			// look for the VM args arg.  We have to do that before looking to see
-			// if the next element is a -arg as the thing following -vmargs may in
-			// fact be another -arg.
-			if (args[i].equalsIgnoreCase(VMARGS)) {
-				// consume the -vmargs arg itself
-				args[i] = null;
-				i++;
-				vmargs = new String[args.length - i];
-				for (int j = 0; i < args.length; i++) {
-					vmargs[j++] = args[i];
-					args[i] = null;
-				}
-				continue;
-			}
-
-			// check for args with parameters. If we are at the last argument or if the next one
-			// has a '-' as the first character, then we can't have an arg with a parm so continue.
-			if (i == args.length - 1 || args[i + 1].startsWith("-")) //$NON-NLS-1$
-				continue;
-			String arg = args[++i];
-
-			// look for the development mode and class path entries.  
-			if (args[i - 1].equalsIgnoreCase(DEV)) {
-				inDevelopmentMode = true;
-				devClassPath = processDevArg(arg);
-				continue;
-			}
-
-			// look for the framework to run
-			if (args[i - 1].equalsIgnoreCase(FRAMEWORK)) {
-				framework = arg;
-				found = true;
-			}
-
-			// look for explicitly set install root
-			// Consume the arg here to ensure that the launcher and Eclipse get the 
-			// same value as each other.  
-			if (args[i - 1].equalsIgnoreCase(INSTALL)) {
-				System.getProperties().put(PROP_INSTALL_AREA, arg);
-				found = true;
-			}
-
-			// look for the configuration to use.  
-			// Consume the arg here to ensure that the launcher and Eclipse get the 
-			// same value as each other.  
-			if (args[i - 1].equalsIgnoreCase(CONFIGURATION)) {
-				System.getProperties().put(PROP_CONFIG_AREA, arg);
-				found = true;
-			}
-
-			// look for the command to use to set exit data in the launcher
-			if (args[i - 1].equalsIgnoreCase(EXITDATA)) {
-				exitData = arg;
-				found = true;
-			}
-
-			// look for the command to use to show the splash screen
-			if (args[i - 1].equalsIgnoreCase(SHOWSPLASH)) {
-				showSplash = arg;
-				found = true;
-			}
-
-			// look for the name to use by the launcher
-			if (args[i - 1].equalsIgnoreCase(NAME)) {
-				name = arg;
-				found = true;
-			}
-
-			// look for the launcher location
-			if (args[i - 1].equalsIgnoreCase(LAUNCHER)) {
-				launcher = arg;
-				found = true;
-			}
-			
-			// look for the command to use to end the splash screen
-			if (args[i - 1].equalsIgnoreCase(ENDSPLASH)) {
-				endSplash = arg;
-				found = true;
-			}
-
-			// look for the VM location arg
-			if (args[i - 1].equalsIgnoreCase(VM)) {
-				vm = arg;
-				found = true;
-			}
-
-			// 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
-		String[] passThruArgs = new String[args.length - configArgIndex - (vmargs == null ? 0 : vmargs.length + 1)];
-		configArgIndex = 0;
-		int j = 0;
-		for (int i = 0; i < args.length; i++) {
-			if (i == configArgs[configArgIndex])
-				configArgIndex++;
-			else if (args[i] != null)
-				passThruArgs[j++] = args[i];
-		}
-		return passThruArgs;
-	}
-
-	private String processDevArg(String arg) {
-		if (arg == null)
-			return null;
-		try {
-			URL location = new URL(arg);
-			Properties props = load(location, null);
-			String result = props.getProperty(OSGI);
-			return result == null ? props.getProperty("*") : result; //$NON-NLS-1$
-		} catch (MalformedURLException e) {
-			// the arg was not a URL so use it as is.
-			return arg;
-		} catch (IOException e) {
-			// TODO consider logging here
-			return null;
-		}
-	}
-
-	private URL getConfigurationLocation() {
-		if (configurationLocation != null)
-			return configurationLocation;
-		configurationLocation = buildLocation(PROP_CONFIG_AREA, null, ""); //$NON-NLS-1$
-		if (configurationLocation == null) {
-			configurationLocation = buildLocation(PROP_CONFIG_AREA_DEFAULT, null, ""); //$NON-NLS-1$
-			if (configurationLocation == null)
-				configurationLocation = buildURL(computeDefaultConfigurationLocation(), true);
-		}
-		if (configurationLocation != null)
-			System.getProperties().put(PROP_CONFIG_AREA, configurationLocation.toExternalForm());
-		if (debug)
-			System.out.println("Configuration location:\n    " + configurationLocation); //$NON-NLS-1$
-		return configurationLocation;
-	}
-
-	private void processConfiguration() {
-		// if the configuration area is not already defined, discover the config area by
-		// trying to find a base config area.  This is either defined in a system property or
-		// is computed relative to the install location.
-		// Note that the config info read here is only used to determine a value 
-		// for the user configuration area
-		URL baseConfigurationLocation = null;
-		Properties baseConfiguration = null;
-		if (System.getProperty(PROP_CONFIG_AREA) == null) {
-			String baseLocation = System.getProperty(PROP_BASE_CONFIG_AREA);
-			if (baseLocation != null)
-				// here the base config cannot have any symbolic (e..g, @xxx) entries.  It must just
-				// point to the config file.
-				baseConfigurationLocation = buildURL(baseLocation, true);
-			if (baseConfigurationLocation == null)
-				try {
-					// here we access the install location but this is very early.  This case will only happen if
-					// the config area is not set and the base config area is not set (or is bogus).
-					// In this case we compute based on the install location.
-					baseConfigurationLocation = new URL(getInstallLocation(), CONFIG_DIR);
-				} catch (MalformedURLException e) {
-					// leave baseConfigurationLocation null
-				}
-			baseConfiguration = loadConfiguration(baseConfigurationLocation);
-			if (baseConfiguration != null) {
-				// if the base sets the install area then use that value if the property.  We know the 
-				// property is not already set.
-				String location = baseConfiguration.getProperty(PROP_CONFIG_AREA);
-				if (location != null)
-					System.getProperties().put(PROP_CONFIG_AREA, location);
-				// if the base sets the install area then use that value if the property is not already set.
-				// This helps in selfhosting cases where you cannot easily compute the install location
-				// from the code base.
-				location = baseConfiguration.getProperty(PROP_INSTALL_AREA);
-				if (location != null && System.getProperty(PROP_INSTALL_AREA) == null)
-					System.getProperties().put(PROP_INSTALL_AREA, location);
-			}
-		}
-
-		// Now we know where the base configuration is supposed to be.  Go ahead and load
-		// it and merge into the System properties.  Then, if cascaded, read the parent configuration
-		// Note that the parent may or may not be the same parent as we read above since the 
-		// base can define its parent.  The first parent we read was either defined by the user
-		// on the command line or was the one in the install dir.  
-		// if the config or parent we are about to read is the same as the base config we read above,
-		// just reuse the base
-		Properties configuration = baseConfiguration;
-		if (configuration == null || !getConfigurationLocation().equals(baseConfigurationLocation.toExternalForm()))
-			configuration = loadConfiguration(getConfigurationLocation());
-		mergeProperties(System.getProperties(), configuration);
-		if ("false".equalsIgnoreCase(System.getProperty(PROP_CONFIG_CASCADED))) //$NON-NLS-1$
-			// if we are not cascaded then remove the parent property even if it was set.
-			System.getProperties().remove(PROP_SHARED_CONFIG_AREA);
-		else {
-			URL sharedConfigURL = buildLocation(PROP_SHARED_CONFIG_AREA, null, "");
-			if (sharedConfigURL == null)
-				try {
-					// there is no shared config value so compute one
-					sharedConfigURL = new URL(getInstallLocation(), CONFIG_DIR);
-				} catch (MalformedURLException e) {
-					// leave sharedConfigurationLocation null
-				}
-			// if the parent location is different from the config location, read it too.
-			if (sharedConfigURL != null) {
-				if (sharedConfigURL.equals(getConfigurationLocation()))
-					// remove the property to show that we do not have a parent.
-					System.getProperties().remove(PROP_SHARED_CONFIG_AREA);
-				else {
-					// if the parent we are about to read is the same as the base config we read above,
-					// just reuse the base
-					configuration = baseConfiguration;
-					if (!sharedConfigURL.equals(baseConfigurationLocation))
-						configuration = loadConfiguration(sharedConfigURL);
-					mergeProperties(System.getProperties(), configuration);
-					System.getProperties().put(PROP_SHARED_CONFIG_AREA, sharedConfigURL.toExternalForm());
-					if (debug)
-						System.out.println("Shared configuration location:\n    " + sharedConfigURL.toExternalForm()); //$NON-NLS-1$
-				}
-			}
-		}
-		// setup the path to the framework
-		String urlString = System.getProperty(PROP_FRAMEWORK, null);
-		if (urlString != null) {
-			URL url = buildURL(urlString, true);
-			System.getProperties().put(PROP_FRAMEWORK, url.toExternalForm());
-			bootLocation = resolve(urlString);
-		}
-	}
-
-	/**
-	 * Returns url of the location this class was loaded from
-	 */
-	private URL getInstallLocation() {
-		if (installLocation != null)
-			return installLocation;
-
-		// value is not set so compute the default and set the value
-		String installArea = System.getProperty(PROP_INSTALL_AREA);
-		if (installArea != null) {
-			installLocation = buildURL(installArea, true);
-			if (installLocation == null)
-				throw new IllegalStateException("Install location is invalid: " + installArea); //$NON-NLS-1$
-			System.getProperties().put(PROP_INSTALL_AREA, installLocation.toExternalForm());
-			if (debug)
-				System.out.println("Install location:\n    " + installLocation); //$NON-NLS-1$
-			return installLocation;
-		}
-
-		URL result = Main.class.getProtectionDomain().getCodeSource().getLocation();
-		String path = decode(result.getFile());
-		// normalize to not have leading / so we can check the form
-		File file = new File(path);
-		path = file.toString().replace('\\', '/');
-		// TODO need a better test for windows
-		// If on Windows then canonicalize the drive letter to be lowercase.
-		// remember that there may be UNC paths 
-		if (File.separatorChar == '\\')
-			if (Character.isUpperCase(path.charAt(0))) {
-				char[] chars = path.toCharArray();
-				chars[0] = Character.toLowerCase(chars[0]);
-				path = new String(chars);
-			}
-		if (path.endsWith(".jar")) //$NON-NLS-1$
-			path = path.substring(0, path.lastIndexOf("/") + 1); //$NON-NLS-1$
-		try {
-			try {
-				// create a file URL (via File) to normalize the form (e.g., put 
-				// the leading / on if necessary)
-				path = new File(path).toURL().getFile();
-			} catch (MalformedURLException e1) {
-				// will never happen.  The path is straight from a URL.  
-			}
-			installLocation = new URL(result.getProtocol(), result.getHost(), result.getPort(), path);
-			System.getProperties().put(PROP_INSTALL_AREA, installLocation.toExternalForm());
-		} catch (MalformedURLException e) {
-			// TODO Very unlikely case.  log here.  
-		}
-		if (debug)
-			System.out.println("Install location:\n    " + installLocation); //$NON-NLS-1$
-		return installLocation;
-	}
-
-	/*
-	 * Load the given configuration file
-	 */
-	private Properties loadConfiguration(URL url) {
-		Properties result = null;
-		try {
-			url = new URL(url, CONFIG_FILE);
-		} catch (MalformedURLException e) {
-			return null;
-		}
-		try {
-			if (debug)
-				System.out.print("Configuration file:\n    " + url.toString()); //$NON-NLS-1$
-			result = loadProperties(url);
-			if (debug)
-				System.out.println(" loaded"); //$NON-NLS-1$
-		} catch (IOException e) {
-			if (debug)
-				System.out.println(" not found or not read"); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	private Properties loadProperties(URL url) throws IOException {
-		// try to load saved configuration file (watch for failed prior save())
-		if (url == null)
-			return null;
-		Properties result = null;
-		IOException originalException = null;
-		try {
-			result = load(url, null); // try to load config file
-		} catch (IOException e1) {
-			originalException = e1;
-			try {
-				result = load(url, CONFIG_FILE_TEMP_SUFFIX); // check for failures on save
-			} catch (IOException e2) {
-				try {
-					result = load(url, CONFIG_FILE_BAK_SUFFIX); // check for failures on save
-				} catch (IOException e3) {
-					throw originalException; // we tried, but no config here ...
-				}
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * Load the configuration  
-	 */
-	private Properties load(URL url, String suffix) throws IOException {
-		// figure out what we will be loading
-		if (suffix != null && !suffix.equals("")) //$NON-NLS-1$
-			url = new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile() + suffix);
-
-		// try to load saved configuration file
-		Properties props = new Properties();
-		InputStream is = null;
-		try {
-			is = url.openStream();
-			props.load(is);
-		} finally {
-			if (is != null)
-				try {
-					is.close();
-				} catch (IOException e) {
-					//ignore failure to close
-				}
-		}
-		return props;
-	}
-
-	/*
-	 * Handle splash screen.
-	 * We support 2 startup scenarios:
-	 * 
-	 * (1) the executable launcher put up the splash screen. In that
-	 *     scenario we are invoked with -endsplash command which is
-	 *     fully formed to take down the splash screen
-	 * 
-	 * (2) the executable launcher did not put up the splash screen,
-	 *     but invokes Eclipse with partially formed -showsplash command.
-	 *     In this scenario we determine which splash to display (based on 
-	 *     feature information) and then call -showsplash command. 
-	 * 
-	 * In both scenarios we pass a handler (Runnable) to the platform.
-	 * The handler is called as a result of the launched application calling
-	 * Platform.endSplash(). In the first scenario this results in the
-	 * -endsplash command being executed. In the second scenarios this
-	 * results in the process created as a result of the -showsplash command
-	 * being destroyed.
-	 * 
-	 * @param bootPath search path for the boot plugin
-	 */
-	private void handleSplash(URL[] defaultPath) {
-		// run without splash if we are initializing or nosplash 
-		// was specified (splashdown = true)
-		if (initialize || splashDown) {
-			showSplash = null;
-			endSplash = null;
-			return;
-		}
-
-		// if -endsplash is specified, use it and ignore any -showsplash command
-		if (endSplash != null) {
-			showSplash = null;
-			return;
-		}
-
-		// check if we are running without a splash screen
-		if (showSplash == null)
-			return;
-
-		// determine the splash location
-		String location = getSplashLocation(defaultPath);
-		if (debug)
-			System.out.println("Splash location:\n    " + location); //$NON-NLS-1$
-		if (location == null)
-			return;
-		// async call to the launcher
-		showProcess = runCommand(false, new String[] {SHOWSPLASH, showSplash, location}); //$NON-NLS-1$
-	}
-	
-	private Process runCommand(boolean block, String[] extraArgs) {
-		final int NBR_DEFAULT_ARGS = 3;
-		String[] args = new String[NBR_DEFAULT_ARGS + extraArgs.length];
-		args[0] = launcher;
-		args[1] = NAME;
-		args[2] = name;
-
-		for (int i = 0; i < extraArgs.length; i++) {
-			args[i + NBR_DEFAULT_ARGS] = extraArgs[i];
-		}
-
-		if (debug) {
-			System.out.print("runCommand:\n    ");//$NON-NLS-1$ 
-			for (int i = 0; i < args.length; i++) {
-				System.out.print('<' + args[i] + '>');//$NON-NLS-1$ //$NON-NLS-2$ 
-			}
-			System.out.println();
-		}
-
-		Process result = null;
-		try {
-			result = Runtime.getRuntime().exec(args);
-			if (block)
-				result.waitFor();
-		} catch (Exception e) {
-			log("Exception running command: " + extraArgs != null && extraArgs.length > 0 ? extraArgs[0] : null); //$NON-NLS-1$ 
-			log(e);
-		}
-		return result;
-	}
-
-	/*
-	 * take down the splash screen. Try both take-down methods just in case
-	 * (only one should ever be set)
-	 */
-	protected void takeDownSplash() {
-		if (splashDown) // splash is already down
-			return;
-
-		// check if -endsplash was specified
-		if (endSplash != null) {
-			try {
-				Runtime.getRuntime().exec(endSplash);
-			} catch (Exception e) {
-				//ignore failure to end splash
-			}
-		}
-
-		// check if -showsplash was specified and executed
-		if (showProcess != null) {
-			showProcess.destroy();
-			showProcess = null;
-		}
-		splashDown = true;
-	}
-
-	/*
-	 * Return path of the splash image to use.  First search the defined splash path.
-	 * If that does not work, look for a default splash.  Currently the splash must be in the file system
-	 * so the return value here is the file system path.
-	 */
-	private String getSplashLocation(URL[] bootPath) {
-		String result = System.getProperty(PROP_SPLASHLOCATION);
-		if (result != null)
-			return result;
-		String splashPath = System.getProperty(PROP_SPLASHPATH);
-		if (splashPath != null) {
-			String[] entries = getArrayFromList(splashPath);
-			ArrayList path = new ArrayList(entries.length);
-			for (int i = 0; i < entries.length; i++) {
-				String entry = resolve(entries[i]);
-				if (entry == null || entry.startsWith(FILE_SCHEME)) {
-					File entryFile = new File(entry.substring(5).replace('/', File.separatorChar));
-					entry = searchFor(entryFile.getName(), entryFile.getParent());
-					if (entry != null)
-						path.add(entry);
-				} else
-					log("Invalid splash path entry: " + entries[i]); //$NON-NLS-1$
-			}
-			// see if we can get a splash given the splash path
-			result = searchForSplash((String[]) path.toArray(new String[path.size()]));
-			if (result != null) {
-				System.getProperties().put(PROP_SPLASHLOCATION, result);
-				return result;
-			}
-		}
-
-		// can't find it on the splashPath so look for a default splash
-		String temp = bootPath[0].getFile(); // take the first path element
-		temp = temp.replace('/', File.separatorChar);
-		int ix = temp.lastIndexOf("plugins" + File.separator); //$NON-NLS-1$
-		if (ix != -1) {
-			int pix = temp.indexOf(File.separator, ix + 8);
-			if (pix != -1) {
-				temp = temp.substring(0, pix);
-				result = searchForSplash(new String[] {temp});
-				if (result != null)
-					System.getProperties().put(PROP_SPLASHLOCATION, result);
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * Do a locale-sensitive lookup of splash image
-	 */
-	private String searchForSplash(String[] searchPath) {
-		if (searchPath == null)
-			return null;
-
-		// get current locale information
-		String localePath = Locale.getDefault().toString().replace('_', File.separatorChar);
-
-		// search the specified path
-		while (localePath != null) {
-			String suffix;
-			if (localePath.equals("")) { //$NON-NLS-1$
-				// look for nl'ed splash image
-				suffix = SPLASH_IMAGE;
-			} else {
-				// look for default splash image
-				suffix = "nl" + File.separator + localePath + File.separator + SPLASH_IMAGE; //$NON-NLS-1$
-			}
-
-			// check for file in searchPath
-			for (int i = 0; i < searchPath.length; i++) {
-				String path = searchPath[i];
-				if (!path.endsWith(File.separator))
-					path += File.separator;
-				path += suffix;
-				File result = new File(path);
-				if (result.exists())
-					return result.getAbsolutePath(); // return the first match found [20063]
-			}
-
-			// try the next variant
-			if (localePath.equals("")) //$NON-NLS-1$
-				localePath = null;
-			else {
-				int ix = localePath.lastIndexOf(File.separator);
-				if (ix == -1)
-					localePath = ""; //$NON-NLS-1$
-				else
-					localePath = localePath.substring(0, ix);
-			}
-		}
-
-		// sorry, could not find splash image
-		return null;
-	}
-
-	/*
-	 * resolve platform:/base/ URLs
-	 */
-	private String resolve(String urlString) {
-		// handle the case where people mistakenly spec a refererence: url.
-		if (urlString.startsWith("reference:")) { //$NON-NLS-1$
-			urlString = urlString.substring(10);
-			System.getProperties().put(PROP_FRAMEWORK, urlString);
-		}
-		if (urlString.startsWith(PLATFORM_URL)) {
-			String path = urlString.substring(PLATFORM_URL.length());
-			return getInstallLocation() + path;
-		} else
-			return urlString;
-	}
-
-	/*
-	 * Entry point for logging.
-	 */
-	private synchronized void log(Object obj) {
-		if (obj == null)
-			return;
-		try {
-			openLogFile();
-			try {
-				if (newSession) {
-					log.write(SESSION);
-					log.write(' ');
-					String timestamp = new Date().toString();
-					log.write(timestamp);
-					log.write(' ');
-					for (int i = SESSION.length() + timestamp.length(); i < 78; i++)
-						log.write('-');
-					log.newLine();
-					newSession = false;
-				}
-				write(obj);
-			} finally {
-				if (logFile == null) {
-					if (log != null)
-						log.flush();
-				} else
-					closeLogFile();
-			}
-		} catch (Exception e) {
-			System.err.println("An exception occurred while writing to the platform log:"); //$NON-NLS-1$
-			e.printStackTrace(System.err);
-			System.err.println("Logging to the console instead."); //$NON-NLS-1$
-			//we failed to write, so dump log entry to console instead
-			try {
-				log = logForStream(System.err);
-				write(obj);
-				log.flush();
-			} catch (Exception e2) {
-				System.err.println("An exception occurred while logging to the console:"); //$NON-NLS-1$
-				e2.printStackTrace(System.err);
-			}
-		} finally {
-			log = null;
-		}
-	}
-
-	/*
-	 * This should only be called from #log()
-	 */
-	private void write(Object obj) throws IOException {
-		if (obj == null)
-			return;
-		if (obj instanceof Throwable) {
-			log.write(STACK);
-			log.newLine();
-			((Throwable) obj).printStackTrace(new PrintWriter(log));
-		} else {
-			log.write(ENTRY);
-			log.write(' ');
-			log.write(PLUGIN_ID);
-			log.write(' ');
-			log.write(String.valueOf(ERROR));
-			log.write(' ');
-			log.write(String.valueOf(0));
-			log.write(' ');
-			try {
-				DateFormat formatter = new SimpleDateFormat("MMM dd, yyyy kk:mm:ss.SS"); //$NON-NLS-1$
-				log.write(formatter.format(new Date()));
-			} catch (Exception e) {
-				// continue if we can't write out the date
-				log.write(Long.toString(System.currentTimeMillis()));
-			}
-			log.newLine();
-			log.write(MESSAGE);
-			log.write(' ');
-			log.write(String.valueOf(obj));
-		}
-		log.newLine();
-	}
-
-	private void computeLogFileLocation() {
-		String logFileProp = System.getProperty(PROP_LOGFILE);
-		if (logFileProp != null) {
-			if (logFile == null || !logFileProp.equals(logFile.getAbsolutePath())) {
-				logFile = new File(logFileProp);
-				logFile.getParentFile().mkdirs();
-			}
-			return;
-		}
-
-		// compute the base location and then append the name of the log file
-		URL base = buildURL(System.getProperty(PROP_CONFIG_AREA), false);
-		if (base == null)
-			return;
-		logFile = new File(base.getPath(), Long.toString(System.currentTimeMillis()) + ".log"); //$NON-NLS-1$
-		logFile.getParentFile().mkdirs();
-		System.setProperty(PROP_LOGFILE, logFile.getAbsolutePath());
-	}
-
-	/**
-	 * Converts an ASCII character representing a hexadecimal
-	 * value into its integer equivalent.
-	 */
-	private int hexToByte(byte b) {
-		switch (b) {
-			case '0' :
-				return 0;
-			case '1' :
-				return 1;
-			case '2' :
-				return 2;
-			case '3' :
-				return 3;
-			case '4' :
-				return 4;
-			case '5' :
-				return 5;
-			case '6' :
-				return 6;
-			case '7' :
-				return 7;
-			case '8' :
-				return 8;
-			case '9' :
-				return 9;
-			case 'A' :
-			case 'a' :
-				return 10;
-			case 'B' :
-			case 'b' :
-				return 11;
-			case 'C' :
-			case 'c' :
-				return 12;
-			case 'D' :
-			case 'd' :
-				return 13;
-			case 'E' :
-			case 'e' :
-				return 14;
-			case 'F' :
-			case 'f' :
-				return 15;
-			default :
-				throw new IllegalArgumentException("Switch error decoding URL"); //$NON-NLS-1$
-		}
-	}
-
-	private void openLogFile() throws IOException {
-		computeLogFileLocation();
-		try {
-			log = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logFile.getAbsolutePath(), true), "UTF-8")); //$NON-NLS-1$
-		} catch (IOException e) {
-			logFile = null;
-			throw e;
-		}
-	}
-
-	private BufferedWriter logForStream(OutputStream output) {
-		try {
-			return new BufferedWriter(new OutputStreamWriter(output, "UTF-8")); //$NON-NLS-1$
-		} catch (UnsupportedEncodingException e) {
-			return new BufferedWriter(new OutputStreamWriter(output));
-		}
-	}
-
-	private void closeLogFile() throws IOException {
-		try {
-			if (log != null) {
-				log.flush();
-				log.close();
-			}
-		} finally {
-			log = null;
-		}
-	}
-
-	private void mergeProperties(Properties destination, Properties source) {
-		if (destination == null || source == null)
-			return;
-		for (Enumeration e = source.keys(); e.hasMoreElements();) {
-			String key = (String) e.nextElement();
-			if (key.equals(PROP_CLASSPATH)) {
-				String destinationClasspath = destination.getProperty(PROP_CLASSPATH);
-				String sourceClasspath = source.getProperty(PROP_CLASSPATH);
-				if (destinationClasspath == null)
-					destinationClasspath = sourceClasspath;
-				else
-					destinationClasspath = destinationClasspath + sourceClasspath;
-				destination.put(PROP_CLASSPATH, destinationClasspath);
-				continue;
-			}
-			if (!key.equals(PROP_EOF)) {
-				String value = source.getProperty(key);
-				if (destination.getProperty(key) == null)
-					destination.put(key, value);
-			}
-		}
-	}
-
-	private void setupVMProperties() {
-		if (vm != null)
-			System.getProperties().put(PROP_VM, vm);
-		setMultiValueProperty(PROP_VMARGS, vmargs);
-		setMultiValueProperty(PROP_COMMANDS, commands);
-	}
-
-	private void setMultiValueProperty(String property, String[] value) {
-		if (value != null) {
-			StringBuffer result = new StringBuffer(300);
-			for (int i = 0; i < value.length; i++) {
-				if (value[i] != null) {
-					result.append(value[i]);
-					result.append('\n');
-				}
-			}
-			System.getProperties().put(property, result.toString());
-		}
-	}
-
-	private class StartupClassLoader extends URLClassLoader {
-		public StartupClassLoader(URL[] urls, ClassLoader parent) {
-			super(urls, parent);
-		}
-
-		protected String findLibrary(String name) {
-			if (extensionPaths ==  null)
-				return super.findLibrary(name);
-			String libName = System.mapLibraryName(name);
-			for (int i = 0; i < extensionPaths.length; i++) {
-				File libFile = new File(extensionPaths[i], libName);
-				if (libFile.isFile())
-					return libFile.getAbsolutePath();
-			}
-			return super.findLibrary(name);
-		}		
-	}
-}
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/src/org/eclipse/core/launcher/package.html b/platform/org.eclipse.platform/src/org/eclipse/core/launcher/package.html
deleted file mode 100644
index ca2e7ce..0000000
--- a/platform/org.eclipse.platform/src/org/eclipse/core/launcher/package.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Launches the Eclipse Platform.
-<h2>
-Package Specification</h2>
-
-This package is the main entry point to the Eclipse Platform.  To start the platform invoke the Main
-class in this package.
-<br>&nbsp;
-</body>
-</html>
diff --git a/platform/org.eclipse.platform/welcome.xml b/platform/org.eclipse.platform/welcome.xml
deleted file mode 100644
index 26eb707..0000000
--- a/platform/org.eclipse.platform/welcome.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?> 
-<welcomePage 
-	title="Eclipse Platform"
-	format="nowrap">
-	<intro>This page will help familiarize you with the Eclipse Workbench.
-To get started, read the sections below and click on the related links. </intro>
-
-<item><b>Installed Features </b>
-To find out more about the features installed in your workbench, choose <action pluginId="org.eclipse.ui.ide"  class="org.eclipse.ui.actions.QuickStartAction">Help > Welcome...</action>
-and select the feature you are interested in.</item>
-
-<item><b>Perspectives, views and editors </b>
-A window contains one or more perspectives. A perspective consists of views (e.g. Navigator) 
-and editors for working with your resources.
-
-The shortcut bar at the far left of the window allows you to open new perspectives and move
-between perspectives that are already open. The perspective you are currently working with 
-is shown in the title of the window and in the shortcut bar as a pushed-in icon.</item>
-
-<item><b>Configuring your perspectives</b>
-You can move views and editors around the workbench by dragging their titlebars. You can
-also add more views to your current perspective by using Window > Show View. 
-To reset the perspective to its original state, choose <action pluginId="org.eclipse.ui"  class="org.eclipse.ui.internal.ResetPerspectiveAction">Window > Reset Perspective</action>. 
-
-Once you have arranged your perspective, you can save it using Window > Save Perspective As.... 
-You can customize the views, perspectives and New menu operations that show up for 
-your perspective. To do this choose <action pluginId="org.eclipse.ui"  class="org.eclipse.ui.internal.EditActionSetsAction">Window > Customize Perspective...</action> .  A view can
-additionally be converted into a Fast View by dragging it to the shortcut bar (at the 
-far left of the window). </item> 
-
-<item><b>Join a CVS team</b>
-To join a CVS development team, open the <action pluginId="org.eclipse.team.cvs.ui" class="org.eclipse.team.internal.ccvs.ui.actions.ShowCVSPerspectiveAction">CVS Repository Exploring perspective</action>. Next, specify
-the location of your CVS repository. To do this, choose <action pluginId="org.eclipse.team.cvs.ui" class="org.eclipse.team.internal.ccvs.ui.repo.NewCVSRepositoryAction">New > Repository Location...</action> from the
-CVS Repositories view popup menu. When the location wizard opens, fill in the details of your
-CVS repository and click Finish. 
-
-A repository location will appear in the CVS Repositories view. Expand the location, then expand
-the HEAD branch. You will see a list of the modules in that repository. Select a module and choose 
-<b>Checkout as Project</b> from the context menu. This will checkout the module from the CVS 
-repository and create a project by that name in your workspace.</item>
-
-<item><b>Running an Ant Buildfile</b>
-To run an Ant buildfile, click on Run > External Tools > External Tools.... Select Ant Build as the launch
-configuration type and click New. Identify the buildfile in the Location field and then click Run.</item>
-
-<item><b>Learn more </b>
-To learn more you can browse the <topic id="/org.eclipse.platform.doc.user/toc.xml">Workbench User Guide</topic>. Browse the <topic href="/org.eclipse.platform.doc.user/reference/ref-anticons.htm">External Tools and Ant Icons</topic>
-section to recognize the various External Tools and Ant elements. </item>
-
-
-</welcomePage>
\ No newline at end of file
diff --git a/platform/org.eclipse.sdk/.project b/platform/org.eclipse.sdk/.project
deleted file mode 100644
index 2e498c2..0000000
--- a/platform/org.eclipse.sdk/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.sdk</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/platform/org.eclipse.sdk/about.html b/platform/org.eclipse.sdk/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/platform/org.eclipse.sdk/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/platform/org.eclipse.sdk/about.ini b/platform/org.eclipse.sdk/about.ini
deleted file mode 100644
index eaaa6fb..0000000
--- a/platform/org.eclipse.sdk/about.ini
+++ /dev/null
@@ -1,31 +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)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/platform/org.eclipse.sdk/about.mappings b/platform/org.eclipse.sdk/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/platform/org.eclipse.sdk/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/platform/org.eclipse.sdk/about.properties b/platform/org.eclipse.sdk/about.properties
deleted file mode 100644
index c0038e5..0000000
--- a/platform/org.eclipse.sdk/about.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-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 Project SDK\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2004.  All rights reserved.\n\
-Visit http://www.eclipse.org/eclipse
-
diff --git a/platform/org.eclipse.sdk/build.properties b/platform/org.eclipse.sdk/build.properties
deleted file mode 100644
index b0c1058..0000000
--- a/platform/org.eclipse.sdk/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes=\
-about.html,\
-about.ini,\
-about.mappings,\
-about.properties,\
-eclipse32.gif,\
-plugin.xml,\
-plugin.properties
diff --git a/platform/org.eclipse.sdk/eclipse32.gif b/platform/org.eclipse.sdk/eclipse32.gif
deleted file mode 100644
index f71a8f6..0000000
--- a/platform/org.eclipse.sdk/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.sdk/plugin.properties b/platform/org.eclipse.sdk/plugin.properties
deleted file mode 100644
index d301725..0000000
--- a/platform/org.eclipse.sdk/plugin.properties
+++ /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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName=Eclipse Project SDK
-providerName=Eclipse.org
-
-activity.java=Java Development
-activity.java.desc=Develop Java applications.
-activity.plugin=Plug-in Development
-activity.plugin.desc=Develop plug-ins, fragments, and features for Eclipse.
-
-activity.team.cvs=CVS Support
-activity.team.cvs.desc=Use the Concurrent Versions System (CVS) to manage resources.
-activity.team=Core Team Support
-activity.team.desc=Share projects using configuration management systems.
-
-activity.cat.development=Development
-activity.cat.development.desc=Use the Eclipse SDK to develop applications.
-activity.cat.team=Team
-activity.cat.team.desc=Use configuration management systems to manage resources.
-
-
-
-
diff --git a/platform/org.eclipse.sdk/plugin.xml b/platform/org.eclipse.sdk/plugin.xml
deleted file mode 100644
index f448a6a..0000000
--- a/platform/org.eclipse.sdk/plugin.xml
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.sdk"
-   name="%pluginName"
-   version="3.1.0"
-   provider-name="%providerName">
-
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-
-
-   <extension
-         point="org.eclipse.ui.activities">
-  
-      <activity
-            name="%activity.java"
-            description="%activity.java.desc"
-            id="org.eclipse.javaDevelopment">
-      </activity>
-      
-      <activity
-            name="%activity.plugin"
-            description="%activity.plugin.desc"
-            id="org.eclipse.plugInDevelopment">
-      </activity>
-      
-      <activityRequirementBinding
-            activityId="org.eclipse.plugInDevelopment"
-            requiredActivityId="org.eclipse.javaDevelopment">
-      </activityRequirementBinding>
-  
-      <activity
-            name="%activity.team.cvs"
-            description="%activity.team.cvs.desc"
-            id="org.eclipse.team.cvs">
-      </activity> 
-      
-      <activity
-            name="%activity.team"
-            description="%activity.team.desc"
-            id="org.eclipse.team">
-      </activity> 
-      
-      <activityRequirementBinding
-            activityId="org.eclipse.team.cvs"
-            requiredActivityId="org.eclipse.team">
-      </activityRequirementBinding>
-      
-      <activityPatternBinding
-            activityId="org.eclipse.javaDevelopment"
-            pattern="org\.eclipse\.jdt\.debug/debugModel">
-      </activityPatternBinding>
-      
-      <activityPatternBinding
-            activityId="org.eclipse.javaDevelopment"
-            pattern="org\.eclipse\.jdt\..*/.*">
-      </activityPatternBinding>
-      
-      <activityPatternBinding
-            activityId="org.eclipse.javaDevelopment"
-            pattern="org\.eclipse\.jdt\.core/javanature">
-
-      </activityPatternBinding>
-      
-      <activityPatternBinding
-            activityId="org.eclipse.plugInDevelopment"
-            pattern="org\.eclipse\.pde\..*/.*">
-      </activityPatternBinding>
-      
-      <activityPatternBinding
-            activityId="org.eclipse.plugInDevelopment"
-            pattern="org\.eclipse\.pde/PluginNature">
-      </activityPatternBinding>
-      <activityPatternBinding
-            activityId="org.eclipse.team"
-            pattern="org\.eclipse\.team\.ui/org.*">
-      </activityPatternBinding> 
-      <activityPatternBinding
-            activityId="org.eclipse.team"
-            pattern="org\.eclipse\.compare/compareWithPatch">
-      </activityPatternBinding>           
-      <activityPatternBinding
-            activityId="org.eclipse.team.cvs"
-            pattern="org\.eclipse\.team\.cvs\.ui/.*">
-      </activityPatternBinding>
-      <activityPatternBinding
-            activityId="org.eclipse.team.cvs"
-            pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
-      </activityPatternBinding>
-      
-      <category
-            name="%activity.cat.development"
-            description="%activity.cat.development.desc"
-            id="org.eclipse.categories.developmentCategory">
-      </category>
-
- 	  <category
-            name="%activity.cat.team"
-            description="%activity.cat.team.desc"
-            id="org.eclipse.categories.teamCategory">
-
-      </category>
-      
-      <categoryActivityBinding
-            activityId="org.eclipse.javaDevelopment"
-            categoryId="org.eclipse.categories.developmentCategory">
-      </categoryActivityBinding>
-      
-      <categoryActivityBinding
-            activityId="org.eclipse.plugInDevelopment"
-            categoryId="org.eclipse.categories.developmentCategory">
-      </categoryActivityBinding>
-
-      <categoryActivityBinding
-            activityId="org.eclipse.team"
-            categoryId="org.eclipse.categories.teamCategory">
-      </categoryActivityBinding>        
-      
-      <categoryActivityBinding
-            activityId="org.eclipse.team.cvs"
-            categoryId="org.eclipse.categories.teamCategory">
-      </categoryActivityBinding>
-  
-      <!-- bind all elements that start with "org" -->      
-       
-      <defaultEnablement
-            id="org.eclipse.javaDevelopment">
-      </defaultEnablement>
-      
-      <defaultEnablement
-            id="org.eclipse.plugInDevelopment">
-      </defaultEnablement>
-      
-      <defaultEnablement
-            id="org.eclipse.team">
-      </defaultEnablement>     
-      
-      <defaultEnablement
-            id="org.eclipse.team.cvs">
-      </defaultEnablement>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <primaryWizard
-            id="org.eclipse.jdt.ui.wizards.JavaProjectWizard">
-      </primaryWizard>
-      <primaryWizard
-            id="org.eclipse.pde.ui.NewProjectWizard">
-      </primaryWizard>
-      <primaryWizard
-            id="org.eclipse.jdt.ui.wizards.NewClassCreationWizard">
-      </primaryWizard>
-      <primaryWizard
-            id="org.eclipse.jdt.ui.wizards.NewInterfaceCreationWizard">
-      </primaryWizard>
-      <primaryWizard
-            id="org.eclipse.pde.ui.NewProductConfigurationWizard">
-      </primaryWizard>
-   </extension>
-
-</plugin>
diff --git a/update/org.eclipse.update.configurator/.classpath b/update/org.eclipse.update.configurator/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/update/org.eclipse.update.configurator/.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/update/org.eclipse.update.configurator/.cvsignore b/update/org.eclipse.update.configurator/.cvsignore
deleted file mode 100644
index 60463af..0000000
--- a/update/org.eclipse.update.configurator/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-build.xml
diff --git a/update/org.eclipse.update.configurator/.options b/update/org.eclipse.update.configurator/.options
deleted file mode 100644
index a2c714f..0000000
--- a/update/org.eclipse.update.configurator/.options
+++ /dev/null
@@ -1,5 +0,0 @@
-# Debugging options for the org.eclipse.update.configurator plugin
-
-# Turn on general debugging for the plugin.
-org.eclipse.update.configurator/debug=false
-
diff --git a/update/org.eclipse.update.configurator/.project b/update/org.eclipse.update.configurator/.project
deleted file mode 100644
index 0f091b2..0000000
--- a/update/org.eclipse.update.configurator/.project
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.configurator</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.osgi</project>
-		<project>org.eclipse.osgi.util</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/update/org.eclipse.update.configurator/about.html b/update/org.eclipse.update.configurator/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/update/org.eclipse.update.configurator/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/build.properties b/update/org.eclipse.update.configurator/build.properties
deleted file mode 100644
index 9fd124f..0000000
--- a/update/org.eclipse.update.configurator/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-bin.includes = .options,\
-               about.html,\
-               plugin.properties,\
-               plugin.xml,\
-               *.jar,\
-               META-INF/,\
-               config.ini
-src.includes = about.html
-source.configurator.jar = src/
diff --git a/update/org.eclipse.update.configurator/plugin.properties b/update/org.eclipse.update.configurator/plugin.properties
deleted file mode 100644
index 8f20178..0000000
--- a/update/org.eclipse.update.configurator/plugin.properties
+++ /dev/null
@@ -1,14 +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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName= Install/Update Configurator
-providerName= Eclipse.org
-productProviderName= Update Configurator Product Provider
-
diff --git a/update/org.eclipse.update.configurator/plugin.xml b/update/org.eclipse.update.configurator/plugin.xml
deleted file mode 100644
index 3b5bbef..0000000
--- a/update/org.eclipse.update.configurator/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.update.configurator"
-   name="%pluginName"
-   version="3.0.0"
-   provider-name="%providerName"
-   class="org.eclipse.update.internal.configurator.ConfigurationActivator">
-
-   <runtime>
-      <library name="configurator.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-   </requires>
-
-
-   <extension
-         id="updateConfiguratorProductProvider"
-         name="%productProviderName"
-         point="org.eclipse.core.runtime.products">
-      <provider> 
-         <run class="org.eclipse.update.internal.configurator.ProductProvider"/> 
-      </provider> 
-         
-   </extension>
-
-</plugin>
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/ConfiguratorUtils.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/ConfiguratorUtils.java
deleted file mode 100644
index ca18ceb..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/ConfiguratorUtils.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.configurator;
-
-import java.io.*;
-import java.net.*;
-
-import org.eclipse.update.internal.configurator.ConfigurationActivator;
-import org.osgi.framework.*;
-
-/**
- * Helper class to get platform configuration data without having to
- * use BootLoader methods from the compatibility layer.
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
- * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
- * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
- * (repeatedly) as the API evolves.
- * </p>
- * @since 3.0
- */
-public class ConfiguratorUtils {
-	/**
-	 * Returns the current platform configuration. This method replaces the one we used
-	 * to call on BootLoader.
-	 * 
-	 * @return platform configuration used in current instance of platform
-	 * @since 3.0
-	 */
-	public static IPlatformConfiguration getCurrentPlatformConfiguration() {
-		// acquire factory service first
-		BundleContext context = ConfigurationActivator.getBundleContext();
-		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 currentConfig;
-	}
-	
-	/**
-	 * Returns a platform configuration object, optionally initialized with previously saved
-	 * configuration information. We will use this method instead of the old one in BootLoader.
-	 * 
-	 * @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
-	 */
-	public static IPlatformConfiguration getPlatformConfiguration(URL url) throws IOException {
-		// acquire factory service first
-		BundleContext context = ConfigurationActivator.getBundleContext();
-		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 config;
-	}
-	
-	/**
-	 * @return the URL of this eclispe installation
-	 */
-	public static URL getInstallURL() {
-		return ConfigurationActivator.getInstallURL();
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/IPlatformConfiguration.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/IPlatformConfiguration.java
deleted file mode 100644
index 829d4d8..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/IPlatformConfiguration.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.configurator;
-
-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.
- * <p>
- * Do not provide implementations of this interface or its nested interfaces. Use the factory methods 
- * on IPlatformConfigurationFactory to create a IPlatformConfiguration, then use the factory methods
- * on the IPlatformConfiguration to create instances of ISiteEntry,IFeatureEntry and ISitePolicy.
- * </p>
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
- * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
- * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
- * (repeatedly) as the API evolves.
- * </p>
- * @since 3.0
- */
-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
-		 * @deprecated Do not use this method
-		 */
-		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
-		 * @deprecated Do not use this method
-		 */
-		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 {
-
-		/**
-		 * 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;
-		
-		/**
-		 * When this site policy is used, only plug-ins specified by the configured features
-		 * are contributed to the runtime.
-		 * @since 3.1
-		 */
-		public static final int MANAGED_ONLY = 2;
-
-		/**
-		 * 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 root 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 root 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  replace 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
-	 * @deprecated Do not use this method.
-	 */
-	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
-	 * @deprecated Do not use this method
-	 */
-	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
-	 * @deprecated Do not use this method. Check the osgi.bundles system property for the
-	 * urls of the automatically started bundles
-	 */
-	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
-	 * @deprecated Do not use this method. Use the osig.bundles system property contains
-	 * the urls of the automatically started bundles.
-	 */
-	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.
-	 * 
-	 * @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/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/IPlatformConfigurationFactory.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/IPlatformConfigurationFactory.java
deleted file mode 100644
index a98af00..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/IPlatformConfigurationFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.configurator;
-
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * Factory for creating platform configurations.
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
- * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
- * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
- * (repeatedly) as the API evolves.
- * </p>
- */
-public interface IPlatformConfigurationFactory {
-	/**
-	 * Returns the current platform configuration.
-	 * 
-	 * @return platform configuration used in current instance of platform
-	 */	
-	public IPlatformConfiguration getCurrentPlatformConfiguration();
-	/**
-	 * 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
-	 */	
-	public IPlatformConfiguration getPlatformConfiguration(URL url) throws IOException;
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/package.html b/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/package.html
deleted file mode 100644
index fa0f9f6..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/configurator/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">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.72 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides support for accessing platform configuration data.
-<h2>
-Package Specification</h2>
-This package contains interfaces for accessing and manipulating the local
-system installation and configuration information. 
-<p>
-<b>Note:</b> This package is part of an interim API that is still under development and expected to
-change significantly before reaching stability. It is being made available at this early stage to solicit feedback
-from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
-(repeatedly) as the API evolves.
-</p>
-</body>
-</html>
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/BootDescriptor.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/BootDescriptor.java
deleted file mode 100644
index bc63b75..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/BootDescriptor.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.net.*;
-
-
-public class BootDescriptor {
-	private String id;
-	private String version;
-	private String[] libs;
-	private URL dir;
-
-	public BootDescriptor(String id, String version, String[] libs, URL dir) {
-		this.id = id;
-		this.version = version;
-		this.libs = libs;
-		this.dir = dir;
-	}
-
-	public String getId() {
-		return id;
-	}
-
-	public String getVersion() {
-		return version;
-	}
-
-	public String[] getLibraries() {
-		return libs;
-	}
-
-	public URL getPluginDirectoryURL() {
-		return dir;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/BundleManifest.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/BundleManifest.java
deleted file mode 100644
index bdaba9e..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/BundleManifest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-import java.io.*;
-import java.util.jar.*;
-
-import org.eclipse.osgi.util.*;
-import org.osgi.framework.*;
-/**
- * Parses MANIFEST.MF
- */
-public class BundleManifest implements IConfigurationConstants {
-	private File manifestFile;
-	private PluginEntry pluginEntry;
-	private IOException exception;
-	private String bundleURL;
-	/**
-	 * Constructor for local file
-	 */
-	public BundleManifest(File manifest) {
-		super();
-		manifestFile = manifest;
-		if (manifest.exists() && !manifest.isDirectory()) {
-			FileInputStream fos = null;
-			try {
-				fos = new FileInputStream(manifest);
-				parse(fos);
-			} catch (IOException ioe) {
-			} finally {
-				if (fos != null) {
-					try {
-						fos.close();
-					} catch (IOException e) {
-					}
-				}
-			}
-		}
-	}
-		/**
-		 * Constructor for local file
-		 */
-		public BundleManifest(InputStream input, String bundleUrl) {
-			super();
-			bundleURL = bundleUrl;
-			if (input != null) {
-				parse(input);
-			}
-		}
-	/**
-	 * Parses manifest, creates PluginEntry if manifest is valid, stores
-	 * exception if any occurs
-	 * 
-	 * @param in
-	 *            InputStream
-	 */
-	private void parse(InputStream in) {
-		try {
-			Manifest m = new Manifest(in);
-			Attributes a = m.getMainAttributes();
-			// plugin id
-			String symbolicName = a.getValue(Constants.BUNDLE_SYMBOLICNAME);
-			if (symbolicName == null) {
-				// In Eclipse manifest must have Bundle-SymbolicName attribute
-				return;
-			}
-			String id;
-			try {
-				ManifestElement[] elements = ManifestElement.parseHeader(
-						Constants.BUNDLE_SYMBOLICNAME, symbolicName);
-				id = elements[0].getValue();
-			} catch (BundleException be) {
-				throw new IOException(be.getMessage());
-			}
-			// plugin version
-			String version = a.getValue(Constants.BUNDLE_VERSION);
-			if (version == null) {
-				Utils.log(Messages.getString(
-						"BundleManifest.noVersion", Constants.BUNDLE_VERSION, //$NON-NLS-1$
-						id));
-				return;
-			}
-			String hostPlugin = a.getValue(Constants.FRAGMENT_HOST);
-			pluginEntry = new PluginEntry();
-			pluginEntry.setVersionedIdentifier(new VersionedIdentifier(id,
-					version));
-			pluginEntry.isFragment(hostPlugin != null
-					&& hostPlugin.length() > 0);
-			// Set URL
-			if(bundleURL!=null){
-				pluginEntry.setURL(bundleURL);
-			}else{
-				File pluginDir = manifestFile.getParentFile();
-				if (pluginDir != null) {
-					pluginDir = pluginDir.getParentFile();
-				}
-				if (pluginDir != null){
-					pluginEntry.setURL(PLUGINS + "/" + pluginDir.getName() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			//
-		} catch (IOException ioe) {
-			exception = ioe;
-		}
-	}
-	public boolean exists() {
-		return exception != null || pluginEntry != null;
-	}
-	/**
-	 * Obtains PluginEntry from a manifest.
-	 * 
-	 * @return PluginEntry or null if valid manifest does not exist
-	 * @throws IOException
-	 *             if exception during parsing
-	 */
-	public PluginEntry getPluginEntry() throws IOException {
-		if (exception != null) {
-			throw exception;
-		} else {
-			return pluginEntry;
-		}
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Configuration.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Configuration.java
deleted file mode 100644
index 2c4a760..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Configuration.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.net.*;
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.configurator.*;
-import org.w3c.dom.*;
-
-
-public class Configuration implements IConfigurationConstants {
-	
-	private HashMap sites = new HashMap();
-	private Date date;
-	private long lastModified; // needed to account for file system limitations
-	private URL url;
-	private boolean transientConfig;
-	private boolean isDirty;
-	private Configuration linkedConfig; // shared configuration
-	
-	public Configuration() {
-		this(new Date());
-		// the config is created now or out of a platform.xml without a date
-		isDirty = true;
-	}
-	public Configuration(Date date)  {
-		this.date = date;
-	}
-	
-	public void setURL(URL url) {
-		this.url = url;
-	}
-	
-	public URL getURL() {
-		return url;
-	}
-	
-	public void setLinkedConfig(Configuration linkedConfig) {
-		this.linkedConfig = linkedConfig;
-		// make all the sites read-only
-		SiteEntry[] linkedSites = linkedConfig.getSites();
-		for (int i=0; i<linkedSites.length; i++)
-			linkedSites[i].setUpdateable(false);
-	}
-	
-	public Configuration getLinkedConfig() {
-		return linkedConfig;
-	}
-	
-	/**
-	 * @return true if the config needs to be saved
-	 */
-	public boolean isDirty() {
-		return isDirty;
-	}
-	
-	public void setDirty(boolean dirty) {
-		isDirty = dirty;
-	}
-	
-	public void addSiteEntry(String url, SiteEntry site) {
-		// only add the same site once
-		if (sites.get(url) == null && (linkedConfig == null || linkedConfig.sites.get(url) == null)) {
-			site.setConfig(this);
-			sites.put(url, site);
-		}
-	}
-	
-	public void removeSiteEntry(String url) {
-		sites.remove(url);
-	}
-	
-	public SiteEntry getSiteEntry(String url) {
-		SiteEntry site = (SiteEntry)sites.get(url);
-		if (site == null && linkedConfig != null)
-			site = linkedConfig.getSiteEntry(url);
-		return site;
-	}
-	
-	public SiteEntry[] getSites() {
-		if (linkedConfig == null)
-			return (SiteEntry[]) sites.values().toArray(new SiteEntry[sites.size()]);
-		else {
-			ArrayList combinedSites = new ArrayList(sites.values());
-			combinedSites.addAll(linkedConfig.sites.values());
-			return (SiteEntry[]) combinedSites.toArray(new SiteEntry[combinedSites.size()]);
-		}
-	}
-	
-	public Element toXML(Document doc) throws CoreException {	
-		try {
-			Element configElement = doc.createElement(CFG);
-
-			configElement.setAttribute(CFG_VERSION, VERSION);
-			configElement.setAttribute(CFG_DATE, String.valueOf(date.getTime()));
-			String transitory = isTransient() ? "true" : "false"; //$NON-NLS-1$ //$NON-NLS-2$
-			configElement.setAttribute(CFG_TRANSIENT, transitory);
-						
-			if (linkedConfig != null) {
-				configElement.setAttribute(CFG_SHARED_URL, linkedConfig.getURL().toExternalForm());
-			}
-
-			// collect site entries
-			SiteEntry[] list = (SiteEntry[]) sites.values().toArray(new SiteEntry[0]);
-			for (int i = 0; i < list.length; i++) {
-				if (linkedConfig != null && linkedConfig.getSiteEntry(list[i].getURL().toExternalForm()) != null)
-					continue;
-				Element siteElement = list[i].toXML(doc);
-				configElement.appendChild(siteElement);
-			}
-			
-			return configElement;
-			
-		} catch (Exception e) {
-			throw Utils.newCoreException("", e); //$NON-NLS-1$
-		} 
-	}
-	
-	public boolean isTransient() {
-		return transientConfig;
-	}
-	
-	public void setTransient(boolean isTransient) {
-		this.transientConfig = isTransient;
-	}
-	
-	public Date getDate() {
-		return date;
-	}
-	
-	public void setDate(Date date) {
-		this.date = date;
-	}
-	
-	public boolean unconfigureFeatureEntry(IPlatformConfiguration.IFeatureEntry feature) {
-		SiteEntry[] sites = getSites();
-		for (int i=0; i<sites.length; i++)
-			if (sites[i].unconfigureFeatureEntry(feature))
-				return true;
-		return false;
-	}
-	
-	public void setLastModified(long lastModified) {
-		this.lastModified = lastModified;
-	}
-	
-	public long lastModified() {
-		if (lastModified != 0)
-			return lastModified;
-		else
-			return date.getTime();
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationActivator.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationActivator.java
deleted file mode 100644
index c6e93e8..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationActivator.java
+++ /dev/null
@@ -1,475 +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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.framework.log.*;
-import org.eclipse.osgi.service.datalocation.*;
-import org.eclipse.osgi.service.debug.*;
-import org.eclipse.update.configurator.*;
-import org.osgi.framework.*;
-import org.osgi.service.packageadmin.*;
-import org.osgi.service.startlevel.*;
-import org.osgi.util.tracker.*;
-
-public class ConfigurationActivator implements BundleActivator, IBundleGroupProvider, IConfigurationConstants {
-
-	public static String PI_CONFIGURATOR = "org.eclipse.update.configurator"; //$NON-NLS-1$
-	public static final String INSTALL_LOCATION = "osgi.installLocation"; //$NON-NLS-1$
-	public static final String LAST_CONFIG_STAMP = "last.config.stamp"; //$NON-NLS-1$
-	public static final String NAME_SPACE = "org.eclipse.update"; //$NON-NLS-1$
-	public static final String UPDATE_PREFIX = "update@"; //$NON-NLS-1$
-	private static final String INITIAL_PREFIX = "initial@"; //$NON-NLS-1$
-	
-	// debug options
-	public static String OPTION_DEBUG = PI_CONFIGURATOR + "/debug"; //$NON-NLS-1$
-	// debug values
-	public static boolean DEBUG = false;
-	// os
-	private static boolean isWindows = System.getProperty("os.name").startsWith("Win"); //$NON-NLS-1$ //$NON-NLS-2$
-	
-	private static BundleContext context;
-	private ServiceTracker platformTracker;
-	private ServiceRegistration configurationFactorySR;
-	private PlatformConfiguration configuration;
-	
-	// Install location
-	private static URL installURL;
-	
-	// Location of the configuration data
-	private Location configLocation;
-	
-	//Need to store that because it is not provided by the platformConfiguration
-	private long lastTimeStamp;
-
-	// The expected states timestamp
-	private long lastStateTimeStamp;
-	
-	// Singleton
-	private static ConfigurationActivator configurator;
-
-	public ConfigurationActivator() {
-		configurator = this;
-	}
-	
-	public void start(BundleContext ctx) throws Exception {
-		context = ctx;
-		loadOptions();
-		acquireFrameworkLogService();
-		initialize();
-		
-		//Short cut, if the configuration has not changed
-		if (canRunWithCachedData()) {		
-			Utils.debug("Running with cached data"); //$NON-NLS-1$
-			Platform.registerBundleGroupProvider(this);
-			return;
-		}
-
-		Utils.debug("Starting update configurator..."); //$NON-NLS-1$
-
-		installBundles();
-		Platform.registerBundleGroupProvider(this);
-	}
-
-
-	private void initialize() throws Exception {
-		// TODO this test is not really needed any more than any plugin has 
-		// to test to see if the runtime is running.  It was there from earlier days
-		// where startup was much more disjoint.  Some day that level of decoupling
-		// will return but for now...
-		if (!Platform.isRunning())
-			throw new Exception(Messages.getString("ConfigurationActivator.initialize")); //$NON-NLS-1$
-		
-		configLocation = Platform.getConfigurationLocation();
-		// create the name space directory for update (configuration/org.eclipse.update)
-		if (!configLocation.isReadOnly()) {
-			try {
-				URL privateURL = new URL(configLocation.getURL(), NAME_SPACE);
-				File f = new File(privateURL.getFile());
-				if(!f.exists())
-					f.mkdirs();
-			} catch (MalformedURLException e1) {
-				// ignore
-			}
-		}
-		configurationFactorySR = context.registerService(IPlatformConfigurationFactory.class.getName(), new PlatformConfigurationFactory(), null);
-		configuration = getPlatformConfiguration(getInstallURL(), configLocation);
-		if (configuration == null)
-			throw Utils.newCoreException(Messages.getString("ConfigurationActivator.createConfig", configLocation.getURL().toExternalForm()), null); //$NON-NLS-1$
-
-		DataInputStream stream = null;
-		try {
-			stream = new DataInputStream(new URL(configLocation.getURL(),NAME_SPACE+'/'+LAST_CONFIG_STAMP).openStream());
-			lastTimeStamp = stream.readLong();
-			lastStateTimeStamp = stream.readLong();
-		} catch (Exception e) {
-			lastTimeStamp = configuration.getChangeStamp() - 1;
-			lastStateTimeStamp = -1;
-		} finally {
-			if (stream != null)
-				try {
-					stream.close();
-				} catch (IOException e1) {
-					Utils.log(e1.getLocalizedMessage());
-				}
-		}
-	}
-
-
-	public void stop(BundleContext ctx) throws Exception {
-		// quick fix (hack) for bug 47861
-		try {
-			PlatformConfiguration.shutdown();
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		configurationFactorySR.unregister();
-	}
-
-	public boolean installBundles() {
-		Utils.debug("Installing bundles..."); //$NON-NLS-1$
-		ServiceReference reference = context.getServiceReference(StartLevel.class.getName());
-		int startLevel = 4;
-		String defaultStartLevel = System.getProperty("osgi.bundles.defaultStartLevel"); //$NON-NLS-1$
-		if (defaultStartLevel != null) {
-			try {
-				startLevel = Integer.parseInt(defaultStartLevel);
-			} catch (NumberFormatException e1) {
-				startLevel = 4;
-			}
-		}
-		if (startLevel < 1)
-			startLevel = 4;
-		
-		StartLevel start = null;
-		if (reference != null)
-			start = (StartLevel) context.getService(reference);
-		try {
-			// Get the list of cached bundles and compare with the ones to be installed.
-			// Uninstall all the cached bundles that do not appear on the new list
-			Bundle[] cachedBundles = context.getBundles();		
-			URL[] plugins = configuration.getPluginPath();
-				
-			// starts the list of bundles to refresh with all currently unresolved bundles (see bug 50680)
-			List toRefresh = getUnresolvedBundles();
-
-			Bundle[] bundlesToUninstall = getBundlesToUninstall(cachedBundles, plugins);
-			for (int i=0; i<bundlesToUninstall.length; i++) {
-				try {
-					if (DEBUG)
-						Utils.debug("Uninstalling " + bundlesToUninstall[i].getLocation()); //$NON-NLS-1$
-					// include every bundle being uninstalled in the list of bundles to refresh (see bug 82393)					
-					toRefresh.add(bundlesToUninstall[i]);					
-					bundlesToUninstall[i].uninstall();
-				} catch (Exception e) {
-					Utils.log(Messages.getString("ConfigurationActivator.uninstallBundle", bundlesToUninstall[i].getLocation())); //$NON-NLS-1$
-				}
-			}
-			
-			// Get the urls to install
-			String[] bundlesToInstall = getBundlesToInstall(cachedBundles, plugins);
-
-			for (int i = 0; i < bundlesToInstall.length; i++) {
-				try {
-					if (DEBUG)
-						Utils.debug("Installing " + bundlesToInstall[i]); //$NON-NLS-1$
-					URL bundleURL = new URL("reference:file:"+bundlesToInstall[i]); //$NON-NLS-1$
-					//Bundle target = context.installBundle(bundlesToInstall[i]);
-					Bundle target = context.installBundle(UPDATE_PREFIX+bundlesToInstall[i], bundleURL.openStream());
-					// any new bundle should be refreshed as well
-					toRefresh.add(target);
-					if (start != null)
-						start.setBundleStartLevel(target, startLevel);
-				
-				} catch (Exception e) {
-					if (!Utils.isAutomaticallyStartedBundle(bundlesToInstall[i]))
-						Utils.log(Messages.getString("ConfigurationActivator.installBundle", bundlesToInstall[i]) + "   " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			context.ungetService(reference);
-			removeInitialBundles(toRefresh, cachedBundles);
-			refreshPackages((Bundle[]) toRefresh.toArray(new Bundle[toRefresh.size()]));
-			
-			// keep track of the last config successfully processed
-			writePlatformConfigurationTimeStamp();
-			return true;
-		} catch (Exception e) {
-			return false;
-		} 
-	}
-
-	private void removeInitialBundles(List bundles, Bundle[] cachedBundles) {
-		String[] initialSymbolicNames = getInitialSymbolicNames(cachedBundles);
-		Iterator iter = bundles.iterator();
-		while(iter.hasNext()) {
-			Bundle bundle = (Bundle) iter.next();
-			String symbolicName = bundle.getSymbolicName();
-			for(int i = 0; i < initialSymbolicNames.length; i++) {
-				if (initialSymbolicNames[i].equals(symbolicName)) {
-					iter.remove();
-					break;
-				}
-			}
-		}
-	}
-
-	private String[] getInitialSymbolicNames(Bundle[] cachedBundles) {
-		ArrayList initial = new ArrayList();
-		for (int i = 0; i < cachedBundles.length; i++) {
-			Bundle bundle = cachedBundles[i];
-			if (bundle.getLocation().startsWith(INITIAL_PREFIX)) {
-				String symbolicName = bundle.getSymbolicName();
-				if (symbolicName != null)
-					initial.add(symbolicName);
-			}
-		}
-		return (String[]) initial.toArray(new String[initial.size()]);
-	}
-
-	private List getUnresolvedBundles() {
-		Bundle[] allBundles = context.getBundles();
-		List unresolved = new ArrayList(); 
-		for (int i = 0; i < allBundles.length; i++)
-			if (allBundles[i].getState() == Bundle.INSTALLED)
-				unresolved.add(allBundles[i]);
-		return unresolved;
-	}
-
-	private String[] getBundlesToInstall(Bundle[] cachedBundles, URL[] newPlugins) {
-		// First, create a map of the cached bundles, for faster lookup
-		HashSet cachedBundlesSet = new HashSet(cachedBundles.length);
-		int offset = UPDATE_PREFIX.length();
-		for (int i=0; i<cachedBundles.length; i++) {
-			if (cachedBundles[i].getBundleId() == 0)
-				continue; // skip the system bundle
-			String bundleLocation = cachedBundles[i].getLocation();
-			// Ignore bundles not installed by us
-			if (!bundleLocation.startsWith(UPDATE_PREFIX))
-				continue;
-			
-			bundleLocation = bundleLocation.substring(offset);
-			cachedBundlesSet.add(bundleLocation);
-			// On windows, we will be doing case insensitive search as well, so lower it now
-			if (isWindows)
-				cachedBundlesSet.add(bundleLocation.toLowerCase());
-		}
-		
-		ArrayList bundlesToInstall = new ArrayList(newPlugins.length);
-		for (int i = 0; i < newPlugins.length; i++) {
-			String location = newPlugins[i].getFile();
-			// check if already installed
-			if (cachedBundlesSet.contains(location))
-				continue;
-			if (isWindows && cachedBundlesSet.contains(location.toLowerCase()))
-				continue;
-			
-			bundlesToInstall.add(location);
-		}
-		return (String[])bundlesToInstall.toArray(new String[bundlesToInstall.size()]);	
-	}
-	
-	
-	private Bundle[] getBundlesToUninstall(Bundle[] cachedBundles, URL[] newPlugins) {
-		// First, create a map for faster lookups
-		HashSet newPluginsSet = new HashSet(newPlugins.length);
-		for (int i=0; i<newPlugins.length; i++) {
-			
-			String pluginLocation = newPlugins[i].getFile();
-			newPluginsSet.add(pluginLocation);
-			// On windows, we will be doing case insensitive search as well, so lower it now
-			if (isWindows)
-				newPluginsSet.add(pluginLocation.toLowerCase());
-		}
-		
-		ArrayList bundlesToUninstall = new ArrayList();
-		int offset = UPDATE_PREFIX.length();
-		for (int i=0; i<cachedBundles.length; i++) {
-			if (cachedBundles[i].getBundleId() == 0)
-				continue; // skip the system bundle
-			String cachedBundleLocation = cachedBundles[i].getLocation();
-			// Only worry about bundles we installed
-			if (!cachedBundleLocation.startsWith(UPDATE_PREFIX))
-				continue;
-			cachedBundleLocation = cachedBundleLocation.substring(offset);
-
-			if (newPluginsSet.contains(cachedBundleLocation))
-				continue;
-			if (isWindows && newPluginsSet.contains(cachedBundleLocation.toLowerCase()))
-				continue;
-			
-			bundlesToUninstall.add(cachedBundles[i]);
-		}
-		return (Bundle[])bundlesToUninstall.toArray(new Bundle[bundlesToUninstall.size()]);
-	}
-	
-
-	/**
-	 * Creates and starts the platform configuration.
-	 * @return the just started platform configuration
-	 */
-	private PlatformConfiguration getPlatformConfiguration(URL installURL, Location configLocation) {
-		try {
-			PlatformConfiguration.startup(installURL, configLocation);
-		} catch (Exception e) {
-			if (platformTracker != null) {
-				String message = e.getMessage();
-				if (message == null)
-					message = ""; //$NON-NLS-1$
-				Utils.log(Utils.newStatus(message, e));
-			}
-		}
-		return PlatformConfiguration.getCurrent();
-
-	}
-
-	/**
-	 * 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
-	 */
-	private void refreshPackages(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) {
-				}
-			}
-		}
-		context.removeFrameworkListener(listener);
-		context.ungetService(packageAdminRef);
-	}
-	
-	private void writePlatformConfigurationTimeStamp() {
-		DataOutputStream stream = null;
-		try {
-			if (configLocation.isReadOnly())
-				return;
-			
-			String configArea = configLocation.getURL().getFile();
-			lastTimeStamp = configuration.getChangeStamp();
-			lastStateTimeStamp = Platform.getPlatformAdmin().getState(false).getTimeStamp();
-			stream = new DataOutputStream(new FileOutputStream(configArea +File.separator+ NAME_SPACE+ File.separator+ LAST_CONFIG_STAMP));
-			stream.writeLong(lastTimeStamp);
-			stream.writeLong(lastStateTimeStamp);
-		} catch (Exception e) {
-			Utils.log(e.getLocalizedMessage());
-		} finally {
-			if (stream != null)
-				try {
-					stream.close();
-				} catch (IOException e1) {
-					Utils.log(e1.getLocalizedMessage());
-				}
-		}
-	}
-
-	private void loadOptions() {
-		// all this is only to get the application args		
-		DebugOptions service = null;
-		ServiceReference reference = context.getServiceReference(DebugOptions.class.getName());
-		if (reference != null)
-			service = (DebugOptions) context.getService(reference);
-		if (service == null)
-			return;
-		try {
-			DEBUG = service.getBooleanOption(OPTION_DEBUG, false);
-		} finally {
-			// we have what we want - release the service
-			context.ungetService(reference);
-		}
-	}
-	
-	private boolean canRunWithCachedData() {
-		return  !"true".equals(System.getProperty("osgi.checkConfiguration")) && //$NON-NLS-1$ //$NON-NLS-2$
-				lastTimeStamp==configuration.getChangeStamp() &&
-				lastStateTimeStamp==Platform.getPlatformAdmin().getState(false).getTimeStamp();
-	}
-				
-	public static BundleContext getBundleContext() {
-		return context;
-	}
-		
-	public static URL getInstallURL() {
-		if (installURL == null)
-			installURL = Platform.getInstallLocation().getURL();
-		return installURL;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IBundleGroupProvider#getName()
-	 */
-	public String getName() {
-		return Messages.getString("BundleGroupProvider"); //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IBundleGroupProvider#getBundleGroups()
-	 */
-	public IBundleGroup[] getBundleGroups() {
-		if (configuration == null)
-			return new IBundleGroup[0];
-		else {
-			IPlatformConfiguration.IFeatureEntry[] features = configuration.getConfiguredFeatureEntries();
-			ArrayList bundleGroups = new ArrayList(features.length);
-			for (int i=0; i<features.length; i++) {
-				if (features[i] instanceof FeatureEntry 
-					&& ((FeatureEntry)features[i]).hasBranding())
-					bundleGroups.add(features[i]);
-			}
-			return (IBundleGroup[])bundleGroups.toArray(new IBundleGroup[bundleGroups.size()]);
-		}
-	}
-
-	public static void setConfigurator(ConfigurationActivator configurator) {
-		ConfigurationActivator.configurator = configurator;
-	}
-
-	public static ConfigurationActivator getConfigurator() {
-		return configurator;
-	}
-	
-	private void acquireFrameworkLogService() throws Exception{
-		ServiceReference logServiceReference = context.getServiceReference(FrameworkLog.class.getName());
-		if (logServiceReference == null)
-			return;
-		Utils.log  = (FrameworkLog) context.getService(logServiceReference);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationParser.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationParser.java
deleted file mode 100644
index 976564e..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ConfigurationParser.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-import java.io.*;
-import java.lang.reflect.*;
-import java.net.*;
-import java.util.*;
-import javax.xml.parsers.*;
-
-import org.eclipse.core.runtime.*;
-import org.xml.sax.*;
-import org.xml.sax.helpers.*;
-
-/**
- * parse the default site.xml
- */
-
-public class ConfigurationParser extends DefaultHandler implements IConfigurationConstants {
-	
-	private final static SAXParserFactory parserFactory =
-		SAXParserFactory.newInstance();
-	private SAXParser parser;
-	
-	private URL currentSiteURL;
-	private Configuration config;
-	private URL configURL;
-	private InputStream input;
-	
-	/**
-	 * Constructor for ConfigurationParser
-	 */
-	public ConfigurationParser() throws InvocationTargetException {
-
-		try {
-			parserFactory.setNamespaceAware(true);
-			this.parser = parserFactory.newSAXParser();
-		} catch (ParserConfigurationException e) {
-			Utils.log(Utils.newStatus("ConfigurationParser", e)); //$NON-NLS-1$
-			throw new InvocationTargetException(e);
-		} catch (SAXException e) {
-			Utils.log(Utils.newStatus("ConfigurationParser", e)); //$NON-NLS-1$
-			throw new InvocationTargetException(e);
-		}
-	}
-	
-	public Configuration parse(URL url) throws Exception {
-
-		// DEBUG:		
-		Utils.debug("Start parsing Configuration:" + url); //$NON-NLS-1$	
-		long lastModified = 0;
-		try {
-			configURL = url;
-			if ("file".equals(url.getProtocol())) { //$NON-NLS-1$
-				File inputFile = new File(url.getFile());
-				if (!inputFile.exists() || !inputFile.canRead())
-					return null;
-				lastModified = inputFile.lastModified();
-				input = new FileInputStream(inputFile);
-			} else 
-				input = url.openStream();
-			parser.parse(new InputSource(input), this);
-			return config;
-		} catch (Exception e) {
-			Utils.log(Utils.newStatus("ConfigurationParser.parse() error:", e)); //$NON-NLS-1$
-			throw e;
-		} finally {
-			if (config != null)
-				config.setLastModified(lastModified);
-			try {
-				if (input != null) { 
-					input.close();
-					input = null;
-				}
-			} catch (IOException e1) {
-				Utils.log(e1.getLocalizedMessage());
-			}
-		}
-	}
-
-	/**
-	 * @see DefaultHandler#startElement(String, String, String, Attributes)
-	 */
-	public void startElement(
-		String uri,
-		String localName,
-		String qName,
-		Attributes attributes)
-		throws SAXException {
-
-		// DEBUG:		
-		Utils.debug("Start Element: uri:" + uri + " local Name:" + localName + " qName:" + qName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		try {
-
-			String tag = localName.trim();
-
-			if (tag.equalsIgnoreCase(CFG)) {
-				processConfig(attributes);
-				return;
-			}
-
-			if (tag.equalsIgnoreCase(CFG_SITE)) {
-				processSite(attributes);
-				return;
-			}
-
-			if (tag.equalsIgnoreCase(CFG_FEATURE_ENTRY)) {
-				processFeature(attributes);
-				return;
-			}
-
-		} catch (MalformedURLException e) {
-			throw new SAXException(Messages.getString("InstalledSiteParser.UnableToCreateURL", e.getMessage()), e); //$NON-NLS-1$
-		} catch (CoreException e) {
-			throw new SAXException(Messages.getString("InstalledSiteParser.InternalError", e.toString()), e); //$NON-NLS-1$
-		}
-	}
-
-	/** 
-	 * process the Site info
-	 */
-	private void processSite(Attributes attributes)
-		throws MalformedURLException, CoreException {
-
-		if (config == null)
-			return;
-		
-		// reset current site
-		currentSiteURL = null;
-		
-		String urlString = attributes.getValue(CFG_URL); //$NON-NLS-1$
-		if (urlString == null)
-			return;
-
-		URL url = null;
-		try {
-			url = new URL(urlString);
-		} catch (MalformedURLException e) {
-			// try relative to install url
-			url = new URL(PlatformConfiguration.getInstallURL(), urlString);
-			return;
-		}
-		
-		if (!isValidSite(url))
-			return;
-		
-		// use this new site
-		currentSiteURL = url;
-
-		int policyType;
-		String[] policyList = null;
-		String typeString = attributes.getValue(CFG_POLICY); //$NON-NLS-1$
-		if (typeString == null) {
-			policyType = DEFAULT_POLICY_TYPE;
-			policyList = DEFAULT_POLICY_LIST;
-		} else {
-			int i;
-			for (i = 0; i < CFG_POLICY_TYPE.length; i++) {
-				if (typeString.equals(CFG_POLICY_TYPE[i])) {
-					break;
-				}
-			}
-			if (i >= CFG_POLICY_TYPE.length) {
-				policyType = DEFAULT_POLICY_TYPE;
-				policyList = DEFAULT_POLICY_LIST;
-			} else {
-				policyType = i;
-				String pluginList = attributes.getValue(CFG_LIST);
-				if (pluginList != null) {
-					StringTokenizer st = new StringTokenizer(pluginList,","); //$NON-NLS-1$
-					policyList = new String[st.countTokens()];
-					for (i=0; i<policyList.length; i++)
-						policyList[i] = st.nextToken();
-				}
-			}
-		}
-
-		SitePolicy sp = new SitePolicy(policyType, policyList);
-		SiteEntry site = (SiteEntry) new SiteEntry(url, sp);
-
-		String flag = attributes.getValue(CFG_UPDATEABLE); //$NON-NLS-1$
-		if (flag != null) {
-			if (flag.equals("true")) //$NON-NLS-1$
-				site.setUpdateable(true);
-			else
-				site.setUpdateable(false);
-		}
-		
-		flag = attributes.getValue(CFG_ENABLED); //$NON-NLS-1$
-		if (flag != null && flag.equals("false")) //$NON-NLS-1$
-			site.setEnabled(false);
-		else
-			site.setEnabled(true);
-
-		String linkname = attributes.getValue(CFG_LINK_FILE); //$NON-NLS-1$
-		if (linkname != null && !linkname.equals("")) { //$NON-NLS-1$
-			site.setLinkFileName(linkname.replace('/', File.separatorChar));
-		}
-
-		// DEBUG:		
-		Utils.debug("End process config site url:" + urlString + " policy:" + typeString + " updatable:"+flag ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		
-		config.addSiteEntry(url.toExternalForm(), site);
-	}
-	
-	/** 
-	 * process the DefaultFeature info
-	 */
-	private void processFeature(Attributes attributes)
-		throws MalformedURLException, CoreException {
-
-		if (currentSiteURL == null)
-			return; // the site was not correct
-			
-		String id = attributes.getValue(CFG_FEATURE_ENTRY_ID); //$NON-NLS-1$
-		if (id == null)
-			return;
-		String version = attributes.getValue(CFG_FEATURE_ENTRY_VERSION); //$NON-NLS-1$
-		String pluginVersion = attributes.getValue(CFG_FEATURE_ENTRY_PLUGIN_VERSION); //$NON-NLS-1$
-		if (pluginVersion == null || pluginVersion.trim().length() == 0)
-			pluginVersion = version;
-		String pluginIdentifier = attributes.getValue(CFG_FEATURE_ENTRY_PLUGIN_IDENTIFIER); //$NON-NLS-1$
-		if (pluginIdentifier != null && pluginIdentifier.trim().length() == 0)
-			pluginIdentifier = null;
-		String application = attributes.getValue(CFG_FEATURE_ENTRY_APPLICATION); //$NON-NLS-1$
-		
-		// get install locations
-		String locations = attributes.getValue(CFG_FEATURE_ENTRY_ROOT);
-		StringTokenizer st = locations != null ? new StringTokenizer(locations,",") : new StringTokenizer(""); //$NON-NLS-1$ //$NON-NLS-2$
-		ArrayList rootList = new ArrayList(st.countTokens());
-		while (st.hasMoreTokens()){
-			try{
-				URL rootEntry = new URL(st.nextToken());
-				rootList.add(rootEntry);
-			} catch (MalformedURLException e) {
-				// skip bad entries ...
-			}
-		}
-		URL[] roots = (URL[]) rootList.toArray(new URL[rootList.size()]);
-
-		// get primary flag
-		boolean primary = false;
-		String flag = attributes.getValue(CFG_FEATURE_ENTRY_PRIMARY); //$NON-NLS-1$
-		if (flag != null) {
-			if (flag.equals("true")) //$NON-NLS-1$
-				primary = true;
-		}
-		
-		FeatureEntry featureEntry =  new FeatureEntry(id, version, pluginIdentifier, pluginVersion, primary, application, roots);
-
-		// set the url
-		String url = attributes.getValue(CFG_URL); //$NON-NLS-1$
-		if (url != null && url.trim().length() > 0)
-			featureEntry.setURL(url);
-		
-		SiteEntry site = config.getSiteEntry(currentSiteURL.toExternalForm());
-		site.addFeatureEntry(featureEntry);
-		
-		// configured ?
-//		String configuredString = attributes.getValue("configured"); //$NON-NLS-1$
-//		boolean configured = configuredString.trim().equalsIgnoreCase("true") ? true : false; //$NON-NLS-1$
-	}
-
-
-	/** 
-	 * process the Config info
-	 */
-	private void processConfig(Attributes attributes) {
-		String date = attributes.getValue(CFG_DATE);
-		if (date == null || date.trim().length() == 0)
-			config = new Configuration(); // constructed with current date
-		else {
-			long time = 0;
-			try {
-				time = Long.parseLong(date);
-				config = new Configuration(new Date(time));
-			} catch (NumberFormatException e1) {
-				time = new Date().getTime();
-				Utils.log(Messages.getString("InstalledSiteParser.date", date)); //$NON-NLS-1$
-				config = new Configuration(); // constructed with current date
-			}
-		}
-		
-		config.setURL(configURL);
-		
-		try {
-			String sharedURL = attributes.getValue(CFG_SHARED_URL);
-			if (sharedURL != null) {
-				ConfigurationParser parser = new ConfigurationParser();
-				Configuration sharedConfig = parser.parse(new URL(sharedURL));
-				if (sharedConfig == null)
-					throw new Exception();
-				config.setLinkedConfig(sharedConfig);
-			}
-		} catch (Exception e) {
-			// could not load from shared install
-			Utils.log(Utils.newStatus(Messages.getString("ConfigurationParser.cannotLoadSharedInstall"), e)); //$NON-NLS-1$
-		}
-
-		String flag = attributes.getValue(CFG_TRANSIENT);
-		if (flag != null) {
-			config.setTransient(flag.equals("true")); //$NON-NLS-1$
-		}
-		
-		// DEBUG:		
-		Utils.debug("End Processing Config Tag: date:" + attributes.getValue(CFG_DATE)); //$NON-NLS-1$
-	}
-	
-	private boolean isValidSite(URL url) {
-		URL resolvedURL=  url;
-		if (url.getProtocol().equals("platform")) { // $NON-NLS-1$
-			try {
-				resolvedURL = PlatformConfiguration.resolvePlatformURL(url); // 19536
-			} catch (IOException e) {
-				// will use the baseline URL ...
-			}
-		}
-		
-		if (!PlatformConfiguration.supportsDetection(resolvedURL))
-			return false;
-
-		File siteRoot = new File(resolvedURL.getFile().replace('/', File.separatorChar));
-		if (!siteRoot.exists()) {
-			Utils.debug("Site " + resolvedURL + " does not exist "); //$NON-NLS-1$ //$NON-NLS-2$
-			return false;
-		} else
-			return true;
-	}
-	/* (non-Javadoc)
-	 * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void endElement(String uri, String localName, String qName)
-			throws SAXException {
-		super.endElement(uri, localName, qName);
-		
-		// DEBUG:		
-		Utils.debug("End Element: uri:" + uri + " local Name:" + localName + " qName:" + qName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		try {
-
-			String tag = localName.trim();
-
-			if (tag.equalsIgnoreCase(CFG)) {
-				 // This is a bit of a hack.
-				 // When no features were added to the site, but the site is initialized from platform.xml 
-				 // we need to set the feature set to empty, so we don't try to detect them.
-				SiteEntry[] sites = config.getSites();
-				for (int i=0; i<sites.length; i++)
-					sites[i].initialized();
-				return;
-			}
-		} catch (Exception e) {
-			// silent ignore
-		}
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/FeatureEntry.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/FeatureEntry.java
deleted file mode 100644
index 8debb9d..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/FeatureEntry.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.net.*;
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.internal.configurator.branding.*;
-import org.osgi.framework.*;
-import org.w3c.dom.*;
-
-
-/**
- * 
- * Feature information
- */
-public class FeatureEntry
-		implements
-			IPlatformConfiguration.IFeatureEntry,
-			IConfigurationConstants,
-			IBundleGroup,
-			IBundleGroupConstants,
-			IProduct,
-			IProductConstants {
-	private String id;
-	private String version;
-	private String pluginVersion;
-	private String application;
-	private URL[] root;
-	private boolean primary;
-	private String pluginIdentifier;
-	private String url;
-	private String description;
-	private String licenseURL;
-	private ArrayList plugins;
-	private AboutInfo branding;
-	private SiteEntry site;
-	private ResourceBundle resourceBundle;
-	private boolean fullyParsed;
-
-	public FeatureEntry(String id, String version, String pluginIdentifier, String pluginVersion, boolean primary, String application, URL[] root) {
-		if (id == null)
-			throw new IllegalArgumentException();
-		this.id = id;
-		this.version = version;
-		this.pluginVersion = pluginVersion;
-		this.pluginIdentifier = pluginIdentifier;
-		this.primary = primary;
-		this.application = application;
-		this.root = (root == null ? new URL[0] : root);
-	}
-
-	public FeatureEntry( String id, String version, String pluginVersion, boolean primary, String application, URL[] root) {
-		this(id, version, id, pluginVersion, primary, application, root);
-	}
-
-	public void setSite(SiteEntry site) {
-		this.site = site;
-	}
-	
-	public SiteEntry getSite() {
-		return this.site;
-	}
-	
-	public void addPlugin(PluginEntry plugin) {
-		if (plugins == null)
-			plugins = new ArrayList();
-		plugins.add(plugin);
-	}
-	
-	public PluginEntry[] getPluginEntries() {
-		if (plugins == null)
-			fullParse();
-		return (PluginEntry[])plugins.toArray(new PluginEntry[plugins.size()]);
-	}
-	
-	/**
-	 * Sets the url string (relative to the site url)
-	 * @param url
-	 */
-	public void setURL(String url) {
-		this.url = url;
-	}
-	
-	/**
-	 * @return the feature url (relative to the site): features/org.eclipse.platform/
-	 */
-	public String getURL() {
-//		if (url == null)
-//			url = FEATURES + "/" + id + "_" + version + "/";
-		return url;
-	}
-	
-	/*
-	 * @see IFeatureEntry#getFeatureIdentifier()
-	 */
-	public String getFeatureIdentifier() {
-		return id;
-	}
-
-	/*
-	 * @see IFeatureEntry#getFeatureVersion()
-	 */
-	public String getFeatureVersion() {
-		return version;
-	}
-
-	/*
-	 * @see IFeatureEntry#getFeaturePluginVersion()
-	 */
-	public String getFeaturePluginVersion() {
-		return pluginVersion != null && pluginVersion.length() > 0 ? pluginVersion : null;
-	}
-
-	/*
-	 * @see IFeatureEntry#getFeaturePluginIdentifier()
-	 */
-	public String getFeaturePluginIdentifier() {
-		// if no plugin is specified, use the feature id
-		return pluginIdentifier != null && pluginIdentifier.length() > 0 ? pluginIdentifier : id;
-	}
-	
-	/*
-	 * @see IFeatureEntry#getFeatureApplication()
-	 */
-	public String getFeatureApplication() {
-		return application;
-	}
-
-	/*
-	 * @see IFeatureEntry#getFeatureRootURLs()
-	 */
-	public URL[] getFeatureRootURLs() {
-		return root;
-	}
-
-	/*
-	 * @see IFeatureEntry#canBePrimary()
-	 */
-	public boolean canBePrimary() {
-		return primary;
-	}
-
-	public Element toXML(Document doc) {
-	
-		Element featureElement = doc.createElement(CFG_FEATURE_ENTRY);		
-		// write out feature entry settings
-		if (id != null)
-			featureElement.setAttribute(CFG_FEATURE_ENTRY_ID, id); 
-		if (primary)
-			featureElement.setAttribute(CFG_FEATURE_ENTRY_PRIMARY, "true"); //$NON-NLS-1$
-		if (version != null)
-			featureElement.setAttribute(CFG_FEATURE_ENTRY_VERSION, version); 
-		if (pluginVersion != null && !pluginVersion.equals(version) && pluginVersion.length() > 0)
-			featureElement.setAttribute(CFG_FEATURE_ENTRY_PLUGIN_VERSION, pluginVersion); 
-		if (pluginIdentifier != null && !pluginIdentifier.equals(id) && pluginIdentifier.length() > 0)
-			featureElement.setAttribute(CFG_FEATURE_ENTRY_PLUGIN_IDENTIFIER, pluginIdentifier);
-		if (application != null)
-			featureElement.setAttribute(CFG_FEATURE_ENTRY_APPLICATION, application);
-		if (url != null)
-			featureElement.setAttribute(CFG_URL, url);
-		
-		URL[] roots = getFeatureRootURLs();
-		for (int i=0; i<roots.length; i++) {
-			String root = roots[i].toExternalForm();
-			if (root != null && root.trim().length() > 0){
-				Element rootElement = doc.createElement(CFG_FEATURE_ENTRY_ROOT);
-				rootElement.appendChild(doc.createTextNode(root));
-				featureElement.appendChild(rootElement);
-			}
-		}
-		
-		return featureElement;
-	}
-	
-	public void setDescription(String description) {
-		this.description = description;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IBundleGroup#getBundles()
-	 */
-	public Bundle[] getBundles() {
-		if (plugins == null)
-			fullParse();
-		
-		ArrayList bundles = new ArrayList(plugins.size());
-		for (int i=0; i<plugins.size(); i++) {
-			PluginEntry plugin = (PluginEntry)plugins.get(i);
-			// get the highest version for the plugin
-			Bundle bundle = Platform.getBundle(plugin.getPluginIdentifier());
-			if (bundle != null)
-				bundles.add(bundle);
-		}
-		return (Bundle[])bundles.toArray(new Bundle[bundles.size()]);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IBundleGroup#getDescription()
-	 */
-	public String getDescription() {
-		if (description == null)
-			fullParse();
-		return description;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IBundleGroup#getIdentifier()
-	 */
-	public String getIdentifier() {
-		return id;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IBundleGroup#getName()
-	 */
-	public String getName() {
-		if (branding == null)
-			branding = AboutInfo.readFeatureInfo(id, version, getFeaturePluginIdentifier());
-		return branding.getProductName();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IBundleGroup#getProperty(java.lang.String)
-	 */
-	public String getProperty(String key) {
-		if (key == null)
-			return null;
-		
-		if (branding == null)
-			branding = AboutInfo.readFeatureInfo(id, version, getFeaturePluginIdentifier());
-		
-		// IBundleGroupConstants
-		if (key.equals(FEATURE_IMAGE))
-			return branding.getFeatureImageURL() == null ? null : branding.getFeatureImageURL().toExternalForm();
-		else if (key.equals(TIPS_AND_TRICKS_HREF)) 
-			return branding.getTipsAndTricksHref();
-		else if (key.equals(IBundleGroupConstants.WELCOME_PAGE)) // same value is used by product and bundle group
-			return branding.getWelcomePageURL() == null ? null : branding.getWelcomePageURL().toExternalForm();
-		else if (key.equals(WELCOME_PERSPECTIVE))
-			return branding.getWelcomePerspectiveId();
-		// IProductConstants
-		else if (key.equals(APP_NAME)) 
-			return branding.getAppName();
-		else if (key.equals(ABOUT_TEXT))
-			return branding.getAboutText();
-		else if (key.equals(ABOUT_IMAGE))
-			return branding.getAboutImageURL() == null ? null : branding.getAboutImageURL().toExternalForm();
-		else if (key.equals(WINDOW_IMAGE))
-			return branding.getWindowImageURL()== null ? null : branding.getWindowImageURL().toExternalForm();
-		else if (key.equals(WINDOW_IMAGES)) {
-			URL[] urls = branding.getWindowImagesURLs();
-			if (urls == null)
-				return null;
-			StringBuffer windowImagesURLs = new StringBuffer();
-			for (int i=0; i<urls.length; i++){
-				windowImagesURLs.append(urls[i].toExternalForm());
-				if (i != urls.length-1)
-					windowImagesURLs.append(',');
-			}
-			return windowImagesURLs.toString();
-		} else if (key.equals(LICENSE_HREF))
-			return getLicenseURL();
-		
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IBundleGroup#getProviderName()
-	 */
-	public String getProviderName() {
-		if (branding == null)
-			branding = AboutInfo.readFeatureInfo(id, version, getFeaturePluginIdentifier());
-		return branding.getProviderName();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IBundleGroup#getVersion()
-	 */
-	public String getVersion() {
-		return version;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProduct#getApplication()
-	 */
-	public String getApplication() {
-		return application;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProduct#getId()
-	 */
-	public String getId() {
-		return id;
-	}
-	
-	public ResourceBundle getResourceBundle(){
-		if (resourceBundle != null)
-			return resourceBundle;
-		
-		// Determine the properties file location
-		if (site == null)
-			return null;
-		
-		ResourceBundle bundle = null;
-		try {
-			URL propertiesURL = new URL(site.getResolvedURL(), getURL());
-			ClassLoader l = new URLClassLoader(new URL[] { propertiesURL }, null);
-			bundle = ResourceBundle.getBundle(IConfigurationConstants.CFG_FEATURE_ENTRY, Utils.getDefaultLocale(), l);
-		} catch (MissingResourceException e) {
-			Utils.log(e.getLocalizedMessage()); 
-		} catch (MalformedURLException e) {
-			Utils.log(e.getLocalizedMessage()); 
-		}
-		return bundle;
-	}
-	
-	public void setLicenseURL(String licenseURL) {
-		this.licenseURL = licenseURL;
-	}
-	
-	public String getLicenseURL() {
-		if (licenseURL == null)
-			fullParse();
-		if (licenseURL == null)
-			return null;
-		
-		String resolvedURL = Utils.getResourceString(getResourceBundle(), licenseURL);
-		if (resolvedURL.startsWith("http://")) //$NON-NLS-1$
-			return resolvedURL;
-		else {
-			try {
-				return new URL(getSite().getResolvedURL(), getURL() + resolvedURL).toExternalForm();
-			} catch (MalformedURLException e) {
-				return resolvedURL;
-			}
-		}
-	}
-	
-	private void fullParse() {
-		if (fullyParsed)
-			return;
-		fullyParsed = true;
-		if (plugins == null) 
-			plugins = new ArrayList();
-		FullFeatureParser parser = new FullFeatureParser(this);
-		parser.parse();
-	}
-	
-	public Bundle getDefiningBundle() {
-		return Platform.getBundle(getFeaturePluginIdentifier());
-	}
-	
-	public boolean hasBranding() {
-        String bundleId = getFeaturePluginIdentifier();
-		return bundleId != null && Platform.getBundle(bundleId) != null;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/FeatureParser.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/FeatureParser.java
deleted file mode 100644
index 86429de..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/FeatureParser.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-
-import java.io.*;
-import java.net.*;
-
-import javax.xml.parsers.*;
-
-import org.xml.sax.*;
-import org.xml.sax.helpers.*;
-
-/**
- * Default feature parser.
- * Parses the feature manifest file as defined by the platform.
- * 
- * @since 3.0
- */
-public class FeatureParser extends DefaultHandler {
-
-	private SAXParser parser;
-	private FeatureEntry feature;
-	private URL url;
-
-	private final static SAXParserFactory parserFactory =
-		SAXParserFactory.newInstance();
-
-	/**
-	 * Constructs a feature parser.
-	 */
-	public FeatureParser() {
-		super();
-		try {
-			parserFactory.setNamespaceAware(true);
-			this.parser = parserFactory.newSAXParser();
-		} catch (ParserConfigurationException e) {
-			System.out.println(e);
-		} catch (SAXException e) {
-			System.out.println(e);
-		}
-	}
-	/**
-	 * Parses the specified url and constructs a feature
-	 */
-	public FeatureEntry parse(URL featureURL){
-		feature=null;
-		InputStream in = null;
-		try {
-			this.url = featureURL;
-			in = featureURL.openStream();
-			parser.parse(new InputSource(in), this);
-		} catch (SAXException e) {;
-		} catch (IOException e) {
-		} finally {
-			if (in != null)
-				try {
-					in.close();
-				} catch (IOException e1) {
-					Utils.log(e1.getLocalizedMessage());
-				}
-		}
-		return feature;
-	}
-
-	/**
-	 * Handle start of element tags
-	 * @see DefaultHandler#startElement(String, String, String, Attributes)
-	 * @since 2.0
-	 */
-	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-
-		Utils.debug("Start Element: uri:" + uri + " local Name:" + localName + " qName:" + qName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-		if ("feature".equals(localName)) { //$NON-NLS-1$
-			processFeature(attributes);
-			// stop parsing now
-			throw new SAXException(""); //$NON-NLS-1$
-		} else {
-		}
-		
-	}
-
-	/*
-	 * Process feature information
-	 */
-	private void processFeature(Attributes attributes) {
-
-		// identifier and version
-		String id = attributes.getValue("id"); //$NON-NLS-1$
-		String ver = attributes.getValue("version"); //$NON-NLS-1$
-
-		if (id == null || id.trim().equals("") //$NON-NLS-1$
-		|| ver == null || ver.trim().equals("")) { //$NON-NLS-1$
-			System.out.println(Messages.getString("FeatureParser.IdOrVersionInvalid", new String[] { id, ver})); //$NON-NLS-1$
-		} else {
-//			String label = attributes.getValue("label"); //$NON-NLS-1$
-//			String provider = attributes.getValue("provider-name"); //$NON-NLS-1$
-//			String imageURL = attributes.getValue("image"); //$NON-NLS-1$
-			String os = attributes.getValue("os"); //$NON-NLS-1$
-			String ws = attributes.getValue("ws"); //$NON-NLS-1$
-			String nl = attributes.getValue("nl"); //$NON-NLS-1$
-			String arch = attributes.getValue("arch"); //$NON-NLS-1$
-			if (!Utils.isValidEnvironment(os, ws, arch, nl)) 
-				return;
-//			String exclusive = attributes.getValue("exclusive"); //$NON-NLS-1$
-//			String affinity = attributes.getValue("colocation-affinity"); //$NON-NLS-1$
-
-			String primary = attributes.getValue("primary"); //$NON-NLS-1$
-			boolean isPrimary = "true".equals(primary); //$NON-NLS-1$
-			String application = attributes.getValue("application"); //$NON-NLS-1$
-			String plugin = attributes.getValue("plugin"); //$NON-NLS-1$
-
-			//TODO rootURLs
-			feature = new FeatureEntry(id, ver, plugin, "", isPrimary, application, null ); //$NON-NLS-1$
-			if ("file".equals(url.getProtocol())) { //$NON-NLS-1$
-				File f = new File(url.getFile().replace('/', File.separatorChar));
-				feature.setURL("features" + "/" + f.getParentFile().getName() + "/");// + f.getName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			} else {
-				feature.setURL(url.toExternalForm());
-			}
-
-			Utils.
-				debug("End process DefaultFeature tag: id:" +id + " ver:" +ver + " url:" + feature.getURL()); 	 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/FullFeatureParser.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/FullFeatureParser.java
deleted file mode 100644
index 69e14e1..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/FullFeatureParser.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-
-import javax.xml.parsers.*;
-
-import org.xml.sax.*;
-import org.xml.sax.helpers.*;
-
-/**
- * A more complete feature parser. It adds the plugins listed to the feature.
- */
-public class FullFeatureParser extends DefaultHandler implements IConfigurationConstants{
-
-	private SAXParser parser;
-	private FeatureEntry feature;
-	private URL url;
-	private boolean isDescription;
-	private StringBuffer description = new StringBuffer();
-
-	private final static SAXParserFactory parserFactory =
-		SAXParserFactory.newInstance();
-
-	/**
-	 * Constructs a feature parser.
-	 */
-	public FullFeatureParser(FeatureEntry feature) {
-		super();
-		this.feature = feature;
-		try {
-			parserFactory.setNamespaceAware(true);
-			this.parser = parserFactory.newSAXParser();
-		} catch (ParserConfigurationException e) {
-			System.out.println(e);
-		} catch (SAXException e) {
-			System.out.println(e);
-		}
-	}
-	/**
-	 */
-	public void parse(){
-		InputStream in = null;
-		try {
-			if (feature.getSite() == null)
-				return;
-			this.url = new URL(feature.getSite().getResolvedURL(), feature.getURL() + FEATURE_XML);
-			in = url.openStream();
-			parser.parse(new InputSource(in), this);
-		} catch (SAXException e) {;
-		} catch (IOException e) {
-		} finally {
-			if (in != null)
-				try {
-					in.close();
-				} catch (IOException e1) {
-					Utils.log(e1.getLocalizedMessage());
-				}
-		}
-	}
-
-	/**
-	 * Handle start of element tags
-	 * @see DefaultHandler#startElement(String, String, String, Attributes)
-	 * @since 2.0
-	 */
-	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-
-		Utils.debug("Start Element: uri:" + uri + " local Name:" + localName + " qName:" + qName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-		if ("plugin".equals(localName)) { //$NON-NLS-1$
-			processPlugin(attributes);
-		} else if ("description".equals(localName)){ //$NON-NLS-1$
-			isDescription = true;
-		} else if ("license".equals(localName)) { //$NON-NLS-1$
-			processLicense(attributes);
-		}
-	}
-
-	/*
-	 * Process feature information
-	 */
-	private void processPlugin(Attributes attributes) {
-
-		// identifier and version
-		String id = attributes.getValue("id"); //$NON-NLS-1$
-		String ver = attributes.getValue("version"); //$NON-NLS-1$
-
-		if (id == null || id.trim().equals("") //$NON-NLS-1$
-		|| ver == null || ver.trim().equals("")) { //$NON-NLS-1$
-			System.out.println(Messages.getString("FeatureParser.IdOrVersionInvalid", new String[] { id, ver})); //$NON-NLS-1$
-		} else {
-//			String label = attributes.getValue("label"); //$NON-NLS-1$
-//			String provider = attributes.getValue("provider-name"); //$NON-NLS-1$
-			String nl = attributes.getValue("nl"); //$NON-NLS-1$
-			String os = attributes.getValue("os"); //$NON-NLS-1$
-			String ws = attributes.getValue("ws"); //$NON-NLS-1$
-			String arch = attributes.getValue("arch"); //$NON-NLS-1$
-			if (!Utils.isValidEnvironment(os, ws, arch,nl))
-				return;
-
-			PluginEntry plugin = new PluginEntry();
-			plugin.setPluginIdentifier(id);
-			plugin.setPluginVersion(ver);
-			feature.addPlugin(plugin);
-			
-			Utils.
-				debug("End process DefaultFeature tag: id:" +id + " ver:" +ver + " url:" + feature.getURL()); 	 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-	}
-	
-	private void processLicense(Attributes attributes ){
-		feature.setLicenseURL(attributes.getValue("url")); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.xml.sax.ContentHandler#characters(char[], int, int)
-	 */
-	public void characters(char[] ch, int start, int length)
-			throws SAXException {
-		if (!isDescription)
-			return;
-		description.append(ch, start, length);
-	}
-	/* (non-Javadoc)
-	 * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public void endElement(String uri, String localName, String qName)
-			throws SAXException {
-		if ("description".equals(localName)) { //$NON-NLS-1$
-			isDescription = false;
-			String d = description.toString().trim();
-			ResourceBundle bundle = feature.getResourceBundle();
-			feature.setDescription(Utils.getResourceString(bundle, d));
-		}
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/IConfigurationConstants.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/IConfigurationConstants.java
deleted file mode 100644
index b75c9d2..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/IConfigurationConstants.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import org.eclipse.update.configurator.IPlatformConfiguration.*;
-
-/**
- * Constants
- */
-public interface IConfigurationConstants {
-	public static final String ECLIPSE_PRODUCT = "eclipse.product"; //$NON-NLS-1$
-	public static final String ECLIPSE_APPLICATION = "eclipse.application"; //$NON-NLS-1$
-	public static final String CFG = "config"; //$NON-NLS-1$
-	public static final String CFG_BOOT_PLUGIN = "bootstrap"; //$NON-NLS-1$
-	public static final String CFG_SITE = "site"; //$NON-NLS-1$
-	public static final String CFG_URL = "url"; //$NON-NLS-1$
-	public static final String CFG_POLICY = "policy"; //$NON-NLS-1$
-	public static final String[] CFG_POLICY_TYPE = { "USER-INCLUDE", "USER-EXCLUDE", "MANAGED-ONLY" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	public static final String CFG_POLICY_TYPE_UNKNOWN = "UNKNOWN"; //$NON-NLS-1$
-	public static final String CFG_LIST = "list"; //$NON-NLS-1$
-	public static final String CFG_STAMP = "stamp"; //$NON-NLS-1$
-	public static final String CFG_FEATURE_STAMP = "stamp.features"; //$NON-NLS-1$
-	public static final String CFG_PLUGIN_STAMP = "stamp.plugins"; //$NON-NLS-1$
-	public static final String CFG_UPDATEABLE = "updateable"; //$NON-NLS-1$
-	public static final String CFG_LINK_FILE = "linkfile"; //$NON-NLS-1$
-	public static final String CFG_FEATURE_ENTRY = "feature"; //$NON-NLS-1$
-	public static final String CFG_FEATURE_ENTRY_ID = "id"; //$NON-NLS-1$
-	public static final String CFG_FEATURE_ENTRY_PRIMARY = "primary"; //$NON-NLS-1$
-	public static final String CFG_FEATURE_ENTRY_VERSION = "version"; //$NON-NLS-1$
-	public static final String CFG_FEATURE_ENTRY_PLUGIN_VERSION = "plugin-version"; //$NON-NLS-1$
-	public static final String CFG_FEATURE_ENTRY_PLUGIN_IDENTIFIER = "plugin-identifier"; //$NON-NLS-1$
-	public static final String CFG_FEATURE_ENTRY_APPLICATION = "application"; //$NON-NLS-1$
-	public static final String CFG_FEATURE_ENTRY_ROOT = "root"; //$NON-NLS-1$
-	public static final String CFG_DATE = "date"; //$NON-NLS-1$
-	public static final String CFG_PLUGIN = "plugin"; //$NON-NLS-1$
-	public static final String CFG_FRAGMENT = "fragment"; //$NON-NLS-1$
-	public static final String CFG_ENABLED = "enabled"; //$NON-NLS-1$
-	public static final String CFG_SHARED_URL = "shared_ur"; //$NON-NLS-1$
-	
-
-	public static final String CFG_VERSION = "version"; //$NON-NLS-1$
-	public static final String CFG_TRANSIENT = "transient"; //$NON-NLS-1$
-	public static final String VERSION = "3.0"; //$NON-NLS-1$
-//	public static final String EOF = "eof"; //$NON-NLS-1$
-	public static final int CFG_LIST_LENGTH = 10;
-
-	public static final int DEFAULT_POLICY_TYPE = ISitePolicy.USER_EXCLUDE;
-	public static final String[] DEFAULT_POLICY_LIST = new String[0];
-	
-	public static final String PLUGINS = "plugins"; //$NON-NLS-1$
-	public static final String FEATURES = "features"; //$NON-NLS-1$
-	public static final String PLUGIN_XML = "plugin.xml"; //$NON-NLS-1$
-	public static final String FRAGMENT_XML = "fragment.xml"; //$NON-NLS-1$
-	public static final String META_MANIFEST_MF = "META-INF/MANIFEST.MF"; //$NON-NLS-1$
-	public static final String FEATURE_XML = "feature.xml"; //$NON-NLS-1$
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Locker.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Locker.java
deleted file mode 100644
index 4752fef..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Locker.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.io.IOException;
-
-/**
- * Internal class.
- */
-public interface Locker {
-	public boolean lock() throws IOException;
-	public void release();
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Locker_JavaIo.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Locker_JavaIo.java
deleted file mode 100644
index 28b1fef..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Locker_JavaIo.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.io.*;
-
-/**
- * Internal class.
- */
-public class Locker_JavaIo implements Locker {
-	private File lockFile;
-	private RandomAccessFile lockRAF;
-
-	public Locker_JavaIo(File lockFile) {
-		this.lockFile = lockFile;
-	}
-
-	public synchronized boolean lock() throws IOException {
-		//if the lock file already exists, try to delete,
-		//assume failure means another eclipse has it open
-		if (lockFile.exists())
-			lockFile.delete();
-		if (lockFile.exists())
-			return false;
-
-		//open the lock file so other instances can't co-exist
-		lockRAF = new RandomAccessFile(lockFile, "rw"); //$NON-NLS-1$
-		lockRAF.writeByte(0);
-
-		return true;
-	}
-
-	public synchronized void release() {
-		try {
-			if (lockRAF != null) {
-				lockRAF.close();
-				lockRAF = null;
-			}
-		} catch (IOException e) {
-			//don't complain, we're making a best effort to clean up
-		}
-		if (lockFile != null)
-			lockFile.delete();
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Locker_JavaNio.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Locker_JavaNio.java
deleted file mode 100644
index c7d8a6c..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Locker_JavaNio.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.io.*;
-import java.nio.channels.FileLock;
-
-/**
- * Internal class.
- */
-public class Locker_JavaNio implements Locker {
-	private File lockFile;
-	private FileLock fileLock;
-
-	public Locker_JavaNio(File lockFile) {
-		this.lockFile = lockFile;
-	}
-
-	public synchronized boolean lock() throws IOException {
-		RandomAccessFile raf = new RandomAccessFile(lockFile, "rw"); //$NON-NLS-1$
-		fileLock = raf.getChannel().lock();
-		
-		if (fileLock != null)
-			return true;
-		return false;
-	}
-
-	public synchronized void release() {
-		if (fileLock != null) {
-			try {
-				fileLock.release();
-			} catch (IOException e) {
-				//don't complain, we're making a best effort to clean up
-			}
-			fileLock = null;
-		}
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Messages.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Messages.java
deleted file mode 100644
index 211c181..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Messages.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.text.MessageFormat;
-import java.util.*;
-
-public class Messages {
-	private static String bundleName = "org.eclipse.update.internal.configurator.messages"; //$NON-NLS-1$
-	private static ResourceBundle bundle = ResourceBundle.getBundle(bundleName, Locale.getDefault());
-
-	/**
-	 * Lookup the message with the given ID in this catalog 
-	 */
-	public static String getString(String id) {
-		return getString(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 getString(String id, String binding) {
-		return getString(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 getString(String id, String binding1, String binding2) {
-		return getString(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 getString(String id, String[] bindings) {
-		if (id == null)
-			return "No message available"; //$NON-NLS-1$
-		String message = null;
-		try {
-			message = bundle.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);
-	}
-	/**
-	 * 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()).toString() + " - " + message; //$NON-NLS-1$
-		System.out.println(message);
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PlatformConfiguration.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PlatformConfiguration.java
deleted file mode 100644
index 20313a5..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PlatformConfiguration.java
+++ /dev/null
@@ -1,1182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.io.*;
-import java.lang.reflect.*;
-import java.net.*;
-//PAL nio optional
-//import java.nio.channels.*;
-import java.util.*;
-
-import javax.xml.parsers.*;
-//PAL cdcFoundation
-//import javax.xml.transform.*;
-//import javax.xml.transform.dom.*;
-//import javax.xml.transform.stream.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.service.datalocation.*;
-import org.eclipse.update.configurator.*;
-import org.w3c.dom.*;
-
-/**
- * This class is responsible for providing the features and plugins (bundles) to 
- * the runtime. Configuration data is stored in the configuration/org.eclipse.update/platform.xml file.
- * When eclipse starts, it tries to load the config info from platform.xml.
- * If the file does not exist, then it also tries to read it from a temp or backup file.
- * If this does not succeed, a platform.xml is created by inspecting the eclipse 
- * installation directory (its features and plugin folders).
- * If platform.xml already exists, a check is made to see when it was last modified
- * and whether there are any file system changes that are newer (users may manually unzip 
- * features and plugins). In this case, the newly added features and plugins are picked up.
- * A check for existence of features and plugins is also performed, to detect deletions.
- */
-public class PlatformConfiguration implements IPlatformConfiguration, IConfigurationConstants {
-
-	private static PlatformConfiguration currentPlatformConfiguration = null;
-	private static final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-//	private static final TransformerFactory transformerFactory = TransformerFactory.newInstance();
-	private static final String XML_ENCODING = "UTF-8";
-
-	private Configuration config;
-	private URL configLocation;
-	private HashMap externalLinkSites; // used to restore prior link site state
-	private long changeStamp;
-	private long featuresChangeStamp;
-	private boolean featuresChangeStampIsValid;
-	private long pluginsChangeStamp;
-	private boolean pluginsChangeStampIsValid;
-	//PAL nio optional
-	//private FileLock lock;
-	private Locker lock = null;
-	private static boolean checkNio = false;
-	private static boolean useNio;
-
-	private static final String ECLIPSE = "eclipse"; //$NON-NLS-1$
-	private static final String CONFIG_HISTORY = "history"; //$NON-NLS-1$
-	private static final String PLATFORM_XML = "platform.xml"; //$NON-NLS-1$
-	private static final String CONFIG_NAME = ConfigurationActivator.NAME_SPACE + "/" + PLATFORM_XML; //$NON-NLS-1$
-	private static final String CONFIG_INI = "config.ini"; //NON-NLS-1$ //$NON-NLS-1$
-	private static final String CONFIG_FILE_LOCK_SUFFIX = ".lock"; //$NON-NLS-1$
-	private static final String CONFIG_FILE_TEMP_SUFFIX = ".tmp"; //$NON-NLS-1$
-	private static final String LINKS = "links"; //$NON-NLS-1$
-	private static final String[] BOOTSTRAP_PLUGINS = {}; //$NON-NLS-1$
-
-	private static final String DEFAULT_FEATURE_APPLICATION = "org.eclipse.ui.ide.workbench"; //$NON-NLS-1$
-
-	private static final String LINK_PATH = "path"; //$NON-NLS-1$
-	private static final String LINK_READ = "r"; //$NON-NLS-1$
-	private static final String LINK_READ_WRITE = "rw"; //$NON-NLS-1$
-	private static URL installURL;
-	
-	private PlatformConfiguration(Location platformConfigLocation) throws CoreException, IOException {
-
-		this.externalLinkSites = new HashMap();
-		this.config = null;
-		
-		// initialize configuration
-		initializeCurrent(platformConfigLocation);
-
-		// Detect external links. These are "soft link" to additional sites. The link
-		// files are usually provided by external installation programs. They are located
-		// relative to this configuration URL.
-		// Note: don't do it for self hosting
-		if (!isTransient())
-			configureExternalLinks();
-
-		// Validate sites in the configuration. Causes any sites that do not exist to
-		// be removed from the configuration
-		validateSites();
-
-		// compute differences between configuration and actual content of the sites
-		// (base sites and link sites)
-		// Note: when the config is transient (generated by PDE, etc.) we don't reconcile
-		if (isTransient())
-			return;
-		
-		changeStamp = computeChangeStamp();
-		if (changeStamp > config.getDate().getTime())
-			reconcile();
-	}
-
-	PlatformConfiguration(URL url) throws Exception {
-		this.externalLinkSites = new HashMap();
-		initialize(url);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#createSiteEntry(URL, ISitePolicy)
-	 */
-	public ISiteEntry createSiteEntry(URL url, ISitePolicy policy) {
-		return new SiteEntry(url, policy);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#createSitePolicy(int, String[])
-	 */
-	public ISitePolicy createSitePolicy(int type, String[] list) {
-		return new SitePolicy(type, list);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#createFeatureEntry(String, String, String, boolean, String, URL)
-	 */
-	public IFeatureEntry createFeatureEntry(String id, String version, String pluginVersion, boolean primary, String application, URL[] root) {
-		return new FeatureEntry(id, version, pluginVersion, primary, application, root);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#createFeatureEntry(String, String, String,
-	 * String, boolean, String, URL)
-	 */
-	public IFeatureEntry createFeatureEntry(String id, String version, String pluginIdentifier, String pluginVersion, boolean primary, String application, URL[] root) {
-		return new FeatureEntry(id, version, pluginIdentifier, pluginVersion, primary, application, root);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#configureSite(ISiteEntry)
-	 */
-	public void configureSite(ISiteEntry entry) {
-		configureSite(entry, false);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#configureSite(ISiteEntry, boolean)
-	 */
-	public synchronized void configureSite(ISiteEntry entry, boolean replace) {
-
-		if (entry == null)
-			return;
-	
-		URL url = entry.getURL();
-		if (url == null)
-			return;
-
-		String key = url.toExternalForm();
-		if (config.getSiteEntry(key) != null && !replace)
-			return;
-	
-		if (entry instanceof SiteEntry)
-			config.addSiteEntry(key, (SiteEntry)entry);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#unconfigureSite(ISiteEntry)
-	 */
-	public synchronized void unconfigureSite(ISiteEntry entry) {
-		if (entry == null)
-			return;
-
-		URL url = entry.getURL();
-		if (url == null)
-			return;
-		
-		String key = url.toExternalForm();	
-		if (entry instanceof SiteEntry)
-			config.removeSiteEntry(key);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#getConfiguredSites()
-	 */
-	public ISiteEntry[] getConfiguredSites() {
-		if (config == null)
-			return new ISiteEntry[0];
-		
-		SiteEntry[] sites = config.getSites();
-		ArrayList enabledSites = new ArrayList(sites.length);
-		for (int i=0; i<sites.length; i++) {
-			if (sites[i].isEnabled())
-				enabledSites.add(sites[i]);
-		}
-		return (ISiteEntry[])enabledSites.toArray(new ISiteEntry[enabledSites.size()]);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#findConfiguredSite(URL)
-	 */
-	public ISiteEntry findConfiguredSite(URL url) {
-		return findConfiguredSite(url, true);
-	}
-	
-	/**
-	 * 
-	 * @param url site url
-	 * @param checkPlatformURL if true, check for url format that is platform:/...
-	 * @return
-	 */
-	public SiteEntry findConfiguredSite(URL url, boolean checkPlatformURL) {
-		if (url == null)
-			return null;
-		String key = url.toExternalForm();
-
-		SiteEntry result = config.getSiteEntry(key);	
-		if (result == null) { // retry with decoded URL string
-			try {
-				//PAL foundation
-				//key = URLDecoder.decode(key, "UTF-8"); //$NON-NLS-1$
-				key = UpdateURLDecoder.decode(key, "UTF-8"); //$NON-NLS-1$
-			} catch (UnsupportedEncodingException e) {
-				// ignore
-			}
-			result = config.getSiteEntry(key);
-		}
-			
-		if (result == null && checkPlatformURL) {
-			try {
-				result = findConfiguredSite(Utils.asPlatformURL(url), false);
-			} catch (Exception e) {
-				//ignore
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * @see IPlatformConfiguration#configureFeatureEntry(IFeatureEntry)
-	 */
-	public synchronized void configureFeatureEntry(IFeatureEntry entry) {
-		if (entry == null)
-			return;
-
-		String key = entry.getFeatureIdentifier();
-		if (key == null)
-			return;
-
-		// we should check each site and find where the feature is
-		// located and then configure it
-		if (config == null)
-			config = new Configuration();
-
-		SiteEntry[] sites = config.getSites();
-		for (int i=0; i<sites.length; i++) {
-			// find out what site contains the feature and configure it
-			try {
-				URL url = new URL(sites[i].getURL(), FEATURES + "/" + entry.getFeatureIdentifier()+ "_" + entry.getFeatureVersion() + "/"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				if (new File(url.getFile()).exists())
-					sites[i].addFeatureEntry(entry);
-				else  {
-					url = new URL(sites[i].getURL(), FEATURES + "/" + entry.getFeatureIdentifier() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
-					if (new File(url.getFile()).exists())
-						sites[i].addFeatureEntry(entry);
-				}
-			} catch (MalformedURLException e) {
-			}
-		}
-	}
-
-	/*
-	 * @see IPlatformConfiguration#unconfigureFeatureEntry(IFeatureEntry)
-	 */
-	public synchronized void unconfigureFeatureEntry(IFeatureEntry entry) {
-		if (entry == null)
-			return;
-
-		String key = entry.getFeatureIdentifier();
-		if (key == null)
-			return;
-
-		config.unconfigureFeatureEntry(entry);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#getConfiguredFeatureEntries()
-	 */
-	public IFeatureEntry[] getConfiguredFeatureEntries() {
-		ArrayList configFeatures = new ArrayList();
-		SiteEntry[] sites = config.getSites();
-		for (int i=0; i<sites.length; i++) {
-			FeatureEntry[] features = sites[i].getFeatureEntries();
-			for (int j=0; j<features.length; j++)
-				configFeatures.add(features[j]);
-		}
-		return (IFeatureEntry[])configFeatures.toArray(new FeatureEntry[configFeatures.size()]);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#findConfiguredFeatureEntry(String)
-	 */
-	public IFeatureEntry findConfiguredFeatureEntry(String id) {
-		if (id == null)
-			return null;
-
-		SiteEntry[] sites = config.getSites();
-		for (int i=0; i<sites.length; i++) {
-			FeatureEntry f = sites[i].getFeatureEntry(id);
-			if (f != null)
-				return f;
-		}
-		return null;
-	}
-
-	/*
-	 * @see IPlatformConfiguration#getConfigurationLocation()
-	 */
-	public URL getConfigurationLocation() {
-		return configLocation;
-	}
-
-	/*
-	 * @see IPlatformConfiguration#getChangeStamp()
-	 */
-	public long getChangeStamp() {
-		if (config.getLinkedConfig() == null)
-			return config.getDate().getTime();
-		else
-			return Math.max(config.getDate().getTime(), config.getLinkedConfig().getDate().getTime());
-	}
-
-	/*
-	 * @see IPlatformConfiguration#getFeaturesChangeStamp()
-	 * @deprecated Don't use this method
-	 */
-	public long getFeaturesChangeStamp() {
-		return 0;
-	}
-
-	/*
-	 * @see IPlatformConfiguration#getPluginsChangeStamp()
-	 * @deprecated Don't use this method
-	 */
-	public long getPluginsChangeStamp() {
-		return 0;
-	}
-
-
-	public String getApplicationIdentifier() {
-		// Return the app if defined in system properties
-		String application = System.getProperty(ECLIPSE_APPLICATION);
-		if (application != null)
-			return application;
-
-		// Otherwise, try to get it from the primary feature (aka product)
-		String feature = getPrimaryFeatureIdentifier();
-
-		// lookup application for feature (specified or defaulted)
-		if (feature != null) {
-			IFeatureEntry fe = findConfiguredFeatureEntry(feature);
-			if (fe != null) {
-				if (fe.getFeatureApplication() != null)
-					return fe.getFeatureApplication();
-			}
-		}
-
-		// return hardcoded default if we failed
-		return DEFAULT_FEATURE_APPLICATION;
-	}
-
-	/*
-	 * @see IPlatformConfiguration#getPrimaryFeatureIdentifier()
-	 */
-	public String getPrimaryFeatureIdentifier() {
-		// Return the product if defined in system properties
-		String primaryFeatureId = System.getProperty(ECLIPSE_PRODUCT);
-		if (primaryFeatureId != null) {
-			// check if feature exists
-			IFeatureEntry feature = findConfiguredFeatureEntry(primaryFeatureId);
-			if (feature != null && feature.canBePrimary())
-				return primaryFeatureId;
-		}
-		return null;
-	}
-
-	/*
-	 * @see IPlatformConfiguration#getPluginPath()
-	 */
-	public URL[] getPluginPath() {
-		ArrayList path = new ArrayList();
-		Utils.debug("computed plug-in path:"); //$NON-NLS-1$
-
-		ISiteEntry[] sites = getConfiguredSites();
-		URL pathURL;
-		for (int i = 0; i < sites.length; i++) {
-			String[] plugins = sites[i].getPlugins();
-			for (int j = 0; j < plugins.length; j++) {
-				try {
-					pathURL = new URL(((SiteEntry) sites[i]).getResolvedURL(), plugins[j]);
-					path.add(pathURL);
-					Utils.debug("   " + pathURL.toString()); //$NON-NLS-1$
-				} catch (MalformedURLException e) {
-					// skip entry ...
-					Utils.debug("   bad URL: " + e); //$NON-NLS-1$
-				}
-			}
-		}
-		return (URL[]) path.toArray(new URL[0]);
-	}
-	
-
-	/*
-	 * A variation of the getPluginPath, but it returns the actual plugin entries
-	 */
-	public PluginEntry[] getPlugins() {
-		ArrayList allPlugins = new ArrayList();
-		Utils.debug("computed plug-ins:"); //$NON-NLS-1$
-
-		ISiteEntry[] sites = getConfiguredSites();
-		for (int i = 0; i < sites.length; i++) {
-			if (!(sites[i] instanceof SiteEntry)) {
-				Utils.debug("Site " + sites[i].getURL() + " is not a SiteEntry"); //$NON-NLS-1$ //$NON-NLS-2$
-				continue;
-			}
-			PluginEntry[] plugins = ((SiteEntry)sites[i]).getPluginEntries();
-			for (int j = 0; j < plugins.length; j++) {
-				allPlugins.add(plugins[j]);
-				Utils.debug("   " + plugins[j].getURL()); //$NON-NLS-1$
-			}
-		}
-		return (PluginEntry[]) allPlugins.toArray(new PluginEntry[0]);
-	}
-	
-
-	/*
-	 * @see IPlatformConfiguration#getBootstrapPluginIdentifiers()
-	 */
-	public String[] getBootstrapPluginIdentifiers() {
-		return BOOTSTRAP_PLUGINS;
-	}
-
-	/*
-	 * @see IPlatformConfiguration#setBootstrapPluginLocation(String, URL)
-	 */
-	public void setBootstrapPluginLocation(String id, URL location) {
-	}
-
-	/*
-	 * @see IPlatformConfiguration#isUpdateable()
-	 */
-	public boolean isUpdateable() {
-		return true;
-	}
-
-	/*
-	 * @see IPlatformConfiguration#isTransient()
-	 */
-	public boolean isTransient() {
-		if (config != null)
-			return config.isTransient();
-		else
-			return false;
-	}
-
-	/*
-	 * @see IPlatformConfiguration#isTransient(boolean)
-	 */
-	public void isTransient(boolean value) {
-		if (this != getCurrent() && config != null)
-			config.setTransient(value);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#refresh()
-	 */
-	public synchronized void refresh() {
-		// Reset computed values. Will be lazily refreshed
-		// on next access
-		ISiteEntry[] sites = getConfiguredSites();
-		for (int i = 0; i < sites.length; i++) {
-			// reset site entry
-			 ((SiteEntry) sites[i]).refresh();
-		}
-	}
-
-	/*
-	 * @see IPlatformConfiguration#save()
-	 */
-	public void save() throws IOException {
-		if (isUpdateable())
-			save(configLocation);
-	}
-
-	/*
-	 * @see IPlatformConfiguration#save(URL)
-	 */
-	public synchronized void save(URL url) throws IOException {
-		if (url == null)
-			throw new IOException(Messages.getString("cfig.unableToSave.noURL")); //$NON-NLS-1$
-
-		OutputStream os = null;
-		if (!url.getProtocol().equals("file")) { //$NON-NLS-1$
-			// not a file protocol - attempt to save to the URL
-			URLConnection uc = url.openConnection();
-			uc.setDoOutput(true);
-			os = uc.getOutputStream();
-			try {
-				saveAsXML(os);
-				config.setDirty(false);
-			} catch (CoreException e) {
-				Utils.log(e.getMessage());
-				Utils.log(e.getStatus());
-				throw new IOException(Messages.getString("cfig.unableToSave", url.toExternalForm())); //$NON-NLS-1$
-			} finally {
-				os.close();
-			}
-		} else {
-			// file protocol - do safe i/o
-			File cfigFile = new File(url.getFile().replace('/', File.separatorChar));
-			if (!cfigFile.getName().equals(PLATFORM_XML)) {
-				if (cfigFile.exists() && cfigFile.isFile()) {
-					Utils.log(Messages.getString("PlatformConfiguration.expectingPlatformXMLorDirectory") + cfigFile.getName()); //$NON-NLS-1$
-					cfigFile = cfigFile.getParentFile();
-				}
-				cfigFile = new File(cfigFile, CONFIG_NAME);
-			}
-			File workingDir = cfigFile.getParentFile();
-			if (workingDir != null && !workingDir.exists())
-				workingDir.mkdirs();
-
-			// Do safe i/o: 
-			//    - backup current config, by moving it to the history folder
-			//    - write new config to platform.xml.tmp file
-			//    - rename the temp file to platform.xml
-			File cfigFileOriginal = new File(cfigFile.getAbsolutePath());
-			File cfigTmp = new File(cfigFile.getAbsolutePath() + CONFIG_FILE_TEMP_SUFFIX);
-			
-			// Backup old file
-			if (cfigFile.exists()){
-				File backupDir = new File(workingDir, CONFIG_HISTORY);
-				if (!backupDir.exists())
-					backupDir.mkdir();
-				long timestamp = cfigFile.lastModified();
-				File preservedFile = new File(backupDir, String.valueOf(timestamp)+".xml"); //$NON-NLS-1$
-				// If the target file exists, increment the timestamp. Try at most 100 times.
-				long increment = 1;
-				while (preservedFile.exists() && increment < 100){
-					preservedFile = new File(backupDir, String.valueOf(timestamp+increment++)+".xml"); //$NON-NLS-1$
-				}
-				if (!preservedFile.exists()) {
-					// try renaming current config to backup copy
-					if (!cfigFile.renameTo(preservedFile))
-						Utils.log(Messages.getString("PlatformConfiguration.cannotBackupConfig")); //$NON-NLS-1$
-				}
-			}
-
-			// first save the file as temp
-			os = new FileOutputStream(cfigTmp);
-			
-			try {
-				saveAsXML(os);
-				// Try flushing any internal buffers, and synchronize with the disk
-				try {
-					os.flush();
-					((FileOutputStream)os).getFD().sync();
-				} catch (SyncFailedException e2) {
-					Utils.log(e2.getMessage());
-				} catch (IOException e2) {
-					Utils.log(e2.getMessage());
-				}
-				try {
-					os.close();
-					os = null;
-				} catch (IOException e1) {
-					Utils.log(Messages.getString("PlatformConfiguration.cannotCloseStream") + cfigTmp); //$NON-NLS-1$
-					Utils.log(e1.getMessage());
-				}
-				// set file time stamp to match that of the config element
-				cfigTmp.setLastModified(config.getDate().getTime());
-				// set this on config, in case the value was rounded off
-				config.setLastModified(cfigTmp.lastModified());
-				// make the change stamp to be the same as the config file
-				changeStamp = config.getDate().getTime();
-				config.setDirty(false);
-			} catch (CoreException e) {
-				throw new IOException(Messages.getString("cfig.unableToSave", cfigTmp.getAbsolutePath())); //$NON-NLS-1$
-			} finally {
-				if (os != null)
-					try {
-						os.close();
-					} catch (IOException e1) {
-						Utils.log(Messages.getString("PlatformConfiguration.cannotCloseTempFile") + cfigTmp); //$NON-NLS-1$
-					}
-			}
-
-			// at this point we have old config (if existed) as "bak" and the
-			// new config as "tmp".
-			boolean ok = cfigTmp.renameTo(cfigFileOriginal);
-			if (!ok) {
-				// this codepath represents a tiny failure window. The load processing
-				// on startup will detect missing config and will attempt to start
-				// with "tmp" (latest), then "bak" (the previous). We can also end up
-				// here if we failed to rename the current config to "bak". In that
-				// case we will restart with the previous state.
-				Utils.log(Messages.getString("PlatformConfiguration.cannotRenameTempFile")); //$NON-NLS-1$
-				
-				throw new IOException(Messages.getString("cfig.unableToSave", cfigTmp.getAbsolutePath())); //$NON-NLS-1$
-			}
-		}
-	}
-
-
-	public static PlatformConfiguration getCurrent() {
-		return currentPlatformConfiguration;
-	}
-
-	/**
-	 * Starts a platform installed at specified installURL using configuration located at platformConfigLocation.
-	 */
-	public static synchronized void startup(URL installURL, Location platformConfigLocation) throws Exception {
-		PlatformConfiguration.installURL = installURL;
-	
-		// create current configuration
-		if (currentPlatformConfiguration == null) {
-			currentPlatformConfiguration = new PlatformConfiguration(platformConfigLocation);
-			if (currentPlatformConfiguration.config == null)
-				throw new Exception(Messages.getString("PlatformConfiguration.cannotLoadConfig") + platformConfigLocation.getURL()); //$NON-NLS-1$
-			if (currentPlatformConfiguration.config.isDirty())
-				// If this is a transient config (generated by PDE),do nothing
-				// otherwise, save the configuration with proper date
-				if (!currentPlatformConfiguration.isTransient())
-					currentPlatformConfiguration.save();
-		}
-	}
-
-	public static synchronized void shutdown() throws IOException {
-
-		// save platform configuration
-		PlatformConfiguration config = getCurrent();
-		if (config != null) {
-			// only save if there are changes in the config
-			if (config.config.isDirty() && !config.isTransient()) {
-				try {
-					config.save();
-				} catch (IOException e) {
-					Utils.debug("Unable to save configuration " + e.toString()); //$NON-NLS-1$
-					// will recover on next startup
-				}
-			}
-		}
-	}
-
-
-	private synchronized void initializeCurrent(Location platformConfigLocation) throws IOException {
-
-		// Configuration URL was is specified by the OSGi layer. 
-		// Default behavior is to look
-		// for configuration in the specified meta area. If not found, look
-		// for pre-initialized configuration in the installation location.
-		// If it is found it is used as the initial configuration. Otherwise
-		// a new configuration is created. In either case the resulting
-		// configuration is written into the specified configuration area.
-
-		URL configFileURL = new URL(platformConfigLocation.getURL(), CONFIG_NAME);
-		try {	
-			// check concurrent use lock
-			getConfigurationLock(platformConfigLocation.getURL());
-
-			// try loading the configuration
-			try {
-				config = loadConfig(configFileURL);
-				Utils.debug("Using configuration " + configFileURL.toString()); //$NON-NLS-1$
-			} catch (Exception e) {
-				// failed to load, see if we can find pre-initialized configuration.
-				try {
-					Location parentLocation = platformConfigLocation.getParentLocation();
-					if (parentLocation == null)
-						throw new IOException(); // no platform.xml found, need to create default site
-					
-					URL sharedConfigFileURL = new URL(parentLocation.getURL(), CONFIG_NAME);
-					config = loadConfig(sharedConfigFileURL);
-					
-					// pre-initialized config loaded OK ... copy any remaining update metadata
-					// Only copy if the default config location is not the install location
-					if (!sharedConfigFileURL.equals(configFileURL)) {
-						// need to link config info instead of using a copy
-						linkInitializedState(config, parentLocation, platformConfigLocation);
-						Utils.debug("Configuration initialized from    " + sharedConfigFileURL.toString()); //$NON-NLS-1$
-					}
-					return;
-				} catch (Exception ioe) {
-					Utils.debug("Creating default configuration from " + configFileURL.toExternalForm()); //$NON-NLS-1$
-					createDefaultConfiguration(configFileURL);
-				}
-			}
-		} finally {
-			configLocation = configFileURL;
-			if (config.getURL() == null)
-				config.setURL(configFileURL);
-			verifyPath(configLocation);
-			Utils.debug("Creating configuration " + configFileURL.toString()); //$NON-NLS-1$
-			// releaes concurrent use lock
-			clearConfigurationLock();
-		}
-	}
-
-	
-	private synchronized void initialize(URL url) throws Exception {
-		if (url != null) {
-			config = loadConfig(url);	
-			Utils.debug("Using configuration " + url.toString()); //$NON-NLS-1$
-		}
-		if (config == null) {
-			config = new Configuration();		
-			Utils.debug("Creating empty configuration object"); //$NON-NLS-1$
-		}
-		config.setURL(url);
-		configLocation = url;
-	}
-
-	private void createDefaultConfiguration(URL url)throws IOException{
-		// we are creating new configuration
-		config = new Configuration();
-		config.setURL(url);
-		SiteEntry defaultSite = (SiteEntry)getRootSite();
-		configureSite(defaultSite);
-		try {
-			// parse the site directory to discover features
-			defaultSite.loadFromDisk(0);
-		} catch (CoreException e1) {
-			Utils.log(Messages.getString("PlatformConfiguration.cannotLoadDefaultSite") + defaultSite.getResolvedURL()); //$NON-NLS-1$
-			return;
-		}
-	}
-	private ISiteEntry getRootSite() {
-		// create default site entry for the root
-		ISitePolicy defaultPolicy = createSitePolicy(DEFAULT_POLICY_TYPE, DEFAULT_POLICY_LIST);
-		URL siteURL = null;
-		try {
-			siteURL = new URL("platform:/base/"); //$NON-NLS-1$  // try using platform-relative URL
-		} catch (MalformedURLException e) {
-			siteURL = getInstallURL(); // ensure we come up ... use absolute file URL
-		}
-		ISiteEntry defaultSite = createSiteEntry(siteURL, defaultPolicy);
-		return defaultSite;
-	}
-	
-	/**
-	 * Gets the configuration lock
-	 * @param url configuration directory
-	 */
-	private void getConfigurationLock(URL url) {
-		if (!url.getProtocol().equals("file")) //$NON-NLS-1$
-			return;
-
-		File lockFile = new File(url.getFile(), ConfigurationActivator.NAME_SPACE+ File.separator+CONFIG_FILE_LOCK_SUFFIX);
-		verifyPath(url);
-		// PAL nio optional
-		lock = createLocker(lockFile); 
-		try {
-			lock.lock();
-		} catch (IOException ioe) {
-			lock = null;
-		}	
-	}
-	
-	private void clearConfigurationLock() {
-		// PAL nio optional
-		if (lock != null) {
-			lock.release();
-		}
-	}
-	
-	/**
-	 * Create a locker using java new I/O or regular I/O
-	 * depending whether we run in J2SE or cdcFoundation
-	 * PAL nio optional
-	 */
-	private static Locker createLocker(File lock) {
-		if (!checkNio) {
-			useNio = true;
-			try {
-				 Class.forName("java.nio.channels.FileLock"); //$NON-NLS-1$
-			} catch (ClassNotFoundException e) {
-				useNio = false;
-			}
-		}
-		if (useNio)
-			return new Locker_JavaNio(lock);
-		else
-			return new Locker_JavaIo(lock);
-	}
-	
-	private long computeChangeStamp() {
-		featuresChangeStamp = computeFeaturesChangeStamp();
-		pluginsChangeStamp = computePluginsChangeStamp();
-		changeStamp = Math.max(featuresChangeStamp, pluginsChangeStamp);
-		// round off to seconds
-		changeStamp = (changeStamp/1000)*1000;
-		return changeStamp;
-	}
-
-	private long computeFeaturesChangeStamp() {
-		if (featuresChangeStampIsValid)
-			return featuresChangeStamp;
-
-		long result = 0;
-		ISiteEntry[] sites = config.getSites();
-		for (int i = 0; i < sites.length; i++) {
-			result = Math.max(result, sites[i].getFeaturesChangeStamp());
-		}
-		featuresChangeStamp = result;
-		featuresChangeStampIsValid = true;
-		return featuresChangeStamp;
-	}
-
-	private long computePluginsChangeStamp() {
-		if (pluginsChangeStampIsValid)
-			return pluginsChangeStamp;
-
-		long result = 0;
-		ISiteEntry[] sites = config.getSites();
-		for (int i = 0; i < sites.length; i++) {
-			result = Math.max(result, sites[i].getPluginsChangeStamp());
-		}
-		pluginsChangeStamp = result;
-		pluginsChangeStampIsValid = true;
-		return pluginsChangeStamp;
-	}
-
-	private void configureExternalLinks() {
-		URL linkURL = getInstallURL();
-		if (!supportsDetection(linkURL))
-			return;
-
-		try {
-			linkURL = new URL(linkURL, LINKS + "/"); //$NON-NLS-1$
-		} catch (MalformedURLException e) {
-			// skip bad links ...
-			Utils.debug("Unable to obtain link URL"); //$NON-NLS-1$
-			return;
-		}
-
-		File linkDir = new File(linkURL.getFile());
-		File[] links = linkDir.listFiles();
-		if (links == null || links.length == 0) {
-			Utils.debug("No links detected in " + linkURL.toExternalForm()); //$NON-NLS-1$
-			return;
-		}
-
-		for (int i = 0; i < links.length; i++) {
-			if (links[i].isDirectory())
-				continue;
-			Utils.debug("Link file " + links[i].getAbsolutePath()); //$NON-NLS-1$
-			Properties props = new Properties();
-			FileInputStream is = null;
-			try {
-				is = new FileInputStream(links[i]);
-				props.load(is);
-				configureExternalLinkSite(links[i], props);
-			} catch (IOException e) {
-				// skip bad links ...
-				Utils.debug("   unable to load link file " + e); //$NON-NLS-1$
-				continue;
-			} finally {
-				if (is != null) {
-					try {
-						is.close();
-					} catch (IOException e) {
-						// ignore ...
-					}
-				}
-			}
-		}
-	}
-
-	private void configureExternalLinkSite(File linkFile, Properties props) {
-		String path = props.getProperty(LINK_PATH);
-		if (path == null) {
-			Utils.debug("   no path definition"); //$NON-NLS-1$
-			return;
-		}
-
-		String link;
-		boolean updateable = true;
-		URL siteURL;
-
-		// parse out link information
-		if (path.startsWith(LINK_READ + " ")) { //$NON-NLS-1$
-			updateable = false;
-			link = path.substring(2).trim();
-		} else if (path.startsWith(LINK_READ_WRITE + " ")) { //$NON-NLS-1$
-			link = path.substring(3).trim();
-		} else {
-			link = path.trim();
-		}
-
-		// 	make sure we have a valid link specification
-		try {
-			File siteFile = new File(link);
-			siteFile = new File(siteFile, ECLIPSE);
-			siteURL = siteFile.toURL();
-			if (findConfiguredSite(siteURL, true) != null)
-				// linked site is already known
-				return;
-		} catch (MalformedURLException e) {
-			// ignore bad links ...
-			Utils.debug("  bad URL " + e); //$NON-NLS-1$
-			return;
-		}
-		
-		// process the link
-		SiteEntry linkSite = (SiteEntry) externalLinkSites.get(siteURL);
-		if (linkSite == null) {
-			// this is a link to a new target so create site for it
-			ISitePolicy linkSitePolicy = createSitePolicy(DEFAULT_POLICY_TYPE, DEFAULT_POLICY_LIST);
-			linkSite = (SiteEntry) createSiteEntry(siteURL, linkSitePolicy);
-		}
-		// update site entry if needed
-		linkSite.setUpdateable(updateable);
-		linkSite.setLinkFileName(linkFile.getAbsolutePath());
-
-		// configure the new site
-		// NOTE: duplicates are not replaced (first one in wins)
-		configureSite(linkSite);
-		// there are changes in the config
-		config.setDirty(true);
-		Utils.debug("   " + (updateable ? "R/W -> " : "R/O -> ") + siteURL.toString()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	private void validateSites() {
-
-		// check to see if all sites are valid. Remove any sites that do not exist.
-		SiteEntry[] list = config.getSites();
-		for (int i = 0; i < list.length; i++) {
-			URL siteURL = list[i].getResolvedURL();
-			if (!supportsDetection(siteURL))
-				continue;
-
-			File siteRoot = new File(siteURL.getFile().replace('/', File.separatorChar));
-			if (!siteRoot.exists()) {
-				unconfigureSite(list[i]);
-				Utils.debug("Site " + siteURL + " does not exist ... removing from configuration"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			
-			// If multiple paths are defined in the same link file
-			// or if the path changes, the old site will still be kept.
-			// A better algorithm could be implemented by keeping track 
-			// of the previous content of the link file.
-			// TODO do the above
-			String linkName = list[i].getLinkFileName();
-			if (linkName != null) {
-				File linkFile = new File(linkName);
-				if (!linkFile.exists())  {
-					unconfigureSite(list[i]);
-					config.setDirty(true);
-					Utils.debug("Site " + siteURL + " is no longer linked ... removing from configuration"); //$NON-NLS-1$ //$NON-NLS-2$	
-				}
-			}
-		}
-	}
-	
-	private void linkInitializedState(Configuration sharedConfig, Location sharedConfigLocation, Location newConfigLocation) {
-		try {
-			URL newConfigIniURL = new URL(newConfigLocation.getURL(), CONFIG_INI);
-			if (!newConfigIniURL.getProtocol().equals("file")) //$NON-NLS-1$
-				return; // need to be able to do write
-
-			// modify config.ini and platform.xml to only link original files
-			File configIni = new File(newConfigIniURL.getFile());
-			Properties props = new Properties();
-			props.put("osgi.sharedConfiguration.area", sharedConfigLocation.getURL().toExternalForm()); //$NON-NLS-1$
-			props.store(new FileOutputStream(configIni), "Linked configuration"); //$NON-NLS-1$
-			
-			config = new Configuration(new Date());
-			config.setURL(new URL(newConfigLocation.getURL(), CONFIG_NAME));
-			config.setLinkedConfig(sharedConfig);
-			config.setDirty(true);
-		} catch (IOException e) {
-			// this is an optimistic copy. If we fail, the state will be reconciled
-			// when the update manager is triggered.
-			System.out.println(e);
-		}
-	}
-	
-	private Configuration loadConfig(URL url) throws Exception {
-		if (url == null)
-			throw new IOException(Messages.getString("cfig.unableToLoad.noURL")); //$NON-NLS-1$
-
-		// try to load saved configuration file (watch for failed prior save())
-		ConfigurationParser parser = null;
-		try {
-			parser = new ConfigurationParser();
-		} catch (InvocationTargetException e) {
-			throw (Exception)e.getTargetException();
-		}
-		
-		config = null;
-		Exception originalException = null;
-		try {
-			config = parser.parse(url);
-			if (config == null)
-				throw new Exception(Messages.getString("PlatformConfiguration.cannotFindConfigFile")); //$NON-NLS-1$
-		} catch (Exception e1) {
-			// check for save failures, so open temp and backup configurations
-			originalException = e1;
-			try {
-				URL tempURL = new URL(url.toExternalForm()+CONFIG_FILE_TEMP_SUFFIX);
-				config = parser.parse(tempURL); 
-				if (config == null)
-					throw new Exception();
-				else
-					config.setDirty(true); // force saving to platform.xml
-			} catch (Exception e2) {
-				try {
-					// check the backup
-					if ("file".equals(url.getProtocol())) { //$NON-NLS-1$
-						File cfigFile = new File(url.getFile().replace('/', File.separatorChar));
-						File workingDir = cfigFile.getParentFile();
-						if (workingDir != null && workingDir.exists()) {
-							File[] backups = workingDir.listFiles(new FileFilter(){
-								public boolean accept(File pathname) {
-									return pathname.isFile() && pathname.getName().endsWith(".xml"); //$NON-NLS-1$
-								}});
-							if (backups != null && backups.length > 0) {
-								URL backupUrl = backups[backups.length-1].toURL();
-								config = parser.parse(backupUrl);
-							}
-						}
-					}
-					if (config == null)
-						throw originalException; // we tried, but no config here ...
-					else
-						config.setDirty(true); // force saving to platform.xml
-				} catch (IOException e3) {
-					throw originalException; // we tried, but no config here ...
-				}
-			}
-		}
-
-		return config;
-	}
-
-	public static boolean supportsDetection(URL url) {
-		String protocol = url.getProtocol();
-		if (protocol.equals("file")) //$NON-NLS-1$
-			return true;
-		else if (protocol.equals("platform")) {
-			URL resolved = null;
-			try {
-				resolved = resolvePlatformURL(url); // 19536
-			} catch (IOException e) {
-				return false; // we tried but failed to resolve the platform URL
-			}
-			return resolved.getProtocol().equals("file"); //$NON-NLS-1$
-		} else
-			return false;
-	}
-
-	private static void verifyPath(URL url) {
-		String protocol = url.getProtocol();
-		String path = null;
-		if (protocol.equals("file")) //$NON-NLS-1$
-			path = url.getFile();
-		else if (protocol.equals("platform")) { // $NON-NLS-1$
-			URL resolved = null;
-			try {
-				resolved = resolvePlatformURL(url); // 19536
-				if (resolved.getProtocol().equals("file")) //$NON-NLS-1$
-					path = resolved.getFile();
-			} catch (IOException e) {
-				// continue ...
-			}
-		}
-
-		if (path != null) {
-			File dir = new File(path).getParentFile();
-			if (dir != null)
-				dir.mkdirs();
-		}
-	}
-
-	public static URL resolvePlatformURL(URL url) throws IOException {
-		// 19536
-		if (url.getProtocol().equals("platform")) { // $NON-NLS-1$;
-			url = Platform.asLocalURL(url);
-			// TODO URL resolution by platform returns url file:d:/path as opposed to file:/d:/path
-			File f = new File(url.getFile());
-			url = f.toURL();
-		}
-		return url;
-	}
-	
-	public static URL getInstallURL() {
-		return installURL;
-	}
-	
-	// Patch from Phil to support cdc/foundation: will use the method below instead of this one.
-//	private void saveAsXML(OutputStream stream) throws CoreException {	
-//		StreamResult result = null;
-//		try {
-//			DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder();
-//			Document doc = docBuilder.newDocument();
-//
-//			if (config == null)
-//				throw Utils.newCoreException(Messages.getString("PlatformConfiguration.cannotSaveNonExistingConfig"),null); //$NON-NLS-1$
-//			
-//			config.setDate(new Date());
-//			doc.appendChild(doc.createComment("Created on " + config.getDate().toString())); //$NON-NLS-1$
-//			Element configElement = config.toXML(doc);
-//			doc.appendChild(configElement);
-//
-//			// Write out to a file
-//			
-//			Transformer transformer=transformerFactory.newTransformer();
-//			transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
-//			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
-//			transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
-//			DOMSource source = new DOMSource(doc);
-//			result = new StreamResult(stream);
-//
-//			transformer.transform(source,result);
-//			//will close the stream in the caller
-//			//stream.close();
-//		} catch (Exception e) {
-//			throw Utils.newCoreException("", e); //$NON-NLS-1$
-//		} finally {
-//			result.setOutputStream(null);
-//			result = null;
-//		}
-//	}
-
-	private void saveAsXML(OutputStream stream) throws CoreException,IOException {			
-		BufferedWriter xmlWriter = new BufferedWriter(new OutputStreamWriter(stream,XML_ENCODING));
-		try {
-			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-			factory.setExpandEntityReferences(false);
-			factory.setValidating(false);
-			factory.setIgnoringComments(true);
-			DocumentBuilder docBuilder = factory.newDocumentBuilder();
-			Document doc = docBuilder.newDocument();
-			
-			if (config == null)
-				throw Utils.newCoreException(Messages.getString("PlatformConfiguration.cannotSaveNonExistingConfig"),null); //$NON-NLS-1$
-			
-			config.setDate(new Date());
-			Element configElement = config.toXML(doc);
-			doc.appendChild(configElement);
-			
-			// This is not DBCS friendly... PAL
-			//XMLPrintHandler.printComment(xmlWriter,"Created on " + config.getDate().toString());
-			XMLPrintHandler.printNode(xmlWriter,doc,XML_ENCODING);
-			
-		} catch (Exception e) {
-			throw Utils.newCoreException("", e); //$NON-NLS-1$
-		} finally {
-			xmlWriter.flush();
-			// will close the stream in the caller	
-			//xmlWriter.close();
-		}
-	} 
-	
-	private void reconcile() throws CoreException {
-		long lastChange = config.getDate().getTime();
-		SiteEntry[] sites = config.getSites();
-		for (int s=0; s<sites.length; s++) {
-			long siteTimestamp = sites[s].getChangeStamp();
-			if (siteTimestamp > lastChange)
-				sites[s].loadFromDisk(lastChange);
-		}
-		config.setDirty(true);
-	}
-	
-	public Configuration getConfiguration() {
-		return config;
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PlatformConfigurationFactory.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PlatformConfigurationFactory.java
deleted file mode 100644
index 80c4457..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PlatformConfigurationFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.update.configurator.*;
-
-
-
-public class PlatformConfigurationFactory implements IPlatformConfigurationFactory {
-	public IPlatformConfiguration getCurrentPlatformConfiguration() {
-		return PlatformConfiguration.getCurrent();
-	}
-	public IPlatformConfiguration getPlatformConfiguration(URL url) throws IOException {
-		try {
-			return new PlatformConfiguration(url);
-		} catch (Exception e) {
-			if(e instanceof IOException)
-				throw (IOException)e;
-			else
-				throw new IOException(e.getMessage());
-		}
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PluginEntry.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PluginEntry.java
deleted file mode 100644
index c2b46cd..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PluginEntry.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-
-/**
- */
-public class PluginEntry {
-
-	private String pluginId;
-	private String pluginVersion;
-	private boolean isFragment = false;
-	private VersionedIdentifier versionId;
-	private String url;
-	
-	public PluginEntry() {
-		super();
-	}
-
-	/**
-	 * @return url relative to the site location: plugins/org.eclipse.foo/plugin.xml
-	 * Note: to do: we should probably only use plugins/org.eclipse.foo/ in the future
-	 */
-	public String getURL() {
-		return url;
-	}
-	
-	/**
-	 * url is relative to the site
-	 */
-	public void setURL(String url) {
-		this.url = url;
-	}
-
-	/**
-	 * Returns the plug-in identifier for this entry.
-	 * 
-	 * @return the plug-in identifier, or <code>null</code>
-	 */
-	public String getPluginIdentifier() {
-		return pluginId;
-	}
-
-	/**
-	 * Returns the plug-in version for this entry.
-	 * 
-	 * @return the plug-in version, or <code>null</code>
-	 */
-	public String getPluginVersion() {
-		return pluginVersion;
-	}
-
-	/**
-	 * Indicates whether the entry describes a full plug-in, or 
-	 * a plug-in fragment.
-	 * 
-	 * @return <code>true</code> if the entry is a plug-in fragment, 
-	 * <code>false</code> if the entry is a plug-in
-	 */
-	public boolean isFragment() {
-		return isFragment;
-	}
-
-	/**
-	 * Sets the entry plug-in identifier.
-	 * Throws a runtime exception if this object is marked read-only.
-	 *
-	 * @param pluginId the entry identifier.
-	 */
-	void setPluginIdentifier(String pluginId) {
-		this.pluginId = pluginId;
-	}
-
-	/**
-	 * Sets the entry plug-in version.
-	 * Throws a runtime exception if this object is marked read-only.
-	 *
-	 * @param pluginVersion the entry version.
-	 */
-	void setPluginVersion(String pluginVersion) {
-		this.pluginVersion = pluginVersion;
-	}
-
-	/**
-	 * Indicates whether this entry represents a fragment or plug-in.
-	 * Throws a runtime exception if this object is marked read-only.
-	 *
-	 * @param isFragment fragment setting
-	 */
-	public void isFragment(boolean isFragment) {
-		this.isFragment = isFragment;
-	}
-
-	/**
-	 * @see Object#toString()
-	 */
-	public String toString() {
-		String msg = (getPluginIdentifier()!=null)?getPluginIdentifier().toString():""; //$NON-NLS-1$
-		msg += getPluginVersion()!=null?" "+getPluginVersion().toString():""; //$NON-NLS-1$ //$NON-NLS-2$
-		msg += isFragment()?" fragment":" plugin"; //$NON-NLS-1$ //$NON-NLS-2$
-		return msg;
-	}
-
-
-	/**
-	 * Returns the identifier of this plugin entry
-	 */
-	public VersionedIdentifier getVersionedIdentifier() {
-		if (versionId != null)
-			return versionId;
-
-		String id = getPluginIdentifier();
-		String ver = getPluginVersion();
-		if (id != null && ver != null) {
-			try {
-				versionId = new VersionedIdentifier(id, ver);
-				return versionId;
-			} catch (Exception e) {
-				Utils.log(Messages.getString("PluginEntry.versionError", id, ver)); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		versionId = new VersionedIdentifier("",null); //$NON-NLS-1$
-		return versionId;
-	}
-
-	/**
-	 * Sets the identifier of this plugin entry. 
-	 * 
-	 */
-	void setVersionedIdentifier(VersionedIdentifier identifier) {
-		setPluginIdentifier(identifier.getIdentifier());
-		setPluginVersion(identifier.getVersion().toString());
-	}	
-
-	/**
-	 * Compares two plugin entries for equality
-	 * 
-	 * @param object plugin entry object to compare with
-	 * @return <code>true</code> if the two entries are equal, 
-	 * <code>false</code> otherwise
-	 */
-	public boolean equals(Object object) {
-		if (!(object instanceof PluginEntry))
-			return false;
-		PluginEntry e = (PluginEntry) object;
-		return getVersionedIdentifier().equals(e.getVersionedIdentifier());
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getVersionedIdentifier().hashCode();
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PluginParser.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PluginParser.java
deleted file mode 100644
index 3c5a1dc..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/PluginParser.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-
-import java.io.*;
-
-import javax.xml.parsers.*;
-
-import org.xml.sax.*;
-import org.xml.sax.helpers.*;
-
-/**
- * Parse default feature.xml
- */
-
-public class PluginParser extends DefaultHandler implements IConfigurationConstants {
-	private final static SAXParserFactory parserFactory =
-		SAXParserFactory.newInstance();
-	private SAXParser parser;
-	private PluginEntry pluginEntry;
-    private String location;
-
-	private class ParseCompleteException extends SAXException {
-		
-        private static final long serialVersionUID = 1L;
-
-        public ParseCompleteException(String arg0) {
-			super(arg0);
-		}
-	}
-
-	/**
-	 * Constructor for DefaultFeatureParser
-	 */
-	public PluginParser() {
-		super();
-		try {
-			parserFactory.setNamespaceAware(true);
-			this.parser = parserFactory.newSAXParser();
-		} catch (ParserConfigurationException e) {
-			System.out.println(e);
-		} catch (SAXException e) {
-			System.out.println(e);
-		}
-	}
-
-	/**
-	 * @since 2.0
-	 */
-	public synchronized PluginEntry parse(File pluginFile) throws SAXException, IOException {
-		FileInputStream in = null;;
-		try{
-			in = new FileInputStream(pluginFile);
-			return parse(in, PLUGINS + "/" + pluginFile.getParentFile().getName() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
-		}finally{
-			if (in != null){
-				try{
-					in.close();
-				}catch(IOException e){
-				}
-			}
-		}
-	}
-	/**
-	 * @since 3.0
-	 */
-	public synchronized PluginEntry parse(InputStream in, String bundleUrl) throws SAXException, IOException {
-		try {
-            location = bundleUrl;
-			pluginEntry = new PluginEntry();
-			pluginEntry.setURL(bundleUrl);
-			parser.parse(new InputSource(in), this);
-		} catch (ParseCompleteException e) {
-			// expected, we stopped the parsing when we have the information we need
-			/// no need to pursue the parsing
-		}
-		return pluginEntry;
-	}
-
-	/**
-	 * @see DefaultHandler#startElement(String, String, String, Attributes)
-	 */
-	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-
-		String tag = localName.trim();
-
-		if (tag.equalsIgnoreCase(CFG_PLUGIN)) {
-			pluginEntry.isFragment(false);			
-			processPlugin(attributes);
-			return;
-		}
-
-		if (tag.equalsIgnoreCase(CFG_FRAGMENT)) {
-			pluginEntry.isFragment(true);			
-			processPlugin(attributes);
-			return;
-		}
-	}
-
-	/** 
-	 * process plugin entry info
-	 */
-	private void processPlugin(Attributes attributes) throws ParseCompleteException {
-		String id = attributes.getValue("id"); //$NON-NLS-1$
-		String version = attributes.getValue("version"); //$NON-NLS-1$
-		if (id == null || id.trim().length() == 0) {
-			id = "_no_id_"; //$NON-NLS-1$
-            Utils.log(Messages.getString("PluginParser.plugin_no_id", location));
-        }
-        if (version == null || version.trim().length() == 0) {
-            version = "0.0.0"; //$NON-NLS-1$
-            Utils.log(Messages.getString("PluginParser.plugin_no_version", location));
-        }
-		pluginEntry.setVersionedIdentifier(new VersionedIdentifier(id, version));
-		
-		// stop parsing now
-		throw new ParseCompleteException(""); //$NON-NLS-1$
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ProductProvider.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ProductProvider.java
deleted file mode 100644
index 6c7f199..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/ProductProvider.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.configurator.*;
-
-/**
- * Maps primary features to IProduct
- */
-public class ProductProvider implements IProductProvider{
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProductProvider#getProducts()
-	 */
-	public IProduct[] getProducts() {
-		IPlatformConfiguration configuration = ConfiguratorUtils.getCurrentPlatformConfiguration();
-		if (configuration == null)
-			return new IProduct[0];
-		else {
-			IPlatformConfiguration.IFeatureEntry[] features = configuration.getConfiguredFeatureEntries();
-			ArrayList primaryFeatures = new ArrayList();
-			for (int i=0; i<features.length; i++)
-				if (features[i].canBePrimary())
-					primaryFeatures.add(features[i]);
-			// TODO handle unmanaged plugins later
-			return (IProduct[])primaryFeatures.toArray(new IProduct[primaryFeatures.size()]);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IProductProvider#getName()
-	 */
-	public String getName() {
-		return Messages.getString("ProductProvider"); //$NON-NLS-1$
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/SiteEntry.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/SiteEntry.java
deleted file mode 100644
index 7aa8599..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/SiteEntry.java
+++ /dev/null
@@ -1,761 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import java.util.zip.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.service.environment.*;
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.configurator.IPlatformConfiguration.*;
-import org.w3c.dom.*;
-import org.xml.sax.*;
-
-
-public class SiteEntry implements IPlatformConfiguration.ISiteEntry, IConfigurationConstants{	
-	private static final String MAC_OS_MARKER = ".DS_Store";
-	
-	private URL url; // this is the external URL for the site
-	private URL resolvedURL; // this is the resolved URL used internally
-	private ISitePolicy policy;
-	private boolean updateable = true;
-	private Map featureEntries;
-	private ArrayList pluginEntries;
-	private long changeStamp;
-	private long featuresChangeStamp;
-	private long pluginsChangeStamp;
-	private String linkFileName;
-	private boolean enabled = true;
-	private Configuration config;
-	
-	private static FeatureParser featureParser = new FeatureParser();
-	private static PluginParser pluginParser = new PluginParser();
-	private static boolean isMacOS = Platform.getOS().equals(Constants.OS_MACOSX);
-
-	public SiteEntry(URL url) {
-		this(url,null);
-	}
-	
-	public SiteEntry(URL url, ISitePolicy policy) {
-		if (url == null)
-			try {
-				url = new URL("platform:/base/"); //$NON-NLS-1$ try using platform-relative URL
-			} catch (MalformedURLException e) {
-				url = PlatformConfiguration.getInstallURL(); // ensure we come up ... use absolute file URL
-			}
-			
-		if (policy == null)
-			policy = new SitePolicy(DEFAULT_POLICY_TYPE, DEFAULT_POLICY_LIST);
-
-		if (url.getProtocol().equals("file")) { //$NON-NLS-1$
-			try {
-				// TODO remove this when platform fixes local file url's
-				this.url = new File(url.getFile()).toURL(); 
-			} catch (MalformedURLException e1) {
-				this.url = url;
-			}
-		} else
-			this.url = url;
-		
-		this.policy = policy;
-		this.resolvedURL = this.url;
-		if (url.getProtocol().equals("platform")) { // $NON-NLS-1$
-			try {
-				resolvedURL = PlatformConfiguration.resolvePlatformURL(url); // 19536
-			} catch (IOException e) {
-				// will use the baseline URL ...
-			}
-		}
-	}
-
-	public void setConfig(Configuration config) {
-		this.config = config;
-	}
-	
-	public Configuration getConfig() {
-		return config;
-	}
-	
-	/*
-	 * @see ISiteEntry#getURL()
-	 */
-	public URL getURL() {
-		return url;
-	}
-
-	/*
-	* @see ISiteEntry#getSitePolicy()
-	*/
-	public ISitePolicy getSitePolicy() {
-		return policy;
-	}
-
-	/*
-	 * @see ISiteEntry#setSitePolicy(ISitePolicy)
-	 */
-	public synchronized void setSitePolicy(ISitePolicy policy) {
-		if (policy == null)
-			throw new IllegalArgumentException();
-		this.policy = policy;
-	}
-
-	/*
-	 * @see ISiteEntry#getFeatures()
-	 */
-	public String[] getFeatures() {
-		return getDetectedFeatures();
-	}
-
-	/*
-	 * @see ISiteEntry#getPlugins()
-	 */
-	public String[] getPlugins() {
-
-		ISitePolicy policy = getSitePolicy();
-
-		if (policy.getType() == ISitePolicy.USER_INCLUDE)
-			return policy.getList();
-
-		if (policy.getType() == ISitePolicy.USER_EXCLUDE) {
-			ArrayList detectedPlugins = new ArrayList(Arrays.asList(getDetectedPlugins()));
-			String[] excludedPlugins = policy.getList();
-			for (int i = 0; i < excludedPlugins.length; i++) {
-				if (detectedPlugins.contains(excludedPlugins[i]))
-					detectedPlugins.remove(excludedPlugins[i]);
-			}
-			return (String[]) detectedPlugins.toArray(new String[0]);
-		}
-		
-		if (policy.getType() == ISitePolicy.MANAGED_ONLY) {
-			PluginEntry[] managedPlugins = getManagedPlugins();
-			String[] managedPluginsURLs = new String[managedPlugins.length];
-			for (int i=0; i<managedPlugins.length; i++)
-				managedPluginsURLs[i] = managedPlugins[i].getURL();
-			
-			return managedPluginsURLs;
-		}
-
-		// bad policy type
-		return new String[0];
-	}
-
-	private PluginEntry[] getManagedPlugins() {
-		// Note:
-		// We detect all the plugins on the site, but it would be faster
-		// to just lookup the plugins that correspond to the entries found in each feature.
-		// TODO fix the above
-		if (pluginEntries == null)
-			detectPlugins();
-		if (featureEntries == null)
-			detectFeatures();
-		
-		// cache all the plugin entries for faster lookup later
-		Map cachedPlugins = new HashMap(pluginEntries.size());
-		for (int i=0; i<pluginEntries.size(); i++) {
-			PluginEntry p = (PluginEntry)pluginEntries.get(i);
-			cachedPlugins.put(p.getVersionedIdentifier(), p);
-		}
-		
-		ArrayList managedPlugins = new ArrayList();
-		for (Iterator iterator=featureEntries.values().iterator(); iterator.hasNext();) {
-			Object feature = iterator.next();
-			if (!(feature instanceof FeatureEntry))
-				continue;
-			
-			PluginEntry[] plugins = ((FeatureEntry)feature).getPluginEntries();
-			for (int i=0; i<plugins.length; i++)
-				if (cachedPlugins.containsKey(plugins[i].getVersionedIdentifier()))
-					managedPlugins.add(cachedPlugins.get(plugins[i].getVersionedIdentifier()));
-					
-		}
-		return (PluginEntry[])managedPlugins.toArray(new PluginEntry[managedPlugins.size()]);
-	}
-	
-	public PluginEntry[] getPluginEntries() {
-		String[] pluginURLs = getPlugins();
-		// hash the array, for faster lookups
-		HashMap map = new HashMap(pluginURLs.length);
-		for (int i=0; i<pluginURLs.length; i++)
-			map.put(pluginURLs[i], pluginURLs[i]);
-		
-		if (pluginEntries == null)
-				detectPlugins();
-		
-		ArrayList plugins = new ArrayList(pluginURLs.length);
-		for (int i=0; i<pluginEntries.size(); i++) {
-			PluginEntry p = (PluginEntry)pluginEntries.get(i);
-			if (map.containsKey(p.getURL()))
-				plugins.add(p);
-		}
-		return (PluginEntry[])plugins.toArray(new PluginEntry[plugins.size()]);
-	}
-	
-	/*
-	 * @see ISiteEntry#getChangeStamp()
-	 */
-	public long getChangeStamp() {
-		if (changeStamp == 0)
-			computeChangeStamp();
-		return changeStamp;
-	}
-
-	/*
-	 * @see ISiteEntry#getFeaturesChangeStamp()
-	 */
-	public long getFeaturesChangeStamp() {
-		if (featuresChangeStamp == 0)
-			computeFeaturesChangeStamp();
-		return featuresChangeStamp;
-	}
-
-	/*
-	 * @see ISiteEntry#getPluginsChangeStamp()
-	 */
-	public long getPluginsChangeStamp() {
-		if (pluginsChangeStamp == 0)
-			computePluginsChangeStamp();
-		return pluginsChangeStamp;
-	}
-
-	/*
-	 * @see ISiteEntry#isUpdateable()
-	 */
-	public boolean isUpdateable() {
-		return updateable;
-	}
-	
-	public void setUpdateable(boolean updateable) {
-		this.updateable = updateable;
-	}
-
-	/*
-	 * @see ISiteEntry#isNativelyLinked()
-	 */
-	public boolean isNativelyLinked() {
-		return isExternallyLinkedSite();
-	}
-
-	public URL getResolvedURL() {
-		return resolvedURL;
-	}
-	
-	/**
-	 * Detect new features (timestamp > current site timestamp)
-	 * and validates existing features (they might have been removed)
-	 */
-	private void detectFeatures() {
-
-		if (featureEntries != null)
-			validateFeatureEntries();
-		else
-			featureEntries = new HashMap();
-
-		if (!PlatformConfiguration.supportsDetection(resolvedURL))
-			return;
-
-		// locate feature entries on site
-		File siteRoot = new File(resolvedURL.getFile().replace('/', File.separatorChar));
-		File featuresDir = new File(siteRoot, FEATURES);
-		if (featuresDir.exists()) {
-			// handle the installed features under the features directory
-			File[] dirs = featuresDir.listFiles(new FileFilter() {
-				public boolean accept(File f) {
-					// mac os folders contain a file .DS_Store in each folder, and we need to skip it (bug 76869) 
-					if (isMacOS && f.getName().equals(MAC_OS_MARKER))
-						return false;
-					boolean valid = f.isDirectory() && (new File(f,FEATURE_XML).exists());
-					if (!valid)
-						Utils.log(Messages.getString("SiteEntry.cannotFindFeatureInDir", f.getAbsolutePath())); //$NON-NLS-1$
-					return valid;
-				}
-			});
-		
-			for (int index = 0; index < dirs.length; index++) {
-				try {
-					File featureXML = new File(dirs[index], FEATURE_XML);
-					if (featureXML.lastModified() <= featuresChangeStamp &&
-						dirs[index].lastModified() <= featuresChangeStamp)
-						continue;
-					URL featureURL = featureXML.toURL();
-					FeatureEntry featureEntry = featureParser.parse(featureURL);
-					if (featureEntry != null)
-						addFeatureEntry(featureEntry);
-				} catch (MalformedURLException e) {
-					Utils.log(Messages.getString("InstalledSiteParser.UnableToCreateURLForFile", featuresDir.getAbsolutePath()));//$NON-NLS-1$
-				}
-			}
-		}
-		
-		Utils.debug(resolvedURL.toString() + " located  " + featureEntries.size() + " feature(s)"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	/**
-	 * Detect new plugins (timestamp > current site timestamp)
-	 * and validates existing plugins (they might have been removed)
-	 */
-	private void detectPlugins() {
-		boolean compareTimeStamps = false;
-		if (pluginEntries != null) {
-			validatePluginEntries();
-			compareTimeStamps = true; // only pick up newer plugins
-		} else
-			pluginEntries = new ArrayList();
-
-		if (!PlatformConfiguration.supportsDetection(resolvedURL))
-			return;
-
-		// locate plugin entries on site
-		File pluginsDir = new File(resolvedURL.getFile(), PLUGINS);
-		
-		if (pluginsDir.exists() && pluginsDir.isDirectory()) {
-			File[] files = pluginsDir.listFiles();
-			for (int i = 0; i < files.length; i++) {
-				if(files[i].isDirectory()){
-					detectUnpackedPlugin(files[i], compareTimeStamps);
-				}else if(files[i].getName().endsWith(".jar")){ //$NON-NLS-1$
-					detectPackedPlugin(files[i], compareTimeStamps);
-				}else{
-					// not bundle file
-				}
-			}
-		} 
-		
-		Utils.debug(resolvedURL.toString() + " located  " + pluginEntries.size() + " plugin(s)"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * @param file a plugin jar
-	 * @param compareTimeStamps set to true when looking for plugins changed since last time they were detected
-	 */
-	private void detectPackedPlugin(File file, boolean compareTimeStamps) {
-		// plugin to run directly from jar
-		if (compareTimeStamps && file.lastModified() <= pluginsChangeStamp) {
-			return;
-		}
-		String entryName = META_MANIFEST_MF;
-		ZipFile z = null;
-		InputStream bundleManifestIn = null;
-		InputStream pluginManifestIn = null;
-		String pluginURL = PLUGINS + "/" + file.getName(); //$NON-NLS-1$
-		try {
-			// First, check if has valid bundle manifest
-			z = new ZipFile(file);
-			if (z.getEntry(entryName) != null) {
-				bundleManifestIn = z.getInputStream(new ZipEntry(entryName));
-				BundleManifest manifest = new BundleManifest(bundleManifestIn,
-						pluginURL);
-				if (manifest.exists()) {
-					addPluginEntry(manifest.getPluginEntry());
-					return;
-				}
-			}
-			// no bundle manifest, check for plugin.xml or fragment.xml
-			entryName = PLUGIN_XML;
-			if (z.getEntry(entryName) == null) {
-				entryName = FRAGMENT_XML;
-			}
-			if (z.getEntry(entryName) != null) {
-				pluginManifestIn = z.getInputStream(new ZipEntry(entryName));
-				PluginEntry entry1 = pluginParser.parse(pluginManifestIn,
-						pluginURL);
-				addPluginEntry(entry1);
-			}
-		} catch (IOException e5) {
-			String pluginFileString2 = pluginURL + "!" + entryName; //$NON-NLS-1$
-			Utils.log(Messages.getString("InstalledSiteParser.ErrorAccessing", //$NON-NLS-1$
-					pluginFileString2)); //$NON-NLS-1$
-		} catch (SAXException e3) {
-			String pluginFileString1 = pluginURL + "!" + entryName; //$NON-NLS-1$
-			Utils.log(Messages.getString(
-					"InstalledSiteParser.ErrorParsingFile", pluginFileString1)); //$NON-NLS-1$
-		} finally {
-			if (bundleManifestIn != null) {
-				try {
-					bundleManifestIn.close();
-				} catch (IOException e4) {
-				}
-			}
-			if (pluginManifestIn != null) {
-				try {
-					pluginManifestIn.close();
-				} catch (IOException e2) {
-				}
-			}
-			if (z != null) {
-				try {
-					z.close();
-				} catch (IOException e1) {
-				}
-			}
-		}
-	}
-	/**
-	 * @param file a plugin directory
-	 * @param compareTimeStamps set to true when looking for plugins changed since last time they were detected
-	 */
-	private void detectUnpackedPlugin(File file, boolean compareTimeStamps) {
-		// unpacked plugin
-		long dirTimestamp = file.lastModified();
-		File pluginFile = new File(file, META_MANIFEST_MF);
-		try {
-			// First, check if has valid bundle manifest
-			BundleManifest bundleManifest = new BundleManifest(pluginFile);
-			if (bundleManifest.exists()) {
-				if (compareTimeStamps
-						&& dirTimestamp <= pluginsChangeStamp
-						&& pluginFile.lastModified() <= pluginsChangeStamp)
-					return;
-				PluginEntry entry = bundleManifest.getPluginEntry();
-				addPluginEntry(entry);
-			} else {
-				// no bundle manifest, check for plugin.xml or fragment.xml
-				pluginFile = new File(file, PLUGIN_XML);
-				if (!pluginFile.exists()) { //$NON-NLS-1$
-					pluginFile = new File(file, FRAGMENT_XML); //$NON-NLS-1$
-				}
-				if (pluginFile.exists() && !pluginFile.isDirectory()) {
-					// TODO in the future, assume that the timestamps are not
-					// reliable,
-					// or that the user manually modified an existing plugin,
-					// so
-					// the apparently modifed plugin may actually be configured
-					// already.
-					// We will need to double check for this. END to do.
-					if (compareTimeStamps 
-							&& dirTimestamp <= pluginsChangeStamp
-							&& pluginFile.lastModified() <= pluginsChangeStamp)
-						return;
-					PluginEntry entry = pluginParser.parse(pluginFile);
-					addPluginEntry(entry);
-				}
-			}
-		} catch (IOException e) {
-			String pluginFileString = pluginFile.getAbsolutePath();
-			if (ConfigurationActivator.DEBUG)
-				Utils.log(Utils.newStatus(Messages.getString(
-						"InstalledSiteParser.ErrorParsingFile", pluginFileString), e));//$NON-NLS-1$
-			else
-				Utils.log(Messages.getString("InstalledSiteParser.ErrorAccessing", //$NON-NLS-1$
-						pluginFileString)); //$NON-NLS-1$
-		} catch (SAXException e) {
-			String pluginFileString = pluginFile.getAbsolutePath();
-			Utils.log(Messages.getString(
-					"InstalledSiteParser.ErrorParsingFile", pluginFileString)); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @return list of feature url's (relative to site)
-	 */
-	private synchronized String[] getDetectedFeatures() {
-		if (featureEntries == null)
-			detectFeatures();
-		String[] features = new String[featureEntries.size()];
-		Iterator iterator = featureEntries.values().iterator();
-		for (int i=0; i<features.length; i++)
-			features[i] = ((FeatureEntry)iterator.next()).getURL();
-		return features;
-	}
-
-	/**
-	 * @return list of plugin url's (relative to site)
-	 */
-	private synchronized String[] getDetectedPlugins() {
-		if (pluginEntries == null)
-			detectPlugins();
-		
-		String[] plugins = new String[pluginEntries.size()];
-		for (int i=0; i<plugins.length; i++)
-			plugins[i] = ((PluginEntry)pluginEntries.get(i)).getURL();
-		return plugins;
-	}
-
-	private void computeChangeStamp() {
-		changeStamp = Math.max(computeFeaturesChangeStamp(), computePluginsChangeStamp());
-//		changeStampIsValid = true;
-	}
-
-	private synchronized long computeFeaturesChangeStamp() {
-		if (featuresChangeStamp > 0)
-			return featuresChangeStamp;
-		
-		long start = 0;
-		if (ConfigurationActivator.DEBUG)
-			start = (new Date()).getTime();
-		String[] features = getFeatures();
-	
-		// compute stamp for the features directory
-		long dirStamp = 0;
-		if (PlatformConfiguration.supportsDetection(resolvedURL)) {
-			File root = new File(resolvedURL.getFile().replace('/', File.separatorChar));
-			File featuresDir = new File(root, FEATURES);
-			dirStamp = featuresDir.lastModified();
-		}
-		featuresChangeStamp = Math.max(dirStamp, computeStamp(features));
-		if (ConfigurationActivator.DEBUG) {
-			long end = (new Date()).getTime();
-			Utils.debug(resolvedURL.toString() + " feature stamp: " + featuresChangeStamp + " in " + (end - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-		}
-		return featuresChangeStamp;
-	}
-
-	private synchronized long computePluginsChangeStamp() {
-		if (pluginsChangeStamp > 0)
-			return pluginsChangeStamp;
-		
-		if (!PlatformConfiguration.supportsDetection(resolvedURL)) {
-			Utils.log(Messages.getString("SiteEntry.computePluginStamp", resolvedURL.toExternalForm())); //$NON-NLS-1$
-			return 0;
-		}
-
-		// compute stamp for the plugins directory
-		File root = new File(resolvedURL.getFile().replace('/', File.separatorChar));
-		File pluginsDir = new File(root, PLUGINS);
-		if (!pluginsDir.exists() || !pluginsDir.isDirectory()) {
-			Utils.log(Messages.getString("SiteEntry.pluginsDir", pluginsDir.getAbsolutePath())); //$NON-NLS-1$
-			return 0;
-		}
-
-		pluginsChangeStamp = pluginsDir.lastModified();
-		return pluginsChangeStamp;
-	}
-
-	private long computeStamp(String[] targets) {
-
-		long result = 0;
-		if (!PlatformConfiguration.supportsDetection(resolvedURL)) {
-			// NOTE:  this path should not be executed until we support running
-			//        from an arbitrary URL (in particular from http server). For
-			//        now just compute stamp across the list of names. Eventually
-			//        when general URLs are supported we need to do better (factor
-			//        in at least the existence of the target). However, given this
-			//        code executes early on the startup sequence we need to be
-			//        extremely mindful of performance issues.
-			// In fact, we should get the last modified from the connection
-			for (int i = 0; i < targets.length; i++)
-				result ^= targets[i].hashCode();
-			Utils.debug("*WARNING* computing stamp using URL hashcodes only"); //$NON-NLS-1$
-		} else {
-			// compute stamp across local targets
-			File rootFile = new File(resolvedURL.getFile().replace('/', File.separatorChar));
-			if (rootFile.exists()) {
-				File f = null;
-				for (int i = 0; i < targets.length; i++) {
-					f = new File(rootFile, targets[i]);
-					if (f.exists())
-						result = Math.max(result, f.lastModified());
-				}
-			}
-		}
-
-		return result;
-	}
-	
-	public void setLinkFileName(String linkFileName) {
-		this.linkFileName = linkFileName;
-	}
-	
-	public String getLinkFileName() {
-		return linkFileName;
-	}
-
-	public boolean isExternallyLinkedSite() {
-		return (linkFileName != null && !linkFileName.trim().equals("")); //$NON-NLS-1$
-	}
-
-	public synchronized void refresh() {
-		// reset computed values. Will be updated on next access.
-		featuresChangeStamp = 0;
-		pluginsChangeStamp = 0;
-		changeStamp = 0;
-		featureEntries = null;
-		pluginEntries = null;
-	}
-	
-	public void refreshPlugins() {
-		// reset computed values. Will be updated on next access.
-		pluginsChangeStamp = 0;
-		changeStamp = 0;
-		pluginEntries = null;
-	}
-	
-	public void addFeatureEntry(IFeatureEntry feature) {
-		if (featureEntries == null)
-			featureEntries = new HashMap();
-		// Make sure we keep the larger version of same feature
-		IFeatureEntry existing = (FeatureEntry)featureEntries.get(feature.getFeatureIdentifier());
-		if (existing != null) {
-			VersionedIdentifier existingVersion = new VersionedIdentifier(existing.getFeatureIdentifier(), existing.getFeatureVersion());
-			VersionedIdentifier newVersion = new VersionedIdentifier(feature.getFeatureIdentifier(), feature.getFeatureVersion());
-			if (existingVersion.compareVersion(newVersion) == VersionedIdentifier.LESS_THAN) {
-				featureEntries.put(feature.getFeatureIdentifier(), feature);
-				pluginsChangeStamp = 0;
-			} else if (existingVersion.equals(newVersion)) {
-				// log error if same feature version/id but a different url
-				if (feature instanceof FeatureEntry && existing instanceof FeatureEntry &&
-						!((FeatureEntry)feature).getURL().equals(((FeatureEntry)existing).getURL()))
-				Utils.log(Messages.getString("SiteEntry.duplicateFeature",getURL().toExternalForm(), existing.getFeatureIdentifier())); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} else {
-			featureEntries.put(feature.getFeatureIdentifier(), feature);
-			pluginsChangeStamp = 0;
-		}
-		if (feature instanceof FeatureEntry)
-			((FeatureEntry)feature).setSite(this);
-	}
-	
-	public FeatureEntry[] getFeatureEntries() {
-		if (featureEntries == null)
-			detectFeatures();
-		
-		if (featureEntries == null)
-			return new FeatureEntry[0];
-		else
-			return (FeatureEntry[])featureEntries.values().toArray(new FeatureEntry[featureEntries.size()]);
-	}
-	
-	public void addPluginEntry(PluginEntry plugin) {
-		if (pluginEntries == null)
-			pluginEntries = new ArrayList();
-		// Note: we could use the latest version of the same plugin, like we do for features, but we let the runtime figure it out
-		pluginEntries.add(plugin);
-	}
-	
-	public PluginEntry[] getAllPluginEntries() {
-		if (pluginEntries == null)
-			detectPlugins();
-		return (PluginEntry[])pluginEntries.toArray(new PluginEntry[pluginEntries.size()]);
-	}
-	
-	public void loadFromDisk(long lastChange) throws CoreException{
-		featuresChangeStamp = lastChange;
-		pluginsChangeStamp = lastChange;
-		detectFeatures();
-		detectPlugins();
-	}
-	
-	/**
-	 * Saves state as xml content in a given parent element
-	 * @param doc
-	 */
-	public Element toXML(Document doc) {
-
-		Element siteElement = doc.createElement(CFG_SITE);
-		
-		if (getURL().toString() != null)
-			siteElement.setAttribute(CFG_URL, getURL().toString());
-
-		siteElement.setAttribute(CFG_ENABLED, isEnabled() ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$
-		siteElement.setAttribute(CFG_UPDATEABLE, isUpdateable() ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (isExternallyLinkedSite()) 
-			siteElement.setAttribute(CFG_LINK_FILE, getLinkFileName().trim().replace(File.separatorChar, '/')); 
-
-		int type = getSitePolicy().getType();
-		String typeString = CFG_POLICY_TYPE_UNKNOWN;
-		try {
-			typeString = CFG_POLICY_TYPE[type];
-		} catch (IndexOutOfBoundsException e) {
-			// ignore bad attribute ...
-		}
-		siteElement.setAttribute(CFG_POLICY, typeString); 
-		String[] list = getSitePolicy().getList();
-		if (list.length > 0) {
-			StringBuffer sb = new StringBuffer(256);
-			for (int i=0; i<list.length-1; i++) {
-				sb.append(list[i]);
-				sb.append(',');
-			}
-			sb.append(list[list.length-1]);
-			siteElement.setAttribute(CFG_LIST, sb.toString());
-		}
-//		// note: we don't save features inside the site element.
-		
-		// collect feature entries
-//		configElement.setAttribute(CFG_FEATURE_ENTRY_DEFAULT, defaultFeature);
-		FeatureEntry[] feats = getFeatureEntries();
-		for (int i = 0; i < feats.length; i++) {
-			Element featureElement = feats[i].toXML(doc);
-			siteElement.appendChild(featureElement);
-		}
-		
-		return siteElement;
-	}
-	
-	private void validateFeatureEntries() {
-		File root = new File(resolvedURL.getFile().replace('/', File.separatorChar));
-		Iterator iterator = featureEntries.values().iterator();
-		Collection deletedFeatures = new ArrayList();
-		while(iterator.hasNext()) {
-			FeatureEntry feature = (FeatureEntry)iterator.next();
-			// Note: in the future, we can check for absolute url as well.
-			//       For now, feature url is features/org.eclipse.foo/feature.xml
-			File featureXML = new File(root, feature.getURL());
-			if (!featureXML.exists())
-				deletedFeatures.add(feature.getFeatureIdentifier());
-		}
-		for(Iterator it=deletedFeatures.iterator(); it.hasNext();){
-			featureEntries.remove(it.next());
-		}
-	}
-	
-	private void validatePluginEntries() {
-		File root = new File(resolvedURL.getFile().replace('/', File.separatorChar));
-		Collection deletedPlugins = new ArrayList();
-		for (int i=0; i<pluginEntries.size(); i++) {
-			PluginEntry plugin = (PluginEntry)pluginEntries.get(i);
-			// Note: in the future, we can check for absolute url as well.
-			//       For now, feature url is plugins/org.eclipse.foo/plugin.xml
-			File pluginLocation = new File(root, plugin.getURL());
-			if (!pluginLocation.exists())
-				deletedPlugins.add(plugin);
-		}
-		for(Iterator it=deletedPlugins.iterator(); it.hasNext();){
-			pluginEntries.remove(it.next());
-		}
-	}
-	
-	public boolean isEnabled() {
-		return enabled;
-	}
-	
-	public void setEnabled(boolean enable) {
-		this.enabled = enable;
-	}
-	
-	public FeatureEntry getFeatureEntry(String id) {
-		FeatureEntry[] features = getFeatureEntries();
-		for (int i=0; i<features.length; i++)
-			if (features[i].getFeatureIdentifier().equals(id)) 
-				return features[i];
-		return null;
-	}
-	
-	
-	public boolean unconfigureFeatureEntry(IFeatureEntry feature) {
-		FeatureEntry existingFeature = getFeatureEntry(feature.getFeatureIdentifier());
-		if (existingFeature != null)
-			featureEntries.remove(existingFeature.getFeatureIdentifier());
-		return existingFeature != null;
-	}
-	
-	/*
-	 * This is a bit of a hack.
-	 * When no features were added to the site, but the site is initialized from platform.xml 
-	 * we need to set the feature set to empty, so we don't try to detect them.
-	 */
-	void initialized() { 
-		if (featureEntries == null)
-			featureEntries = new HashMap();
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/SitePolicy.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/SitePolicy.java
deleted file mode 100644
index 34988f8..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/SitePolicy.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.configurator.IPlatformConfiguration.*;
-
-
-public class SitePolicy implements IPlatformConfiguration.ISitePolicy {
-
-	private int type;
-	private String[] list;
-
-	public SitePolicy() {
-	}
-	public SitePolicy(int type, String[] list) {
-		if (type != ISitePolicy.USER_INCLUDE && type != ISitePolicy.USER_EXCLUDE && type != ISitePolicy.MANAGED_ONLY)
-			throw new IllegalArgumentException();
-		this.type = type;
-
-		if (list == null)
-			this.list = new String[0];
-		else
-			this.list = list;
-	}
-
-	/*
-	 * @see ISitePolicy#getType()
-	 */
-	public int getType() {
-		return type;
-	}
-
-	/*
-	* @see ISitePolicy#getList()
-	*/
-	public String[] getList() {
-		return list;
-	}
-
-	/*
-	 * @see ISitePolicy#setList(String[])
-	 */
-	public synchronized void setList(String[] list) {
-		if (list == null)
-			this.list = new String[0];
-		else
-			this.list = list;
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/UpdateURLDecoder.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/UpdateURLDecoder.java
deleted file mode 100644
index 6f4079d..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/UpdateURLDecoder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-
-public class UpdateURLDecoder {
-	static boolean init=false;
-	static boolean useEnc=true;
-	
-	public static String decode(String s, String enc) throws UnsupportedEncodingException {
-		if (!init) {
-			init = true;
-			try {
-				return URLDecoder.decode(s, enc);
-			} catch (NoSuchMethodError e) {
-				useEnc=false;				
-			}
-		}
-		
-		if (useEnc) {
-			return URLDecoder.decode(s, enc);
-		} else {
-			return URLDecoder.decode(s);
-		}
-
-	}
-
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Utils.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Utils.java
deleted file mode 100644
index abe5142..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/Utils.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.io.*;
-import java.net.URL;
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.framework.log.*;
-
-public class Utils {
-	private static final String KEY_PREFIX = "%"; //$NON-NLS-1$
-	private static final String KEY_DOUBLE_PREFIX = "%%"; //$NON-NLS-1$
-	static FrameworkLog log;
-	
-	public static void debug(String s) {
-		if (ConfigurationActivator.DEBUG)
-			System.out.println("PlatformConfig: " + s); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Creates a CoreException from some other exception.
-	 * The type of the CoreException is <code>IStatus.ERROR</code>
-	 * If the exception passed as a parameter is also a CoreException,
-	 * the new CoreException will contain all the status of the passed
-	 * CoreException.
-	 * 
-	 * @see IStatus#ERROR
-	 * @param s exception string
-	 * @param e actual exception being reported
-	 * @return a CoreException
-	 * @since 2.0
-	 */
-	public static CoreException newCoreException(String s, Throwable e) {
-
-		// check the case of a multistatus
-		IStatus status;
-		if (e instanceof CoreException) {
-			if (s == null)
-				s = ""; //$NON-NLS-1$
-			status = new MultiStatus("org.eclipse.update.configurator", 0, s, e); //$NON-NLS-1$
-			IStatus childrenStatus = ((CoreException) e).getStatus();
-			((MultiStatus) status).add(childrenStatus);
-			((MultiStatus) status).addAll(childrenStatus);
-		} else {
-			StringBuffer completeString = new StringBuffer(""); //$NON-NLS-1$
-			if (s != null)
-				completeString.append(s);
-			if (e != null) {
-				completeString.append(" ["); //$NON-NLS-1$
-				String msg = e.getLocalizedMessage();
-				completeString.append(msg!=null?msg:e.toString());
-				completeString.append("]"); //$NON-NLS-1$
-			}
-			status = newStatus(completeString.toString(), e);
-		}
-		return new CoreException(status); //$NON-NLS-1$
-	}
-
-	public static IStatus newStatus(String message, Throwable e) {
-		return new Status(IStatus.ERROR, "org.eclipse.update.configurator", IStatus.OK, message, e); //$NON-NLS-1$
-	}
-	
-	public static void log(String message) {
-		log(newStatus(message, null));
-	}
-	
-	public static void log(IStatus status) {
-		if (log != null) {
-			log.log(new FrameworkLogEntry(ConfigurationActivator.PI_CONFIGURATOR, status.getMessage(), 0, status.getException(), null));
-		} else {
-			System.out.println(status.getMessage());
-			if (status.getException() != null)
-				status.getException().printStackTrace();
-		}
-	}
-	
-	/**
-	 * Returns the url as a platform:/ url, if possible, else leaves it unchanged
-	 * @param url
-	 * @return
-	 */
-	public static URL asPlatformURL(URL url) {
-		try {
-			URL platformURL = new URL("platform:/base/"); //$NON-NLS-1$  // try using platform-relative URL
-			URL resolvedPlatformURL = Platform.asLocalURL(platformURL);
-			// TODO workaround bug in platform url resolution
-			if (resolvedPlatformURL.getProtocol().equals("file")) //$NON-NLS-1$
-				resolvedPlatformURL = new File(resolvedPlatformURL.getFile()).toURL();
-			String platformURLAsString = resolvedPlatformURL.toExternalForm();
-			String urlAsString = url.toExternalForm();
-			if (urlAsString.startsWith(platformURLAsString))
-				return new URL(platformURL.toExternalForm() + urlAsString.substring(platformURLAsString.length()) );
-			else
-				return url;
-		} catch (Exception e) {
-			return url;
-		}
-	}
-	
-
-	/**
-	 * 
-	 */
-	public static boolean isValidEnvironment(String os, String ws, String arch, String nl) {
-		if (os!=null && !isMatching(os, Platform.getOS())) return false;
-		if (ws!=null && !isMatching(ws, Platform.getWS())) return false;
-		if (arch!=null && !isMatching(arch, Platform.getOSArch())) return false;
-		if (nl!=null && !isMatchingLocale(nl, Platform.getNL())) return false;
-		return true;
-	}
-
-	/**
-	 * 
-	 */	
-	private static boolean isMatching(String candidateValues, String siteValues) {
-		if (siteValues==null) return false;
-		if ("*".equalsIgnoreCase(candidateValues)) return true; //$NON-NLS-1$
-		siteValues = siteValues.toUpperCase();		
-		StringTokenizer stok = new StringTokenizer(candidateValues, ","); //$NON-NLS-1$
-		while (stok.hasMoreTokens()) {
-			String token = stok.nextToken().toUpperCase();
-			if (siteValues.indexOf(token)!=-1) return true;
-		}
-		return false;
-	}
-	
-	/**
-	 * 
-	 */	
-	private static boolean isMatchingLocale(String candidateValues, String locale) {
-		if (locale==null) return false;
-		if ("*".equalsIgnoreCase(candidateValues)) return true; //$NON-NLS-1$
-		
-		locale = locale.toUpperCase();
-		candidateValues = candidateValues.toUpperCase();	
-		StringTokenizer stok = new StringTokenizer(candidateValues, ","); //$NON-NLS-1$
-		while (stok.hasMoreTokens()) {
-			String candidate = stok.nextToken();
-			if (locale.indexOf(candidate) == 0)
-				return true;
-			if (candidate.indexOf(locale) == 0)
-				return true;
-		}
-		return false;
-	}
-	
-	public static Locale getDefaultLocale() {
-		String nl = Platform.getNL();
-		// sanity test
-		if (nl == null)
-			return Locale.getDefault();
-		
-		// break the string into tokens to get the Locale object
-		StringTokenizer locales = new StringTokenizer(nl,"_"); //$NON-NLS-1$
-		if (locales.countTokens() == 1)
-			return new Locale(locales.nextToken(), ""); //$NON-NLS-1$
-		else if (locales.countTokens() == 2)
-			return new Locale(locales.nextToken(), locales.nextToken());
-		else if (locales.countTokens() == 3)
-			return new Locale(locales.nextToken(), locales.nextToken(), locales.nextToken());
-		else
-			return Locale.getDefault();
-	}
-	
-	
-	/**
-	 * 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 begining 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>
-	 *     resolveNLString(b,"Hello World") returns "Hello World"</li>
-	 *     resolveNLString(b,"%name") returns "Project Name"</li>
-	 *     resolveNLString(b,"%name Hello World") returns "Project Name"</li>
-	 *     resolveNLString(b,"%abcd Hello World") returns "Hello World"</li>
-	 *     resolveNLString(b,"%abcd") returns "%abcd"</li>
-	 *     resolveNLString(b,"%%name") returns "%name"</li>
-	 * </pre>
-	 * </p>
-	 * 
-	 * @param resourceBundle resource bundle.
-	 * @param string translatable string from model
-	 * @return string, or <code>null</code>
-	 * @since 2.0
-	 */
-	public static String getResourceString(ResourceBundle resourceBundle, String string) {
-
-		if (string == null)
-			return null;
-
-		String s = string.trim();
-
-		if (s.equals("")) //$NON-NLS-1$
-			return string;
-
-		if (!s.startsWith(KEY_PREFIX))
-			return string;
-
-		if (s.startsWith(KEY_DOUBLE_PREFIX))
-			return s.substring(1);
-
-		int ix = s.indexOf(" "); //$NON-NLS-1$
-		String key = ix == -1 ? s : s.substring(0, ix);
-		String dflt = ix == -1 ? s : s.substring(ix + 1);
-
-		if (resourceBundle == null)
-			return dflt;
-
-		try {
-			return resourceBundle.getString(key.substring(1));
-		} catch (MissingResourceException e) {
-			return dflt;
-		}
-	}
-
-	public static boolean isAutomaticallyStartedBundle(String bundleURL) {
-		if (bundleURL.indexOf("org.eclipse.osgi") != -1) //$NON-NLS-1$
-			return true;
-		
-		String osgiBundles = System.getProperty("osgi.bundles"); //$NON-NLS-1$
-		StringTokenizer st = new StringTokenizer(osgiBundles, ","); //$NON-NLS-1$
-		while (st.hasMoreTokens()) {
-			String token = st.nextToken().trim();
-			int index = token.indexOf('@');
-			if (index != -1)
-				token = token.substring(0,index);
-			if (token.startsWith("reference:file:")) { //$NON-NLS-1$
-				File f = new File(token.substring(15));
-				if (bundleURL.indexOf(f.getName()) != -1)
-					return true;
-			}
-			if (bundleURL.indexOf(token) != -1)
-				return true;
-		}
-		return false;
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/VersionedIdentifier.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/VersionedIdentifier.java
deleted file mode 100644
index 53d86c8..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/VersionedIdentifier.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator;
-
-import java.util.*;
-
-
-public class VersionedIdentifier {
-	private String identifier = ""; //$NON-NLS-1$
-	private int major = 0;
-	private int minor = 0;
-	private int service = 0;
-	private String qualifier = ""; //$NON-NLS-1$
-	private String version;
-
-	private static final String VER_SEPARATOR = "."; //$NON-NLS-1$
-	private static final String ID_SEPARATOR = "_"; //$NON-NLS-1$
-
-	public static final int LESS_THAN = -1;
-	public static final int EQUAL = 0;
-	public static final int EQUIVALENT = 1;
-	public static final int COMPATIBLE = 2;
-	public static final int GREATER_THAN = 3;
-
-	public VersionedIdentifier(String s) {
-		if (s == null || (s = s.trim()).equals("")) //$NON-NLS-1$
-			return;
-
-		int loc = s.lastIndexOf(ID_SEPARATOR);
-		if (loc != -1) {
-			this.identifier = s.substring(0, loc);
-			version = s.substring(loc + 1);
-			if(version==null)
-				version = "0.0.0";
-			parseVersion(version);
-		} else
-			this.identifier = s;
-	}
-	
-	public VersionedIdentifier(String id, String version) {
-		this(id+ID_SEPARATOR+ (version==null?"0.0.0":version) );
-		this.version = version;
-	}
-	
-	public String getVersion() {
-		return version;
-	}
-	
-	public String getIdentifier() {
-		return identifier;
-	}
-
-	public boolean equalIdentifiers(VersionedIdentifier id) {
-		if (id == null)
-			return identifier == null;
-		else
-			return id.identifier.equals(identifier);
-	}
-
-	public int compareVersion(VersionedIdentifier id) {
-
-		if (id == null) {
-			if (major == 0 && minor == 0 && service == 0)
-				return -1;
-			else
-				return 1;
-		}
-
-		if (major > id.major)
-			return GREATER_THAN;
-		if (major < id.major)
-			return LESS_THAN;
-		if (minor > id.minor)
-			return COMPATIBLE;
-		if (minor < id.minor)
-			return LESS_THAN;
-		if (service > id.service)
-			return EQUIVALENT;
-		if (service < id.service)
-			return LESS_THAN;
-		return compareQualifiers(qualifier, id.qualifier);
-	}
-
-	private int compareQualifiers(String q1, String q2) {
-		int result = q1.compareTo(q2);
-		if (result < 0)
-			return LESS_THAN;
-		else if (result > 0)
-			return EQUIVALENT;
-		else
-			return EQUAL;
-	}
-
-	private void parseVersion(String v) {
-		if (v == null || (v = v.trim()).equals("")) //$NON-NLS-1$
-			return;
-
-		try {
-			StringTokenizer st = new StringTokenizer(v, VER_SEPARATOR);
-			ArrayList elements = new ArrayList(4);
-
-			while (st.hasMoreTokens()) {
-				elements.add(st.nextToken());
-			}
-
-			if (elements.size() >= 1)
-				this.major = (new Integer((String) elements.get(0))).intValue();
-			if (elements.size() >= 2)
-				this.minor = (new Integer((String) elements.get(1))).intValue();
-			if (elements.size() >= 3)
-				this.service = (new Integer((String) elements.get(2))).intValue();
-			if (elements.size() >= 4)
-				this.qualifier = removeWhiteSpace((String) elements.get(3));
-
-		} catch (Exception e) {
-			// use what we got so far ...
-		}
-	}
-
-	private String removeWhiteSpace(String s) {
-		char[] chars = s.trim().toCharArray();
-		boolean whitespace = false;
-		for (int i = 0; i < chars.length; i++) {
-			if (Character.isWhitespace(chars[i])) {
-				chars[i] = '_';
-				whitespace = true;
-			}
-		}
-		return whitespace ? new String(chars) : s;
-	}
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (!(obj instanceof VersionedIdentifier))
-			return false;
-		
-		VersionedIdentifier other = (VersionedIdentifier)obj;
-		return equalIdentifiers(other) &&
-			this.major == other.major &&
-			this.minor == other.minor &&
-			this.service == other.service &&
-			compareQualifiers(this.qualifier, other.qualifier) == EQUAL;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return (identifier + "_" + version).hashCode();
-	}
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return identifier + "_" + version;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/XMLPrintHandler.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/XMLPrintHandler.java
deleted file mode 100644
index 5356367..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/XMLPrintHandler.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.internal.configurator;
-
-import java.io.*;
-
-import org.w3c.dom.*;
-
-
-public class XMLPrintHandler {
-	//	used to print XML file
-	public static final String XML_COMMENT_END_TAG = "-->";
-	public static final String XML_COMMENT_BEGIN_TAG = "<!--";
-	public static final String XML_HEAD = "<?xml version=\"1.0\" encoding=\"";
-	public static final String XML_HEAD_END_TAG = "?>";
-	public static final String XML_DBL_QUOTES = "\"";
-	public static final String XML_SPACE = " ";
-	public static final String XML_BEGIN_TAG = "<";
-	public static final String XML_END_TAG = ">";
-	public static final String XML_EQUAL = "=";
-	public static final String XML_SLASH = "/";
-
-	public static void printBeginElement(Writer xmlWriter, String elementString) throws IOException{
-		StringBuffer temp = new StringBuffer(XML_BEGIN_TAG);
-		temp.append(elementString).append(XML_END_TAG).append("\n");
-		xmlWriter.write(temp.toString());
-
-	}
-
-	public static void printEndElement(Writer xmlWriter, String elementString) throws IOException{
-		StringBuffer temp = new StringBuffer(XML_BEGIN_TAG);
-		temp.append(XML_SLASH).append(elementString).append(XML_END_TAG).append("\n");
-		xmlWriter.write(temp.toString());
-
-	}
-
-	
-	public static void printText(Writer xmlWriter, String text) throws IOException{
-		xmlWriter.write(encode(text).toString());
-	}
-
-	public static void printComment(Writer xmlWriter, String comment)throws IOException {
-		StringBuffer temp = new StringBuffer(XML_COMMENT_BEGIN_TAG);
-		temp.append(encode(comment).toString()).append(XML_COMMENT_END_TAG).append("\n");
-		xmlWriter.write(temp.toString());
-	}
-
-	public static void printHead(Writer xmlWriter, String encoding) throws IOException {
-		StringBuffer temp = new StringBuffer(XML_HEAD);
-		temp.append(encoding).append(XML_DBL_QUOTES).append(XML_HEAD_END_TAG).append("\n");
-		xmlWriter.write(temp.toString());
-	}
-
-	public static String wrapAttributeForPrint(String attribute, String value) throws IOException {
-		StringBuffer temp = new StringBuffer(XML_SPACE);
-		temp.append(attribute).append(XML_EQUAL).append(XML_DBL_QUOTES)
-				.append(encode(value).toString()).append(XML_DBL_QUOTES);
-		return temp.toString();
-
-	}
-
-	public static void printNode(Writer xmlWriter, Node node,String encoding)  throws Exception{
-		if (node == null) {
-			return;
-		}
-
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_NODE: {
-			printHead(xmlWriter,encoding);
-			printNode(xmlWriter, ((Document) node).getDocumentElement(),encoding);
-			break;
-		}
-		case Node.ELEMENT_NODE: {
-			//get the attribute list for this node.
-			StringBuffer tempElementString = new StringBuffer(node.getNodeName());
-			NamedNodeMap attributeList = node.getAttributes();
-			if ( attributeList != null ) {
-				for(int i= 0; i <attributeList.getLength();i++){
-					Node attribute = attributeList.item(i);
-					tempElementString.append(wrapAttributeForPrint(attribute.getNodeName(),attribute.getNodeValue()));
-				}
-			}
-			printBeginElement(xmlWriter,tempElementString.toString());
-			
-			// do this recursively for the child nodes.
-			NodeList childNodes = node.getChildNodes();
-			if (childNodes != null) {
-				int length = childNodes.getLength();
-				for (int i = 0; i < length; i++) {
-					printNode(xmlWriter, childNodes.item(i),encoding);
-				}
-			}
-			
-			printEndElement(xmlWriter,node.getNodeName());
-			break;
-		}
-		
-		case Node.TEXT_NODE: {
-			xmlWriter.write(encode(node.getNodeValue()).toString());
-			break;
-		}
-		default: {
-			throw new UnsupportedOperationException("Unsupported XML Node Type.");
-			
-		}
-		}
-
-	}
-
-	public static StringBuffer encode(String value) {
-		StringBuffer buf = new StringBuffer();
-		for (int i = 0; i < value.length(); i++) {
-			char c = value.charAt(i);
-			switch (c) {
-				case '&' :
-					buf.append("&amp;"); //$NON-NLS-1$
-					break;
-				case '<' :
-					buf.append("&lt;"); //$NON-NLS-1$
-					break;
-				case '>' :
-					buf.append("&gt;"); //$NON-NLS-1$
-					break;
-				case '\'' :
-					buf.append("&apos;"); //$NON-NLS-1$
-					break;
-				case '\"' :
-					buf.append("&quot;"); //$NON-NLS-1$
-					break;
-				default :
-					buf.append(c);
-					break;
-			}
-		}
-		return buf;
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/AboutInfo.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/AboutInfo.java
deleted file mode 100644
index dd2b59f..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/AboutInfo.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator.branding;
-
-import java.net.*;
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-
-
-/**
- * The information within this object is obtained from the about INI file.
- * This file resides within an install configurations directory and must be a 
- * standard java property file.  
- * <p>
- * This class is not intended to be instantiated or subclassed by clients.
- * </p>
- */
-public final class AboutInfo {
-	private final static String INI_FILENAME = "about.ini"; //$NON-NLS-1$
-	private final static String PROPERTIES_FILENAME = "about.properties"; //$NON-NLS-1$
-	private final static String MAPPINGS_FILENAME = "about.mappings"; //$NON-NLS-1$
-
-	private String featureId;
-	private String versionId = ""; //$NON-NLS-1$
-	private String featurePluginLabel;
-	private String providerName;
-	private String appName;
-	private URL windowImageURL;
-	private URL[] windowImagesURLs;
-	private URL aboutImageURL;
-	private URL featureImageURL;
-	private URL welcomePageURL;
-	private String aboutText;
-	private String welcomePerspective;
-	private String tipsAndTricksHref;
-
-
-	/*
-	 * Create a new about info for a feature with the given id.
-	 */
-	/* package */ AboutInfo(String featureId) {
-		super();
-		this.featureId = featureId;
-	}
-
-	/**
-	 * Returns the configuration information for the feature with the 
-	 * given id.
-	 * 
-	 * @param featureId the feature id
-	 * @param versionId the version id (of the feature)
-	 * @param pluginId the plug-in id
-	 * @return the configuration information for the feature
-	 */
-	public static AboutInfo readFeatureInfo(String featureId, String versionId, String pluginId) {
-//		Assert.isNotNull(featureId);
-//		Assert.isNotNull(versionId);
-//		Assert.isNotNull(pluginId);
-		IniFileReader reader = new IniFileReader(featureId, pluginId, INI_FILENAME, PROPERTIES_FILENAME, MAPPINGS_FILENAME);
-		IStatus status = reader.load();
-// bug 78031
-//		if (!status.isOK()) {
-//			//return null;
-//			return new AboutInfo(featureId); // dummy about info
-//		}
-		
-		AboutInfo info = new AboutInfo(featureId);
-		Hashtable runtimeMappings  = new Hashtable();
-		runtimeMappings.put("{featureVersion}", versionId); //$NON-NLS-1$
-		info.versionId = versionId;
-		info.featurePluginLabel = reader.getFeaturePluginLabel();
-		info.providerName = reader.getProviderName();
-		info.appName = reader.getString("appName", true, runtimeMappings); //$NON-NLS-1$
-		info.aboutText = reader.getString("aboutText", true, runtimeMappings); //$NON-NLS-1$
-		info.windowImageURL = reader.getURL("windowImage"); //$NON-NLS-1$
-		// look for the newer array, but if its not there then use the older,
-		// single image definition
-		info.windowImagesURLs = reader.getURLs("windowImages"); //$NON-NLS-1$
-		info.aboutImageURL = reader.getURL("aboutImage"); //$NON-NLS-1$
-		info.featureImageURL = reader.getURL("featureImage"); //$NON-NLS-1$
-		info.welcomePageURL = reader.getURL("welcomePage"); //$NON-NLS-1$
-		info.welcomePerspective = reader.getString("welcomePerspective", false, runtimeMappings); //$NON-NLS-1$
-		info.tipsAndTricksHref = reader.getString("tipsAndTricksHref", false, runtimeMappings); //$NON-NLS-1$
-		return info;
-	}
-	
-	/**
-	 * Returns the URL for an image which can be shown in an "about" dialog 
-	 * for this product. Products designed to run "headless" typically would not 
-	 * have such an image.
-	 * 
-	 * @return the URL for an about image, or <code>null</code> if none
-	 */
-	public URL getAboutImageURL() {
-		return aboutImageURL;
-	}
-
-	/**
-	 * Returns the URL for an image which can be shown in an "about features" 
-	 * dialog. Products designed to run "headless" typically would not have such an image.
-	 * 
-	 * @return the URL for a feature image, or <code>null</code> if none
-	 */
-	public URL getFeatureImageURL() {
-		return featureImageURL;
-	}
-
-	/**
-	 * Returns the simple name of the feature image file.
-	 * 
-	 * @return the simple name of the feature image file,
-	 * or <code>null</code> if none
-	 */
-	public String getFeatureImageName() {
-		if (featureImageURL != null) {
-			IPath path = new Path(featureImageURL.getPath());
-			return path.lastSegment();
-		} else {
-			return null;
-		}
-	}
-
-		
-	/**
-	 * Returns a label for the feature plugn, or <code>null</code>.
-	 */
-	public String getFeatureLabel() {
-		return featurePluginLabel;
-	}
-
-	/**
-	 * Returns the id for this feature.
-	 * 
-	 * @return the feature id
-	 */
-	public String getFeatureId() {
-		return featureId;
-	}
-	
-	/**
-	 * Returns the text to show in an "about" dialog for this product.
-	 * Products designed to run "headless" typically would not have such text.
-	 * 
-	 * @return the about text, or <code>null</code> if none
-	 */
-	public String getAboutText() {
-		return aboutText;
-	}
-
-	/**
-	 * Returns the application name or <code>null</code>.
-	 * Note this is never shown to the user.
-	 * It is used to initialize the SWT Display.
-	 * <p>
-	 * On Motif, for example, this can be used
-	 * to set the name used for resource lookup.
-	 * </p>
-	 *
-	 * @return the application name, or <code>null</code>
-	 */
-	public String getAppName() {
-		return appName;
-	}
-
-	/**
-	 * Returns the product name or <code>null</code>.
-	 * This is shown in the window title and the About action.
-	 *
-	 * @return the product name, or <code>null</code>
-	 */
-	public String getProductName() {
-		return featurePluginLabel;
-	}
-
-	/**
-	 * Returns the provider name or <code>null</code>.
-	 *
-	 * @return the provider name, or <code>null</code>
-	 */
-	public String getProviderName() {
-		return providerName;
-	}
-
-	/**
-	 * Returns the feature version id.
-	 *
-	 * @return the version id of the feature
-	 */
-	public String getVersionId() {
-		return versionId;
-	}
-
-	/**
-	 * Returns a <code>URL</code> for the welcome page.
-	 * Products designed to run "headless" typically would not have such an page.
-	 * 
-	 * @return the welcome page, or <code>null</code> if none
-	 */
-	public URL getWelcomePageURL() {
-		return welcomePageURL;
-	}
-
-	/**
-	 * Returns the ID of a perspective in which to show the welcome page.
-	 * May be <code>null</code>.
-	 * 
-	 * @return the welcome page perspective id, or <code>null</code> if none
-	 */
-	public String getWelcomePerspectiveId() {
-		return welcomePerspective;
-	}
-
-	/**
-	 * Returns a <code>String</code> for the tips and trick href.
-	 * 
-	 * @return the tips and tricks href, or <code>null</code> if none
-	 */
-	public String getTipsAndTricksHref() {
-		return tipsAndTricksHref;
-	}
-
-	/**
-	 * Returns the image url for the window image to use for this product.
-	 * Products designed to run "headless" typically would not have such an image.
-	 * 
-	 * @return the image url for the window image, or <code>null</code> if none
-	 */
-	public URL getWindowImageURL() {
-		return windowImageURL;
-	}
-	
-	/**
-	 * Return an array of image URLs for the window images to use for
-	 * this product. The expectations is that the elements will be the same
-	 * image rendered at different sizes. Products designed to run "headless"
-	 * typically would not have such images.
-	 * 
-	 * @return an array of the image descriptors for the window images, or
-	 *         <code>null</code> if none
-	 * @since 3.0
-	 */
-	public URL[] getWindowImagesURLs() {
-		return windowImagesURLs;
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/IBundleGroupConstants.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/IBundleGroupConstants.java
deleted file mode 100644
index 45179c0..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/IBundleGroupConstants.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator.branding;
-
-/**
- * These constants define the set of properties that the UI expects to
- * be available via <code>IBundleGroup.getProperty(String)</code>.
- * 
- * @since 3.0
- * @see org.eclipse.core.runtime.IBundleGroup#getProperty(String)
- */
-public interface IBundleGroupConstants {
-	/**
-	 * An image which can be shown in an "about features" dialog (32x32).
-	 */
-	public static final String FEATURE_IMAGE = "featureImage"; //$NON-NLS-1$
-
-	/**
-	 * A help reference for the feature's tips and tricks page (optional).
-	 */
-	public static final String TIPS_AND_TRICKS_HREF = "tipsAndTricksHref"; //$NON-NLS-1$
-
-	/**
-	 * A URL for the feature's welcome page (special XML-based format)
-     * ($nl$/ prefix to permit locale-specific translations of entire file).
-	 * Products designed to run "headless" typically would not have such a page.
-	 */
-	public static final String WELCOME_PAGE = "welcomePage"; //$NON-NLS-1$
-
-	/**
-	 * The id of a perspective in which to show the welcome page
-	 * (optional).
-	 */
-	public static final String WELCOME_PERSPECTIVE = "welcomePerspective"; //$NON-NLS-1$
-	
-	/**
-	 * The URL of the license page for the feature
-	 * (optional).
-	 */
-	public static final String LICENSE_HREF = "licenseHref"; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/IProductConstants.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/IProductConstants.java
deleted file mode 100644
index 179ef52..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/IProductConstants.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator.branding;
-
-/**
- * These constants define the set of properties that the UI expects to
- * be available via <code>IProduct.getProperty(String)</code>.
- * 
- * @since 3.0
- * @see org.eclipse.core.runtime.IProduct#getProperty(String)
- */
-public interface IProductConstants {
-	/**
-	 * The application name, used to initialize the SWT Display.  This
-	 * value is distinct from the string displayed in the application
-	 * title bar.
-	 * <p>
-	 * E.g., On motif, this can be used to set the name used for
-	 * resource lookup.
-	 * </p>
-	 */
-	public static final String APP_NAME = "appName"; //$NON-NLS-1$
-
-	/**
-	 * The text to show in an "about" dialog for this product.
-	 * Products designed to run "headless" typically would not
-	 * have such text.
-	 */
-	public static final String ABOUT_TEXT = "aboutText"; //$NON-NLS-1$
-
-	/**
-	 * An image which can be shown in an "about" dialog for this
-	 * product. Products designed to run "headless" typically would not 
-	 * have such an image.
-	 * <p>
-     * A full-sized product image (no larger than 500x330 pixels) is
-     * shown without the "aboutText" blurb.  A half-sized product image
-     * (no larger than 250x330 pixels) is shown with the "aboutText"
-     * blurb beside it.
-     */
-	public static final String ABOUT_IMAGE = "aboutImage"; //$NON-NLS-1$
-
-	/**
-	 * An image to be used as the window icon for this product (16x16).  
-	 * Products designed to run "headless" typically would not have such an image.
-	 * <p>
-	 * If the <code>WINDOW_IMAGES</code> property is given, then it supercedes
-	 * this one.
-	 * </p>
-	 */
-	public static final String WINDOW_IMAGE = "windowImage"; //$NON-NLS-1$
-
-	/**
-	 * An array of one or more images to be used for this product.  The
-	 * expectation is that the array will contain the same image rendered
-	 * at different sizes (16x16 and 32x32).  
-	 * Products designed to run "headless" typically would not have such images.
-	 * <p>
-	 * If this property is given, then it supercedes <code>WINDOW_IMAGE</code>.
-	 * </p>
-	 */
-	public static final String WINDOW_IMAGES = "windowImages"; //$NON-NLS-1$
-	/**
-	 * A URL for the products's welcome page (special XML-based format)
-	 * ($nl$/ prefix to permit locale-specific translations of entire file).
-	 * Products designed to run "headless" typically would not have such a page.
-	 */
-	public static final String WELCOME_PAGE = "welcomePage";  //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/IniFileReader.java b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/IniFileReader.java
deleted file mode 100644
index 72e2235..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/branding/IniFileReader.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.configurator.branding;
-
-import java.io.*;
-import java.net.*;
-import java.text.*;
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.internal.configurator.*;
-import org.osgi.framework.*;
-
-/**
- * Reads the information found in an "INI" file. This file must be in a
- * standard Java properties format. A properties file may also be provided
- * to NL values in the INI file - values must start with the % prefix. A
- * mapping file may also be provided that contains "fill-ins" for the
- * properties file - format being "n = some text", where n is a number.
- */
-public class IniFileReader {
-	private static final String PID = "org.eclipse.update.configurator"; //$NON-NLS-1$
-	private static final Status OK_STATUS = new Status(IStatus.OK, PID, 0, "", null); //$NON-NLS-1$
-	private static final String KEY_PREFIX = "%"; //$NON-NLS-1$
-	private static final String KEY_DOUBLE_PREFIX = "%%"; //$NON-NLS-1$
-	private static final String NLS_TAG = "$nl$"; //$NON-NLS-1$
-
-	private String featureId;
-	private String pluginId;
-	private String iniFilename;
-	private String propertiesFilename;
-	private String mappingsFilename;
-	private Properties ini = null;
-	private PropertyResourceBundle properties = null;
-	private String[] mappings = null;
-	private Bundle bundle;
-
-	/**
-	 * Creates an INI file reader that can parse the contents into key,value pairs.
-	 * 
-	 * @param featureId the unique identifier of the feature, must not be <code>null</code>
-	 * @param pluginId the unique identifier of the feature plug-in, must not be <code>null</code>
-	 * @param iniFilename the INI file name, must not be <code>null</code>
-	 * @param propertiesFilename the properties filename, can be <code>null</code> if not required
-	 * @param mappingsFilename the mappings filename, can be <code>null</code> if not required
-	 */
-	public IniFileReader(String featureId, String pluginId, String iniFilename, String propertiesFilename, String mappingsFilename) {
-		super();
-		
-		if (featureId == null || pluginId == null || iniFilename == null) {
-			throw new IllegalArgumentException();
-		}
-			
-		this.featureId = featureId;
-		this.pluginId = pluginId;
-		this.iniFilename = iniFilename;
-		this.propertiesFilename = propertiesFilename;
-		this.mappingsFilename = mappingsFilename;
-	}
-
-	/**
-	 * Read the contents of the INI, properties, and mappings files.
-	 * Does nothing if the content has already been read and parsed.
-	 * 
-	 * @return an <code>IStatus</code> indicating the success or failure
-	 * 	of reading and parsing the INI file content
-	 */
-	public IStatus load() {
-		if (ini != null)
-			return OK_STATUS;
-			
-		// attempt to locate the corresponding plugin
-		bundle = Platform.getBundle(pluginId);
-		if (bundle == null || bundle.getState() == Bundle.UNINSTALLED || bundle.getState() == Bundle.INSTALLED) {
-			bundle = null; // make it null for other test down the road
-			String message = Messages.getString("IniFileReader.MissingDesc", featureId);  //$NON-NLS-1$
-			return new Status(IStatus.ERROR, PID, 0, message, null);
-		}
-
-		// Determine the ini file location
-		URL iniURL = null;
-		IOException ioe = null;
-		try {
-			iniURL = Platform.find(bundle, new Path(NLS_TAG).append(iniFilename));
-			if (iniURL != null)
-				iniURL = Platform.resolve(iniURL);
-		} catch (IOException e) {
-			ioe = e;
-		}
-		if (iniURL == null) {
-			String message = Messages.getString("IniFileReader.OpenINIError", iniFilename);  //$NON-NLS-1$
-			return new Status(IStatus.ERROR, PID, 0, message, ioe);
-		}
-		
-		// Determine the properties file location
-		URL propertiesURL = null;
-		if (propertiesFilename != null & propertiesFilename.length() > 0) {
-			try {
-				propertiesURL = Platform.find(bundle, new Path(NLS_TAG).append(propertiesFilename));
-				if (propertiesURL != null)
-					propertiesURL = Platform.resolve(propertiesURL);
-			} catch (IOException e) {
-				String message = Messages.getString("IniFileReader.OpenPropError", propertiesFilename); //$NON-NLS-1$
-				return new Status(IStatus.ERROR, PID, 0, message, e);
-			}
-		}
-
-		// Determine the mappings file location
-		URL mappingsURL = null;
-		if (mappingsFilename != null && mappingsFilename.length() > 0) {
-			try {
-				mappingsURL = Platform.find(bundle, new Path(NLS_TAG).append(mappingsFilename));
-				if (mappingsURL != null)
-					mappingsURL = Platform.resolve(mappingsURL);
-			} catch (IOException e) {
-				String message = Messages.getString("IniFileReader.OpenMapError", mappingsFilename); //$NON-NLS-1$
-				return new Status(IStatus.ERROR, PID, 0, message, e);
-			}
-		}
-
-		// OK to pass null properties and/or mapping file
-		return load(iniURL, propertiesURL, mappingsURL);
-	}
-		
-	/**
-	 * Returns the string value for the given key, or <code>null</code>.
-	 * The string value is NLS if requested.
-	 * 
-	 * @return the string value for the given key, or <code>null</code>
-	 */
-	public String getString(String key, boolean doNls, Hashtable runtimeMappings) {
-		if (ini == null)
-			return null;
-		String value = ini.getProperty(key);
-		if (value != null && doNls)
-			return getResourceString(value, runtimeMappings);
-		return value;
-	}
-
-
-	/**
-	 * Returns a URL for the given key, or <code>null</code>.
-	 * 
-	 * @return a URL for the given key, or <code>null</code>
-	 */
-	public URL getURL(String key) {
-		if (ini == null)
-			return null;
-
-		URL url = null;
-		String fileName = ini.getProperty(key);
-		if (fileName != null) {
-			if (bundle == null)
-				return null;
-			url = Platform.find(bundle, new Path(fileName));
-		}
-		return url;
-	}
-	
-	/**
-	 * Returns a array of URL for the given key, or <code>null</code>. The
-	 * property value should be a comma separated list of urls, tokens for
-	 * which bundle cannot build an url will have a null entry.
-	 * 
-	 * @param key name of the property containing the requested urls
-	 * @return a URL for the given key, or <code>null</code>
-	 * @since 3.0
-	 */
-	public URL[] getURLs(String key) {
-		if (ini == null || bundle == null)
-			return null;
-
-		String value = ini.getProperty(key);
-		if (value == null)
-			return null;
-
-		StringTokenizer tokens = new StringTokenizer(value, ","); //$NON-NLS-1$
-		ArrayList array = new ArrayList(10);
-		while (tokens.hasMoreTokens()) {
-			String str = tokens.nextToken().trim();
-			array.add(Platform.find(bundle, new Path(str)));
-		}
-
-		URL[] urls = new URL[array.size()];
-		array.toArray(urls);
-		return urls;
-	}
-
-	/**
-	 * Returns the feature plugin label, or <code>null</code>.
-	 * 
-	 * @return the feature plugin lable, or <code>null</code> if none.
-	 */
-	public String getFeaturePluginLabel() {
-		if (bundle == null)
-			return null;
-		else {
-			return (String)bundle.getHeaders().get(Constants.BUNDLE_NAME);
-		}
-	}
-	
-	/**
-	 * Returns the provider name for this feature, or <code>null</code>.
-	 * 
-	 * @return the provider name for this feature, or <code>null</code>
-	 */
-	public String getProviderName() {
-		if (bundle == null)
-			return null;
-		else {
-			return (String)bundle.getHeaders().get(Constants.BUNDLE_VENDOR);
-		}
-	}
-	
-	/*
-	 * 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 begining 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>
-	 *     <li>getResourceString("Hello World") returns "Hello World"</li>
-	 *     <li>getResourceString("%name") returns "Project Name"</li>
-	 *     <li>getResourceString("%name Hello World") returns "Project Name"</li>
-	 *     <li>getResourceString("%abcd Hello World") returns "Hello World"</li>
-	 *     <li>getResourceString("%abcd") returns "%abcd"</li>
-	 *     <li>getResourceString("%%name") returns "%name"</li>
-	 *     <li>getResourceString(<code>null</code>) returns <code>null</code></li>
-	 * </pre>
-	 * </p>
-	 *
-	 * @param value the value or <code>null</code>
-	 * @param runtimeMappings runtime mappings or <code>null</code>
-	 * @return the resource string
-	 */
-	 public String getResourceString(String value, Hashtable runtimeMappings) {
-		
-		if (value == null)
-			return null;
-		String s = value.trim();
-
-		if (!s.startsWith(KEY_PREFIX))
-			return s;
-
-		if (s.startsWith(KEY_DOUBLE_PREFIX))
-			return s.substring(1);
-
-		int ix = s.indexOf(" "); //$NON-NLS-1$
-		String key = ix == -1 ? s : s.substring(0, ix);
-		String dflt = ix == -1 ? s : s.substring(ix + 1);
-
-		if (properties == null)
-			return dflt;
-
-		String result = null;
-		try {
-			result = properties.getString(key.substring(1));
-		} catch (MissingResourceException e) {
-			return dflt;
-		}
-		if (runtimeMappings != null) {
-			for (Enumeration e = runtimeMappings.keys(); e.hasMoreElements();) {
-				String keyValue = (String) e.nextElement();
-				int i = result.indexOf(keyValue);
-				if (i != -1) {
-					String s1 = result.substring(0,i);
-					String s2 = (String) runtimeMappings.get(keyValue);
-					String s3 = result.substring(i+keyValue.length());
-					result = s1 + s2 + s3;
-				}
-			}
-		}
-	
-		if (result.indexOf('{') != -1) {
-			// We test for the curly braces since due to NL issues we do not
-			// want to use MessageFormat unless we have to.
-			result = MessageFormat.format(result, mappings);
-		}
-		
-		return result;	
-	}
-
-	/*
-	 * Read the contents of the ini, properties, and mappings files.
-	 */
-	private IStatus load(URL iniURL, URL propertiesURL, URL mappingsURL) {
-
-		InputStream is = null;
-		try {
-			is = iniURL.openStream();
-			ini = new Properties();
-			ini.load(is);
-		} catch (IOException e) {
-			ini = null;
-			String message = Messages.getString("IniFileReader.ReadIniError", iniURL.toExternalForm()); //$NON-NLS-1$
-			return new Status(IStatus.ERROR, PID, 0, message, e);
-		} finally {
-			try {
-				if (is != null)
-					is.close();
-			} catch (IOException e) {
-			}
-		}
-
-		if (propertiesURL != null) {
-			is = null;
-			try {
-				is = propertiesURL.openStream();
-				properties = new PropertyResourceBundle(is);
-			} catch (IOException e) {
-				properties = null;
-				String message = Messages.getString("IniFileReader.ReadPropError", propertiesURL.toExternalForm()); //$NON-NLS-1$
-				return new Status(IStatus.ERROR, PID, 0, message, e);
-			} finally {
-				try {
-					if (is != null)
-						is.close();
-				} catch (IOException e) {
-				}
-			}
-		}
-
-		PropertyResourceBundle bundle = null;
-		if (mappingsURL != null) {
-			is = null;
-			try {
-				is = mappingsURL.openStream();
-				bundle = new PropertyResourceBundle(is);
-			} catch (IOException e) {
-				bundle = null;
-				String message = Messages.getString("IniFileReader.ReadMapError", mappingsURL.toExternalForm()); //$NON-NLS-1$
-				return new Status(IStatus.ERROR, PID, 0, message, e);
-			} finally {
-				try {
-					if (is != null)
-						is.close();
-				} catch (IOException e) {
-				}
-			}
-		}
-
-		ArrayList mappingsList = new ArrayList();
-		if (bundle != null) {
-			boolean found = true;
-			int i = 0;
-			while (found) {
-				try {
-					mappingsList.add(bundle.getString(Integer.toString(i)));
-				} catch (MissingResourceException e) {
-					found = false;
-				}
-				i++;
-			}
-		}
-		mappings = (String[])mappingsList.toArray(new String[mappingsList.size()]);
-		
-		return OK_STATUS;
-	}
-}
diff --git a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/messages.properties b/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/messages.properties
deleted file mode 100644
index 639b480..0000000
--- a/update/org.eclipse.update.configurator/src/org/eclipse/update/internal/configurator/messages.properties
+++ /dev/null
@@ -1,93 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-### Boot plugin message catalog
-
-ok = OK
-
-### URL
-url.badVariant=Unsupported \"platform:\" protocol variation {0}
-url.invalidURL=Invalid "platform:" URL {0}
-url.createConnection=Unable to create connection {0}
-url.noaccess=Unable to access URL as local {0}.
-
-### Platform Configuration
-cfig.inUse=\nConfiguration file \"{0}\" is in use by another instance of the platform, \n\
-	or there was a failure in deleting the old lock file.  If no other platform instances are running, \n\
-	delete file \"{1}\" and try starting the platform again.
-cfig.failCreateLock=Failed to create lock for configuration file \"{0}\"
-cfig.badUrlArg=Bad -configuration argument \"{0}\"
-cfig.unableToLoad.incomplete=Unable to load {0}
-cfig.unableToLoad.noURL=Configuration file location not specified
-cfig.unableToSave.noURL=Configuration file save location not specified
-cfig.unableToSave=Unable to save configuration file \"{0}\"
-cfig.badVersion=Unsupported configuration version \"{0}\"
-cfg.unableToCreateConfig.ini = Unable to create config.ini
-
-platform.running=The Platform is already running.
-platform.mustNotBeRunning=The Platform must not be running.
-platform.notRunning=The Platform is not running.
-
-ignore.plugin=Ignoring invalid plug-in location: {0}.
-application.notFound=Application not found: {0}.
-error.fatal=Fatal Error: Unable to determine platform installation URL {0}.
-error.boot=Fatal Error: Unable to locate boot.xml file for executing org.eclipse.core.boot.
-error.runtime=Fatal Error: Unable to locate matching org.eclipse.core.runtime plug-in.
-error.xerces=Fatal Error: Unable to locate matching org.apache.xerces plug-in.
-error.badNL=Bad value: \"{0}\" for NL. Using system default.
-
-InstalledSiteParser.DirectoryDoesNotExist=The directory \"{0}\" does not exist on the file system.
-InstalledSiteParser.UnableToCreateURL= Internal Error. Unable to create URL from \"{0}\".
-InstalledSiteParser.FileDoesNotExist= The file \"{0}\" does not exist.
-InstalledSiteParser.UnableToCreateURLForFile= Unable to create URL from \"{0}\".
-InstalledSiteParser.ErrorParsingFile= Unable to parse file \"{0}\".
-InstalledSiteParser.ErrorAccessing= Unable to access file \"{0}\".
-InstalledSiteParser.date = Invalid date attribute {0}
-BundleManifest.noVersion = {0} attribute not found in manifest for bundle \"{1}\".  Bundle will be ignored.
-
-FeatureParser.IdOrVersionInvalid= Error parsing feature stream. The unique identifier or the version is null or empty: unique identifier=\"{0}\" version=\"{1}\".
-
-BundleGroupProvider=Update Manager Configurator
-ProductProvider=Update Manager Configurator
-
-AboutInfo.notSpecified=Unspecified
-ConfigurationActivator.initialize=Cannot initialize the Update Configurator
-ConfigurationActivator.createConfig=Cannot create configuration in {0}
-ConfigurationActivator.uninstallBundle=Could not uninstall unused bundle {0} 
-ConfigurationParser.cannotLoadSharedInstall=Could not load from shared install
-ConfigurationActivator.installBundle=Could not install bundle {0}
-PluginEntry.versionError=Unable to create versioned identifier: {0} {1}
-
-IniFileReader.MissingDesc = Cannot find plugin for feature {0}
-IniFileReader.OpenINIError = Cannot open branding file {0}
-IniFileReader.OpenPropError = Cannot open branding properties file {0}
-IniFileReader.OpenMapError = Cannot open mapping file {0}
-IniFileReader.ReadIniError = Error reading branding file {0}
-IniFileReader.ReadPropError = Error reading branding properties file {0}
-IniFileReader.ReadMapError = Error reading mapping files {0}
-
-SiteEntry.computePluginStamp = Cannot compute plugins change stamp for site {0} because it does not support plugin detection.
-SiteEntry.cannotFindFeatureInDir=Unable to find feature.xml in directory: {0}
-SiteEntry.duplicateFeature=Duplicate feature found on site {0} : {1}
-SiteEntry.pluginsDir = {0} is not a valid plugins directory.
-PlatformConfiguration.expectingPlatformXMLorDirectory=Either specify the configuration directory or a file named platform.xml 
-PlatformConfiguration.cannotBackupConfig=Cannot backup current configuration
-PlatformConfiguration.cannotCloseStream=Could not close output stream for 
-PlatformConfiguration.cannotCloseTempFile=Could not close output stream for temp file 
-PlatformConfiguration.cannotRenameTempFile=Could not rename configuration temp file
-PlatformConfiguration.cannotLoadConfig=Cannot load configuration from 
-PlatformConfiguration.cannotLoadDefaultSite=Cannot load default site 
-PlatformConfiguration.cannotFindConfigFile=Platform configuration file cannot be found
-PlatformConfiguration.cannotSaveNonExistingConfig=Configuration cannot be saved because it does not exist
-HttpResponse.rangeExpected=Server returned full content instead of a range.
-HttpResponse.wrongRange=Server returned wrong range
-
-PluginParser.plugin_no_id = Plugin does not have a valid identifier: {0}
-PluginParser.pluing_no_version = Plugin does not have a valid version: {0}
\ No newline at end of file
diff --git a/update/org.eclipse.update.core.linux/.classpath b/update/org.eclipse.update.core.linux/.classpath
deleted file mode 100644
index 4848249..0000000
--- a/update/org.eclipse.update.core.linux/.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/update/org.eclipse.update.core.linux/.cvsignore b/update/org.eclipse.update.core.linux/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/update/org.eclipse.update.core.linux/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/update/org.eclipse.update.core.linux/.project b/update/org.eclipse.update.core.linux/.project
deleted file mode 100644
index 178e2b7..0000000
--- a/update/org.eclipse.update.core.linux/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.core.linux</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.update.configurator</project>
-		<project>org.eclipse.update.core</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.core.linux/about.html b/update/org.eclipse.update.core.linux/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/update/org.eclipse.update.core.linux/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.core.linux/build.properties b/update/org.eclipse.update.core.linux/build.properties
deleted file mode 100644
index 68d414f..0000000
--- a/update/org.eclipse.update.core.linux/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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = fragment.xml,\
-               os/,\
-               fragment.properties,\
-               about.html
-src.includes = src/,\
-               fragment.xml,\
-               about.html
diff --git a/update/org.eclipse.update.core.linux/fragment.xml b/update/org.eclipse.update.core.linux/fragment.xml
deleted file mode 100644
index 6740684..0000000
--- a/update/org.eclipse.update.core.linux/fragment.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<fragment
-   id="org.eclipse.update.core.linux"
-   name="%fragmentNameLinux"
-   version="3.0.0"
-   provider-name="%providerName"
-   plugin-id="org.eclipse.update.core"
-   plugin-version="3.0.0"
-   match="compatible">
-
-   <runtime>
-   </runtime>
-
-
-</fragment>
diff --git a/update/org.eclipse.update.core.linux/os/linux/x86/libupdate.so b/update/org.eclipse.update.core.linux/os/linux/x86/libupdate.so
deleted file mode 100644
index d70a9e9..0000000
--- a/update/org.eclipse.update.core.linux/os/linux/x86/libupdate.so
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.core.linux/src/build.xml b/update/org.eclipse.update.core.linux/src/build.xml
deleted file mode 100644
index cf44ead..0000000
--- a/update/org.eclipse.update.core.linux/src/build.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="buildlibrary" default="run" basedir="."> 
-  
-  <!-- The properties ${eclipse-home} ${jdk-path} should be passed into this script -->
-  <!-- Set a meaningful default value for when it is not. -->
-  <property name="eclipse-home" value="${basedir}/../.."/>
-  <property name="jdk-path" value="${java.home}"/>  
-  <property name="destination" value="${eclipse-home}/org.eclipse.update.core.linux/os/linux/x86/"/>
-  <property name="obj-path" value="${eclipse-home}/org.eclipse.update.core.linux/src/"/>
-  <property name="src-path" value="${eclipse-home}/org.eclipse.update.core.linux/src/"/>  
-  
-  <!-- sets the properties -->
-  <property name="library-name" value="libupdate"/>  
-  <property name="library-platform" value="so"/>    
-  <property name="library-file" value="${library-name}.${library-platform}"/>
-  
-  <!-- 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="${obj-path}" includes="${library-file}"/>
-      <fileset dir="${obj-path}" includes="${library-name}.o"/>
-    </delete>
-  </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">
-      <delete>
-      <fileset dir="${obj-path}" includes="${library-file}"/>
-      <fileset dir="${obj-path}" includes="${library-name}.o"/>
-    </delete>
-  </target>
-  
-  
-  <!-- This target runs the build. -->
-  <target name="run" depends="init,build,cleanup">
-  </target>
-  
-  <!-- This target build the library -->
-  <target name="build">
-    <echo message="Building ${library-file}"/>
-
-    <property name="header-path" value="${jdk-path}/../include"/>
-    <property name="header-linux-path" value="${header-path}/linux" />
-
-	<echo message="gcc -o  ${library-file} -shared -I${src-path} -I${header-linux-path} ${library-file} -static -lc"/>
-
-    <apply executable="gcc" dest="${eclipse-home}/" parallel="false">
-      <arg value="-o"/>
-      <arg value="${library-file}"/>
-      <arg value="-shared"/>
-      <arg value="-I${src-path}"/>
-      <arg value="-I${header-path}"/>      
-      <arg value="-I${header-linux-path}"/>  
-	  <srcfile/>
-	  <arg value="-static"/>           
-      <arg value="-lc"/>	  
-      <fileset dir="${src-path}" includes="*.c"/>
-      <mapper type="glob" from="*.c" to="*.o"/>
-    </apply>
-    
-	<move file="${library-file}" todir="${destination}"/>
-  </target>
-  
-  
-</project>
\ No newline at end of file
diff --git a/update/org.eclipse.update.core.linux/src/update.c b/update/org.eclipse.update.core.linux/src/update.c
deleted file mode 100644
index a4508d7..0000000
--- a/update/org.eclipse.update.core.linux/src/update.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2002 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-/* bug 82520 : need to include stdlib.h */
-# include <stdlib.h>
-# include <sys/types.h>
-# include <sys/statfs.h>
-# include <update.h>
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetFreeSpace
- * Signature: (Ljava/io/File;)J
- */
-JNIEXPORT jlong JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetFreeSpace(
-	JNIEnv * jnienv,
-	jclass javaClass,
-	jobject file) {
-
-	// to retrive the String
-	jclass cls;
-	jmethodID id;
-	jobject obj;
-
-	// java.io.File.getAbsolutePath()
-	const char * lpDirectoryName;
-
-	// Linux Parameters
-	struct statfs buffer;
-
-	// the result
-	jlong result = org_eclipse_update_configuration_LocalSystemInfo_SIZE_UNKNOWN;
-
-	cls = (*jnienv) -> GetObjectClass(jnienv, file);
-	id = (*jnienv) -> GetMethodID(jnienv, cls, "getAbsolutePath", "()Ljava/lang/String;");
-	obj = (*jnienv) -> CallObjectMethod(jnienv, file, id);
-	lpDirectoryName = (*jnienv) -> GetStringUTFChars(jnienv, (jstring) obj, 0);
-
-	// cast one argument as jlong to have a jlong result
-	int err = statfs(lpDirectoryName,&buffer);
-	if (err==0){
-		long size = buffer.f_bsize;
-		jlong free = buffer.f_bfree;
-		result = size*free;
-	}
-
-	return result;
-}
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetLabel
- * Signature: (Ljava/io/File;)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetLabel(
-	JNIEnv * jnienv,
-	jclass javaClass,
-	jobject file) {
-
-	// to retrive the String
-	jclass cls;
-	jmethodID id;
-	jobject obj;
-
-	// java.io.File.getAbsolutePath()
-	const char * lpDirectoryName;
-
-	// obtain the String from the parameter
-	cls = (*jnienv) -> GetObjectClass(jnienv, file);
-	id = (*jnienv) -> GetMethodID(jnienv, cls, "getAbsolutePath", "()Ljava/lang/String;");
-	obj = (*jnienv) -> CallObjectMethod(jnienv, file, id);
-	lpDirectoryName = (*jnienv) -> GetStringUTFChars(jnienv, (jstring) obj, 0);
-
-	jstring result = NULL;
-
-	// Linux implementation following
-
-	return result;
-}
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetType
- * Signature: (Ljava/io/File;)I
- */
-JNIEXPORT jint JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetType(
-	JNIEnv * jnienv,
-	jclass javaClass,
-	jobject file) {
-
-	// to retrive the String
-	jclass cls;
-	jmethodID id;
-	jobject obj;
-
-	// java.io.File.getAbsolutePath()
-	const char * lpDirectoryName;
-
-	// obtain the String from the parameter
-	cls = (*jnienv) -> GetObjectClass(jnienv, file);
-	id = (*jnienv) -> GetMethodID(jnienv, cls, "getAbsolutePath", "()Ljava/lang/String;");
-	obj = (*jnienv) -> CallObjectMethod(jnienv, file, id);
-	lpDirectoryName = (*jnienv) -> GetStringUTFChars(jnienv, (jstring) obj, 0);
-
-	int result;
-	
-	// Linux implemantation
-
-	result = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_INVALID_PATH;
-	return result;
-}
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeListMountPoints
- * Signature: ()[Ljava/lang/String;
- */
-JNIEXPORT jobjectArray JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeListMountPoints(
-	JNIEnv * jnienv,
-	jclass javaClass) {
-
-	//
-	int drive;
-	char driveName[100];
-	jobjectArray returnArray;
-	int nDrive = 0;
-
-	// 
-	jclass stringClass;
-	jobject empty;
-	int index = 0;
-	jobject str;
-
-	// Linux implementation
-	// find mount points
-
-	drive = 0;
-	stringClass = (*jnienv) -> FindClass(jnienv, "java/lang/String");
-	empty = (*jnienv) -> NewStringUTF(jnienv, "");
-	//returnArray = (*jnienv) -> NewObjectArray(jnienv, nDrive, stringClass, empty);
-
-	// for now return null as method is not implemented
-	returnArray = NULL;
-
-	int i;
-	for (i = 0; i < drive; i++) {
-		// Linux implementation, create String for each mount point
-
-		str = (*jnienv) -> NewStringUTF(jnienv, driveName);
-		(*jnienv) -> SetObjectArrayElement(jnienv, returnArray, index, str);
-
-		index++;
-	}
-
-	return returnArray;
-}
diff --git a/update/org.eclipse.update.core.linux/src/update.h b/update/org.eclipse.update.core.linux/src/update.h
deleted file mode 100644
index fef0347..0000000
--- a/update/org.eclipse.update.core.linux/src/update.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-/*******************************************************************************
- * Copyright (c) 2000, 2002 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
- 
-#include <jni.h>
-/* Header for class org_eclipse_update_configuration_LocalSystemInfo */
-
-#ifndef _Included_org_eclipse_update_configuration_LocalSystemInfo
-#define _Included_org_eclipse_update_configuration_LocalSystemInfo
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef org_eclipse_update_configuration_LocalSystemInfo_SIZE_UNKNOWN
-#define org_eclipse_update_configuration_LocalSystemInfo_SIZE_UNKNOWN -1L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_UNKNOWN
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_UNKNOWN -1L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_INVALID_PATH
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_INVALID_PATH -2L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOVABLE
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOVABLE 1L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FIXED
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FIXED 2L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOTE
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOTE 3L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_CDROM
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_CDROM 4L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_RAMDISK
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_RAMDISK 5L
-/* Inaccessible static: listeners */
-/* Inaccessible static: hasNatives */
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetFreeSpace
- * Signature: (Ljava/io/File;)J
- */
-JNIEXPORT jlong JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetFreeSpace
-  (JNIEnv *, jclass, jobject);
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetLabel
- * Signature: (Ljava/io/File;)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetLabel
-  (JNIEnv *, jclass, jobject);
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetType
- * Signature: (Ljava/io/File;)I
- */
-JNIEXPORT jint JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetType
-  (JNIEnv *, jclass, jobject);
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeListMountPoints
- * Signature: ()[Ljava/lang/String;
- */
-JNIEXPORT jobjectArray JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeListMountPoints
-  (JNIEnv *, jclass);
-
-#ifdef __cplusplus
-}
-
-#endif
-#endif
diff --git a/update/org.eclipse.update.core.win32/.project b/update/org.eclipse.update.core.win32/.project
deleted file mode 100644
index 8c9b28f..0000000
--- a/update/org.eclipse.update.core.win32/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.core.win32</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<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>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.core.win32/about.html b/update/org.eclipse.update.core.win32/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/update/org.eclipse.update.core.win32/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.core.win32/build.properties b/update/org.eclipse.update.core.win32/build.properties
deleted file mode 100644
index 99cd557..0000000
--- a/update/org.eclipse.update.core.win32/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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = fragment.xml,\
-               os/,\
-               fragment.properties,\
-               about.html
-src.includes = fragment.xml,\
-               about.html,\
-               src/
diff --git a/update/org.eclipse.update.core.win32/fragment.xml b/update/org.eclipse.update.core.win32/fragment.xml
deleted file mode 100644
index 81d8e7b..0000000
--- a/update/org.eclipse.update.core.win32/fragment.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<fragment
-   id="org.eclipse.update.core.win32"
-   name="%fragmentNameWin"
-   version="3.0.0"
-   provider-name="%providerName"
-   plugin-id="org.eclipse.update.core"
-   plugin-version="3.0.0"
-   match="compatible">
-
-   <runtime>
-   </runtime>
-
-
-</fragment>
diff --git a/update/org.eclipse.update.core.win32/os/win32/x86/update.dll b/update/org.eclipse.update.core.win32/os/win32/x86/update.dll
deleted file mode 100644
index 428e60e..0000000
--- a/update/org.eclipse.update.core.win32/os/win32/x86/update.dll
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.core.win32/src/build.xml b/update/org.eclipse.update.core.win32/src/build.xml
deleted file mode 100644
index 92286b7..0000000
--- a/update/org.eclipse.update.core.win32/src/build.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="buildlibrary" default="run" basedir="."> 
-  
-  <!-- The properties ${eclipse-home} ${jdk-path} should be passed into this script -->
-  <!-- The Path should point to the bin directory of BCC55 -->
-  <!-- http://www.borland.com/products/downloads/download_cbuilder.html -->
-  
-  <!-- Set a meaningful default value for when it is not. -->
-  <property name="eclipse-home" value="${basedir}/../.."/>
-  <property name="jdk-path" value="${java.home}"/>  
-  <property name="destination" value="${eclipse-home}/org.eclipse.update.core.win32/os/win32/x86/"/>
-  <property name="obj-path" value="${eclipse-home}/org.eclipse.update.core.win32/src"/>
-  <property name="src-path" value="${eclipse-home}/org.eclipse.update.core.win32/src/"/>  
-  
-  <!-- sets the properties -->
-  <property name="library-name" value="update"/>  
-  <property name="library-platform" value="dll"/>    
-  <property name="library-file" value="${library-name}.${library-platform}"/>
-  
-  <!-- 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="${obj-path}" includes="${library-file}"/>
-      <fileset dir="${obj-path}" includes="${library-name}.obj"/>
-      <fileset dir="${obj-path}" includes="${library-name}.tds"/>            
-    </delete>
-  </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">
-      <delete>
-      <fileset dir="${obj-path}" includes="${library-file}"/>
-      <fileset dir="${obj-path}" includes="${library-name}.obj"/>
-      <fileset dir="${obj-path}" includes="${library-name}.tds"/>            
-    </delete>
-  </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,build,cleanup">
-  </target>
-  
-  <!-- This target build the dll -->
-  <target name="build">
-    <echo message="Building ${library-file}"/>
-
-    <property name="header-path" value="${jdk-path}/include"/>
-    <property name="header-windows-path" value="${header-path}/win32" />
-
-	<echo message="bcc32 -I${src-path} -I${header-windows-path} -WD"/>
-
-    <apply executable="bcc32" dest="${eclipse-home}/" parallel="false">
-      <arg value="-I${src-path}"/>
-      <arg value="-I${header-path}"/>      
-      <arg value="-I${header-windows-path}"/> 
-      <!-- arg value="-DUNICODE" --> 
-	  <arg value="-w-8057"/>           
-      <arg value="-WD"/>
-	  <srcfile/>
-      <fileset dir="${src-path}" includes="*.cpp"/>
-      <mapper type="glob" from="*.cpp" to="*.obj"/>
-    </apply>
-    
-	<move file="${library-file}" todir="${destination}"/>
-  </target>
-  
-  
-</project>
\ No newline at end of file
diff --git a/update/org.eclipse.update.core.win32/src/update.cpp b/update/org.eclipse.update.core.win32/src/update.cpp
deleted file mode 100644
index cb27fd5..0000000
--- a/update/org.eclipse.update.core.win32/src/update.cpp
+++ /dev/null
@@ -1,487 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2002 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-# include <update.h>
-# include <windows.h>
-# include <winioctl.h> // IOCTL codes: MediaType
-
-// Windows Version
-int WIN98 = 0;
-int WINNT = 1;
-int WINME = 2;
-int WIN2000 = 3;
-int WINXP = 4;
-
-// set to 1 for DEBUG
-int DEBUG = 0;
-
-// set to 0 to run on Windows 95 *Unsupported*
-int NOWIN95 = 1;
-
-
-// GLOBAL METHODS
-// ---------------
-
-/*
- *
- */
-jstring WindowsTojstring( JNIEnv* jnienv, char* buf )
-{
-  jstring rtn = 0;
-  wchar_t* buffer = 0;
-  int bufferLen = strlen(buf);  
-  if( bufferLen == 0 ){
-    rtn = jnienv ->NewStringUTF(buf);
-	if (DEBUG)
-		printf("WindowsToJString Buffer is empty\n");    
-  } else {
-    int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)buf, bufferLen, NULL, 0 );
-    buffer = (wchar_t*)malloc( length*2 + 1 );
-    if(int err=MultiByteToWideChar( CP_ACP, 0, (LPCSTR)buf, bufferLen, (LPWSTR)buffer, length ) >0 ){
-      rtn = jnienv->NewString((jchar*)buffer, length );
-    } else {
-		if (DEBUG)
-			printf("MultiByteToWideChar %i\n",err);    
-    }
-  }
-  if( buffer )
-   free( buffer );
-  return rtn;
-}
-
-
-
-/*
- * calls GetVolumeInformation to retrive the label of the volume
- * Returns NULL if an error occurs
- * @param driveLetter path to the drive "c:\\"
- * @prama jnienv JNIEnvironment
- */
-jstring getLabel(TCHAR driveLetter[],JNIEnv * jnienv){
-
-	jstring result = NULL;
-	TCHAR buf[128];	
-	
-	// always return null as UNICODE is not implemented
-	// how can we get the label of a volume as UNICODE char ?
-	return result;
-	
-	int err = GetVolumeInformation(
-		driveLetter,
-		buf,
-		sizeof(buf) - 1,
-		NULL,
-		NULL,
-		NULL,
-		NULL,
-		0);
-	if (err){
-		result = WindowsTojstring(jnienv, buf);
-	} else {
-		if (DEBUG)
-			printf("Error GetVolumeInformation %i\n",err);				
- 	}
-	return result;
-}
-
-/*
- * returns the Version of Windows
- * int 0 WIN98;
- * int 1 WINNT;
- * int 2 WINME;
- * int 3 WIN2000;
- * int 4 WINXP;
- * returns -1 otherwise
- */
-int getWindowsVersion(){
-	OSVERSIONINFOEX osvi;
-	int UNKNOWN = -1;
-	
-	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
-	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
-	
-	if(!(GetVersionEx((OSVERSIONINFO *)&osvi))){
-		if (DEBUG)
-			printf("UNKNOWN VERSION: Cannot execute GetVersionEx\n");
-		// if OSVERSIONEX doesn't work, try OSVERSIONINFO
-		osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);			 	
-		if(!(GetVersionEx((OSVERSIONINFO *)&osvi))){
-		if (DEBUG)
-			printf("UNKNOWN VERSION: Cannot execute GetVersionEx\n");
-			return UNKNOWN;
-		}
-	}
-	
-	switch(osvi.dwPlatformId){
-		case VER_PLATFORM_WIN32_NT:
-			if (DEBUG)
-				printf("VERSION NT: Maj %i Min %i\n",osvi.dwMajorVersion,osvi.dwMinorVersion);				 	
-			if(osvi.dwMajorVersion<=4)
-				return WINNT;
-			if(osvi.dwMajorVersion==5){
-				if (osvi.dwMinorVersion==0)
-					return WIN2000;
-				if (osvi.dwMinorVersion==1)
-					return WINXP;
-			} else {
-				return UNKNOWN;
-			};
-			break;
-		case VER_PLATFORM_WIN32_WINDOWS:
-			if (DEBUG)
-				printf("VERSION Non NT: Maj %i Min %i\n",osvi.dwMajorVersion,osvi.dwMinorVersion);				 	
-			if(osvi.dwMajorVersion==4){
-				if (osvi.dwMinorVersion==10)
-					return WIN98;
-				if (osvi.dwMinorVersion==90)
-					return WINME;
-			} else {
-				return UNKNOWN;
-			}
-			break;
-		default:
-			if (DEBUG)
-				printf("VERSION UNKNOWN: Maj %i Min %i\n",osvi.dwMajorVersion,osvi.dwMinorVersion);				 	
-			return UNKNOWN;
-	}
-	return UNKNOWN;
-} 
-
-/*
- * Returns the type of Removable Drive 
- * Returns 
- * org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FLOPPY_3
- * org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FLOPPY_5
- * org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOVABLE
- */
-jlong getFloppy(TCHAR driveLetter[]){
-
-	TCHAR floppyPath[8];
-	HANDLE handle;
-	DISK_GEOMETRY geometry[20];
-	DWORD dw;
-	jlong UNKNOWN = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOVABLE;
-
-	sprintf(floppyPath, "\\\\.\\%c:", driveLetter[0]);
-	if (DEBUG)
-		printf("Path %s\n",floppyPath);
-	// BUG 25719
-    SetErrorMode( SEM_FAILCRITICALERRORS ); 		
-	handle=CreateFile(floppyPath,0,FILE_SHARE_READ,NULL,OPEN_ALWAYS,0,NULL);
-	if (handle==INVALID_HANDLE_VALUE){
-		if (DEBUG)
-			printf("Invalid Handle %s\n",floppyPath);
-		return UNKNOWN;
-	} else {
-		if(DeviceIoControl(handle,
-			IOCTL_DISK_GET_MEDIA_TYPES,0,0,
-			geometry,sizeof(geometry),&dw,0) 
-			&& dw>0) {
-			switch(geometry[0].MediaType){
-			 case F5_160_512:
-			 case F5_180_512:
-			 case F5_320_512:
-			 case F5_320_1024:
-			 case F5_360_512:
-			 case F5_1Pt2_512:
-				if (DEBUG)
-					printf("Found 5 1/4 Drive\n");				 	
-			 	return org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FLOPPY_5;
-			 case F3_720_512:			 				 				 				 				 
-			 case F3_1Pt44_512:
-			 case F3_2Pt88_512:
-			 case F3_20Pt8_512:				 				 				 
-				if (DEBUG)
-					printf("Found 3 1/2 Drive\n");				 	
-			 	return org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FLOPPY_3;
-			 default:
-			 	return UNKNOWN;
-			}
-		}
-	}
-	return UNKNOWN;	
-}
-
-/*
- * Returns the UNC name of a remote drive
- * (\\Machine\path\path1\path2$)
- * returns NULL if an error occurs
- */
- jstring getRemoteNetworkName(TCHAR driveLetter[],JNIEnv * jnienv){
- 	
- 	unsigned long size =256;
- 	TCHAR buf[256];	
- 	TCHAR drivePath[2];
- 	DWORD err;
- 	jstring result = NULL;
- 	
- 	// always return NULL as UNICODE not implemented
-	// how can we get the label of a remote network name as UNICODE char ? 	
- 	return result;
- 	
-	sprintf(drivePath, "%c:", driveLetter[0]); 	
- 	err = WNetGetConnection(drivePath,buf,&size);
- 	
- 	if (err==WN_SUCCESS){
-		result = WindowsTojstring(jnienv,buf);
-	} else {
-		if (DEBUG)
-			printf("Error WNEtGetConnection %i",err);				
- 	}
-	return result;
- }
-
-
-// JNI METHODS
-// ---------------
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetFreeSpace
- * Signature: (Ljava/io/File;)J
- */
-JNIEXPORT jlong JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetFreeSpace(
-	JNIEnv * jnienv,
-	jclass javaClass,
-	jobject file) {
-
-	// to retrive the String
-	jclass cls;
-	jmethodID id;
-	jobject obj;
-
-	// java.io.File.getAbsolutePath()
-	const TCHAR * lpDirectoryName;
-
-	// Windows Parameters
-	__int64 i64FreeBytesAvailableToCaller;
-	__int64 i64TotalNumberOfBytes;
-	__int64 i64TotalNumberOfFreeBytes;
-
-	// the result
-	jlong result = org_eclipse_update_configuration_LocalSystemInfo_SIZE_UNKNOWN;
-
-	// first, obtain the Path from the java.io.File parameter
-	cls = jnienv -> GetObjectClass(file);
-	id = jnienv -> GetMethodID(cls, "getAbsolutePath", "()Ljava/lang/String;");
-	obj = jnienv -> CallObjectMethod(file, id);
-	lpDirectoryName = jnienv -> GetStringUTFChars((jstring) obj, 0);
-	if (DEBUG)
-		printf("Directory: [%s]\n",lpDirectoryName);
-
-	if (int win = (int)getWindowsVersion()<0 && NOWIN95){
-		// windows 95 or other
-		if (DEBUG)
-			printf("Unsupported Windows: %i\n",win);		
-		return result;
-	}
-
-	int err = GetDiskFreeSpaceEx(
-				lpDirectoryName,
-				(PULARGE_INTEGER) & i64FreeBytesAvailableToCaller,
-				(PULARGE_INTEGER) & i64TotalNumberOfBytes,
-				(PULARGE_INTEGER) & i64TotalNumberOfFreeBytes);
-			
-	if (err) {
-		result = (jlong) i64FreeBytesAvailableToCaller;
-	}
-
-	return result;
-}
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetLabel
- * Signature: (Ljava/io/File;)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetLabel(
-	JNIEnv * jnienv,
-	jclass javaClass,
-	jobject file) {
-
-	// to retrive the String
-	jclass cls;
-	jmethodID id;
-	jobject obj;
-
-	// java.io.File.getAbsolutePath()
-	const TCHAR * lpDirectoryName;
-
-	// obtain the String from the parameter
-	cls = jnienv -> GetObjectClass(file);
-	id = jnienv -> GetMethodID(cls, "getAbsolutePath", "()Ljava/lang/String;");
-	obj = jnienv -> CallObjectMethod(file, id);
-	lpDirectoryName = jnienv -> GetStringUTFChars((jstring) obj, 0);
-	if (DEBUG)
-		printf("Directory: [%s]\n",lpDirectoryName);
-
-	//
-	jstring result = NULL;
-	int floppy;
-	
-	if (int win = (int)getWindowsVersion()<0 && NOWIN95){
-		// windows 95 or other
-		if (DEBUG)
-			printf("Unsupported Windows: %i\n",win);		
-		return result;
-	}
-		
-	// Make sure we have a String of the Form: <letter>:
-	if (':' == lpDirectoryName[1]) {
-		TCHAR driveLetter[4]; // i.e. -> C:\\
-		memcpy(driveLetter, lpDirectoryName, 2);
-		strcpy(driveLetter + 2, "\\");
-		switch (GetDriveType(driveLetter)) {
-			case DRIVE_REMOTE :
-				// check name of machine and path of remote
-				if (DEBUG)
-					printf("Remote Drive");
-				result = getRemoteNetworkName(driveLetter,jnienv);				
-				break;
-			default :
-				if (DEBUG)
-					printf("Another Drive at %s", driveLetter);
-				result = getLabel(driveLetter,jnienv);
-				break;
-		} 
-	} 
-
-	return result;
-}
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetType
- * Signature: (Ljava/io/File;)I
- */
-JNIEXPORT jint JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetType(
-	JNIEnv * jnienv,
-	jclass javaClass,
-	jobject file) {
-
-	// to retrive the String
-	jclass cls;
-	jmethodID id;
-	jobject obj;
-
-	// java.io.File.getAbsolutePath()
-	const TCHAR * lpDirectoryName;
-
-	// obtain the String from the parameter
-	cls = jnienv -> GetObjectClass(file);
-	id = jnienv -> GetMethodID(cls, "getAbsolutePath", "()Ljava/lang/String;");
-	obj = jnienv -> CallObjectMethod(file, id);
-	lpDirectoryName = jnienv -> GetStringUTFChars((jstring) obj, 0);
-	if (DEBUG)
-		printf("Directory: [%s]\n",lpDirectoryName);
-
-	int result = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_UNKNOWN;
-	if (int win = (int)getWindowsVersion()<0 && NOWIN95){
-		// windows 95 or other
-		if (DEBUG)
-			printf("Unsupported Windows: %i\n",win);		
-		return result;
-	}
-	
-	// Make sure we have a String of the Form: <letter>:
-	if (':' == lpDirectoryName[1]) {
-		TCHAR driveLetter[4]; //C:\\
-		memcpy(driveLetter, lpDirectoryName, 2);
-		strcpy(driveLetter + 2, "\\");
-
-		switch (GetDriveType(driveLetter)) {
-			case DRIVE_REMOVABLE :
-				// check if floppy 3.5, floppy 5.25	
-				// or other removable device (USB,PCMCIA ...)
-				if (DEBUG)
-					printf("Removable Device");
-				result = getFloppy(driveLetter);					
-				break;
-			case DRIVE_CDROM :
-				result = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_CDROM;
-				break;
-			case DRIVE_FIXED :
-				result = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FIXED;
-				break;
-			case DRIVE_REMOTE :
-				result = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOTE;
-				break;
-			case DRIVE_NO_ROOT_DIR :
-				result = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_INVALID_PATH;
-				break;
-			case DRIVE_RAMDISK :
-				result = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_RAMDISK;
-				break;			
-			case DRIVE_UNKNOWN :
-			default :
-				result = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_UNKNOWN;
-				break;
-		}
-	} else {
-		result = org_eclipse_update_configuration_LocalSystemInfo_VOLUME_INVALID_PATH;
-	}
-
-	return result;
-}
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeListMountPoints
- * Signature: ()[Ljava/lang/String;
- */
-JNIEXPORT jobjectArray JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeListMountPoints(
-	JNIEnv * jnienv,
-	jclass javaClass) {
-
-	//
-	DWORD logDrives;
-	UINT drive;
-	TCHAR driveName[100];
-	jobjectArray returnArray;
-	int nDrive = 0;
-
-	// 
-	jclass stringClass;
-	jobject empty;
-	int index = 0;
-	jobject str;
-
-
-	logDrives = GetLogicalDrives();
-	for (drive = 0; drive < 32; drive++) {
-		if (logDrives & (1 << drive)) {
-			nDrive++;
-		}
-	}
-
-	stringClass = jnienv -> FindClass("java/lang/String");
-	empty = jnienv -> NewStringUTF("");
-	returnArray = jnienv -> NewObjectArray(nDrive, stringClass, empty);
-
-	if (int win = (int)getWindowsVersion()<0 && NOWIN95){
-		// windows 95 or other
-		if (DEBUG)
-			printf("Unsupported Windows: %i\n",win);	
-		return NULL;
-	}
-
-	for (drive = 0; drive < 32; drive++) {
-		if (logDrives & (1 << drive)) {
-			sprintf(driveName, "%c:\\", drive + 'A');
-			str = jnienv -> NewStringUTF(driveName);
-			jnienv -> SetObjectArrayElement(returnArray, index, str);
-			index++;
-		}
-	}
-
-	return returnArray;
-}
-
diff --git a/update/org.eclipse.update.core.win32/src/update.h b/update/org.eclipse.update.core.win32/src/update.h
deleted file mode 100644
index 35673d1..0000000
--- a/update/org.eclipse.update.core.win32/src/update.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-/*******************************************************************************
- * Copyright (c) 2000, 2002 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-#include <jni.h>
-/* Header for class org_eclipse_update_configuration_LocalSystemInfo */
-
-#ifndef _Included_org_eclipse_update_configuration_LocalSystemInfo
-#define _Included_org_eclipse_update_configuration_LocalSystemInfo
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef org_eclipse_update_configuration_LocalSystemInfo_SIZE_UNKNOWN
-#define org_eclipse_update_configuration_LocalSystemInfo_SIZE_UNKNOWN -1L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_UNKNOWN
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_UNKNOWN -1L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_INVALID_PATH
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_INVALID_PATH -2L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOVABLE
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOVABLE 1L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FIXED
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FIXED 2L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOTE
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_REMOTE 3L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_CDROM
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_CDROM 4L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_RAMDISK
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_RAMDISK 5L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FLOPPY_5
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FLOPPY_5 6L
-#undef org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FLOPPY_3
-#define org_eclipse_update_configuration_LocalSystemInfo_VOLUME_FLOPPY_3 7L
-/* Inaccessible static: listeners */
-/* Inaccessible static: hasNatives */
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetFreeSpace
- * Signature: (Ljava/io/File;)J
- */
-JNIEXPORT jlong JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetFreeSpace
-  (JNIEnv *, jclass, jobject);
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetLabel
- * Signature: (Ljava/io/File;)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetLabel
-  (JNIEnv *, jclass, jobject);
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeGetType
- * Signature: (Ljava/io/File;)I
- */
-JNIEXPORT jint JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeGetType
-  (JNIEnv *, jclass, jobject);
-
-/*
- * Class:     org_eclipse_update_configuration_LocalSystemInfo
- * Method:    nativeListMountPoints
- * Signature: ()[Ljava/lang/String;
- */
-JNIEXPORT jobjectArray JNICALL Java_org_eclipse_update_configuration_LocalSystemInfo_nativeListMountPoints
-  (JNIEnv *, jclass);
-
-#ifdef __cplusplus
-}
-
-#endif
-#endif
diff --git a/update/org.eclipse.update.examples/.classpath b/update/org.eclipse.update.examples/.classpath
deleted file mode 100644
index b48fe2a..0000000
--- a/update/org.eclipse.update.examples/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src/"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="src" path="/org.eclipse.update.core"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update.examples/.cvsignore b/update/org.eclipse.update.examples/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/update/org.eclipse.update.examples/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/update/org.eclipse.update.examples/.project b/update/org.eclipse.update.examples/.project
deleted file mode 100644
index 39cb54a..0000000
--- a/update/org.eclipse.update.examples/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.examples</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.xerces</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.update.core</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ui.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ui.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.ui.PluginNature</nature>
-		<nature>org.eclipse.team.cvs.core.cvsnature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.examples/Scrapbook2.jpage b/update/org.eclipse.update.examples/Scrapbook2.jpage
deleted file mode 100644
index b5da99a..0000000
--- a/update/org.eclipse.update.examples/Scrapbook2.jpage
+++ /dev/null
@@ -1,111 +0,0 @@
-SiteManager.getSite(URL)throws CoreException
-  String type = getTypeForprotocol(URL.getprotocol);
-  try {
-    if (type != null){
-	attemptCreationSite(type,URL);
-    } else {
-	attemptCreationSite("http",URL);
-    }
-  } catch (CoreException e){
-    throw new CoreException("Cannot create site",e.getMessage());
-  }
-
-SiteManager.attemptCreationSite(type,URL)throws CoreException
-  try {
-    createSite(type,URL);
-  } catch (InvalidTypeException e){
-    try {
-      createSite(e.getRealType(),URL);
-    } catch (InvalidSiteExeption e){
-      throw new CoreException("Wrong site type");
-    }
-  }
-
-SiteManager.createSite(type,URL) throws CoreExeption, InvalidSiteTypeException
-
-
-try {
-			
-	factory.createSite(url, forceCreation);
-	
-} catch (IOException e) {
-	// if the URL is pointing to either a file 
-// or a directory, without reference			
-if (url.getRef() != null) {
-	// 4 nothing we can do
-	throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e.getMessage(),e);
-} else if (url.getFile().endsWith("/")) {
-	// 1 try to add site.xml
-	try {
-		url = new URL(url,Site.SITE_XML);
-	} catch (MalformedURLException e1){
-		throw newCoreException("Cannot create URL:"+url.toExternalForm()+"+"+Site.SITE_XML,e1);
-	}
-	try {
-		site = factory.createSite(url, forceCreation);
-	} catch (ParsingException e1){
-		throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e1.getMessage(),e1);					
-	} catch (IOException e1){
-		throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e1.getMessage(),e1);					
-	}
-} else if (url.getFile().endsWith(Site.SITE_XML)) {
-	// 3 nothing we can do
-	throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e.getMessage(),e);
-} else {
-	// 2 try to add /site.xml
-	try {
-		url = new URL(url.getProtocol(),url.getHost(), url.getPort(), url.getFile()+"/"+Site.SITE_XML);
-	} catch (MalformedURLException e1){
-		throw newCoreException("Cannot create URL:"+url.toExternalForm()+"+"+Site.SITE_XML,e1);
-	}
-	
-	try {
-		site = factory.createSite(url, forceCreation);
-	} catch (ParsingException e1){
-		throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e1.getMessage()+"\r\nPrevious Input/Output Error:"+e.getMessage(),e1);					
-	} catch (IOException e1){
-		throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e1.getMessage()+"\r\nPrevious Input/Output Error:"+e.getMessage(),e1);					
-				}				
-			}
-
-		} catch (ParsingException e) {
-			
-			// if the URL is pointing to either a file 
-// or a directory, without reference			
-if (url.getRef() != null) {
-	// 4 nothing we can do
-	throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e.getMessage(),e);
-} else if (url.getFile().endsWith("/")) {
-	// 1 try to add site.xml
-	try {
-		url = new URL(url,Site.SITE_XML);
-	} catch (MalformedURLException e1){
-		throw newCoreException("Cannot create URL:"+url.toExternalForm()+"+"+Site.SITE_XML,e1);
-	}
-	try {
-		site = factory.createSite(url, forceCreation);
-	} catch (ParsingException e1){
-		throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e1.getMessage(),e1);					
-	} catch (IOException e1){
-		throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e1.getMessage(),e1);
-				}				
-
-			} else if (url.getFile().endsWith(Site.SITE_XML)) {
-				// 3 nothing we can do
-	throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e.getMessage(),e);					
-} else {
-	// 2 try to add /site.xml
-	
-	try {
-		url = new URL(url.getProtocol(),url.getHost(), url.getPort(), url.getFile()+"/"+Site.SITE_XML);
-	} catch (MalformedURLException e1){
-		throw newCoreException("Cannot create URL:"+url.toExternalForm()+"+"+Site.SITE_XML,e1);
-	}
-	try {
-		site = factory.createSite(url, forceCreation);
-	} catch (ParsingException e1){
-		throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e1.getMessage()+"\r\nPrevious Parsing error:"+e.getMessage(),e1);					
-	} catch (IOException e1){
-		throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e1.getMessage()+"\r\nPrevious Parsing error:"+e.getMessage(),e1);
-	
-
diff --git a/update/org.eclipse.update.examples/about.html b/update/org.eclipse.update.examples/about.html
deleted file mode 100644
index 768324e..0000000
--- a/update/org.eclipse.update.examples/about.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<head>
-<title>About</title>
-<style type="text/css">
-p, table, td, th { font-family: arial, helvetica, geneva; font-size: 10pt}
-pre { font-family: "Courier New", Courier, mono; font-size: 10pt}
-h2 { font-family: arial, helvetica, geneva; font-size: 18pt; font-weight: bold ; line-height: 14px}
-code { font-family: "Courier New", Courier, mono; font-size: 10pt}
-sup { font-family: arial,helvetica,geneva; font-size: 10px}
-h3 { font-family: arial, helvetica, geneva; font-size: 14pt; font-weight: bold}
-li { font-family: arial, helvetica, geneva; font-size: 10pt}
-h1 { font-family: arial, helvetica, geneva; font-size: 28px; font-weight: bold}
-body { font-family: arial, helvetica, geneva; font-size: 10pt; clip: rect(   ); margin-top: 5mm; margin-left: 3mm}
-</style>
-</head>
-<body lang="EN-US" link="blue" vlink="purple">
-<table border="0" cellspacing="5" cellpadding="2" width="100%" >
-  <tr> 
-    <td align="LEFT" valign="TOP" colspan="2" bgcolor="#0080C0"><b><font color="#FFFFFF">About This Content</font></b></td>
-  </tr>
-  <tr> 
-    <td> 
-<p>11th December, 2001</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in &quot;Content&quot;.  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-<a href="http://www.eclipse.org/legal/cpl-v05.html">Common Public License Version 0.5</a> &quot;CPL&quot;.  For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL &quot;Other License&quot;, any modifications, enhancements and/or
-other code and/or documentation &quot;Modifications&quot; uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.examples/build.properties b/update/org.eclipse.update.examples/build.properties
deleted file mode 100644
index fda21a6..0000000
--- a/update/org.eclipse.update.examples/build.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-source.updateexamplescore.jar = src/
-src.includes=about.html
-bin.includes=plugin.xml,plugin.properties,*.jar,about.html
diff --git a/update/org.eclipse.update.examples/plugin.properties b/update/org.eclipse.update.examples/plugin.properties
deleted file mode 100644
index 9a31f8c..0000000
--- a/update/org.eclipse.update.examples/plugin.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-
-name = Install/Update BuildZip Example
-provider-name = Eclipse.org
\ No newline at end of file
diff --git a/update/org.eclipse.update.examples/plugin.xml b/update/org.eclipse.update.examples/plugin.xml
deleted file mode 100644
index e8b4092..0000000
--- a/update/org.eclipse.update.examples/plugin.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.update.examples"
-   name="%name"
-   version="2.0.0"
-   provider-name="%provider-name">
-
-   <runtime>
-      <library name="updateexamples.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.apache.xerces"/>
-      <import plugin="org.eclipse.core.boot"/>
-      <import plugin="org.eclipse.update.core"/>
-   </requires>
-
-
-   <extension
-         id="zip"
-         point="org.eclipse.update.core.featureTypes">
-      <feature-factory
-            class="org.eclipse.update.examples.buildzip.BuildZipFeatureFactory">
-      </feature-factory>
-   </extension>
-   <extension
-         id="site.zip"
-         point="org.eclipse.update.core.siteTypes">
-      <site-factory
-            class="org.eclipse.update.examples.buildzip.BuildZipSiteFactory">
-      </site-factory>
-   </extension>
-   <extension
-         id="site.freeform"
-         point="org.eclipse.update.core.siteTypes">
-      <site-factory
-            class="org.eclipse.update.examples.freeform.FreeFormSiteFactory">
-      </site-factory>
-   </extension>
-
-</plugin>
diff --git a/update/org.eclipse.update.examples/site/features/com.reddot.reddot_1.0.0.jar b/update/org.eclipse.update.examples/site/features/com.reddot.reddot_1.0.0.jar
deleted file mode 100644
index 06507a7..0000000
--- a/update/org.eclipse.update.examples/site/features/com.reddot.reddot_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.examples/site/features/com.reddot.reddot_2.0.0.jar b/update/org.eclipse.update.examples/site/features/com.reddot.reddot_2.0.0.jar
deleted file mode 100644
index 7236815..0000000
--- a/update/org.eclipse.update.examples/site/features/com.reddot.reddot_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.examples/site/info/images/redDot.jpg b/update/org.eclipse.update.examples/site/info/images/redDot.jpg
deleted file mode 100644
index f0fb5c3..0000000
--- a/update/org.eclipse.update.examples/site/info/images/redDot.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.examples/site/info/siteInfo.html b/update/org.eclipse.update.examples/site/info/siteInfo.html
deleted file mode 100644
index ceca97d..0000000
--- a/update/org.eclipse.update.examples/site/info/siteInfo.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<!-- saved from url=(0040)http://dejan/testSite/info/siteInfo.html -->
-<HTML><HEAD>
-<META http-equiv=Content-Type content="text/html; charset=windows-1252">
-<META content="MSHTML 5.50.4807.2300" name=GENERATOR></HEAD>
-<BODY>
-<H1 align=left><IMG height=55 src="images/redDot.jpg" width=56 
-align=center border=0> <FONT color=#c0c0c0>Follow the Red Dot&nbsp;</FONT></H1>
-<P>Welcome to the <B><FONT color=#800000>Red Dot</FONT> </B>update site. Use 
-your Eclipse <B>Update Sites</B> view to locate the feature version you want to 
-install or update to.</P>
-<H2>About Red Dot Feature</H2>
-<P>Our revolutionary Red Dot Eclipse feature changed all preconceptions about 
-what Eclipse features can and cannot do. Using our strikingly simple concept of 
-adding buttons to the Eclipse tool bar, we allow you to open dialogs that show 
-you the version of the Red Dot feature. The beauty of the concept stems from its 
-simplicity, ease of use, high performance and small footprint. Never before was 
-it so easy to press a button on the tool bar to get some text shown in the 
-dialog.</P>
-<H2>News</H2>
-<UL>
-  <LI><B>November 2001</B> - version 2.0.0 of the Red Dot feature is available 
-  for download. This version brings improvements across the board, further 
-  strengthening an already established Eclipse feature classic. Improvements 
-  will be visible the moment you update your feature - our famous red dot tool 
-  bar button is now <B>25% more red</B>, making it even easier to spot among 
-  other buttons. 
-  <LI><B>October 2001</B> - version 1.0.0 of the Red Dot feature is available 
-  for download. Select it in the 'Sites' view of the Update Manager and press 
-  'Install' button. </LI></UL>
-<HR>
-<I>Copyright 2001 Red Dot Corporation Ltd. All rights reserved.</I> 
-</BODY></HTML>
diff --git a/update/org.eclipse.update.examples/site/plugins/com.reddot.reddot_1.0.0.jar b/update/org.eclipse.update.examples/site/plugins/com.reddot.reddot_1.0.0.jar
deleted file mode 100644
index c88b793..0000000
--- a/update/org.eclipse.update.examples/site/plugins/com.reddot.reddot_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.examples/site/plugins/com.reddot.reddot_2.0.0.jar b/update/org.eclipse.update.examples/site/plugins/com.reddot.reddot_2.0.0.jar
deleted file mode 100644
index da31ad3..0000000
--- a/update/org.eclipse.update.examples/site/plugins/com.reddot.reddot_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.examples/site/site.xml b/update/org.eclipse.update.examples/site/site.xml
deleted file mode 100644
index b091324..0000000
--- a/update/org.eclipse.update.examples/site/site.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<site>
-   <description url="info/siteInfo.html"/>
-
-   <feature url="features/com.reddot.reddot_1.0.0.jar">
-      <category name="reddot"/>
-   </feature>
-
-   <feature url="features/com.reddot.reddot_2.0.0.jar">
-      <category name="reddot"/>
-   </feature>
-
-   <category-def label="Red Dot Versions" name="reddot">
-      <description url="info/RedDotVersions.html">
-         This category contains all of the currently available versions of Red Dot feature.
-      </description>
-   </category-def>
-
-</site>   
\ No newline at end of file
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipConverter.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipConverter.java
deleted file mode 100644
index e81ec2a..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipConverter.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
- 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringBufferInputStream;
-import java.net.URL;
-import java.util.Properties;
-import java.util.jar.JarEntry;
-import java.util.jar.JarOutputStream;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.ContentReference;
-import org.eclipse.update.core.IFeature;
-import org.eclipse.update.core.IFeatureContentProvider;
-import org.eclipse.update.core.IPluginEntry;
-import org.eclipse.update.core.JarContentReference;
-import org.eclipse.update.core.model.InstallAbortedException;
-
-/**
- * Converts eclipse build .zip files into packaged feature
- */
-public class BuildZipConverter {
-
-	public static void main(String[] args) {
-		if (args.length <=0) {
-			System.out.println("Usage:     BuildZipConverter <path to the zip file>.\r\nExample: BuildZipConverter d:/download/integration-eclipse-SDK-20020109-win32.zip");
-			return;
-		}
-		try {
-			URL buildzip = new URL(("file:"+args[0]).replace(File.separatorChar, '/'));
-			BuildZipFeatureFactory factory = new BuildZipFeatureFactory();
-			IFeature feature = factory.createFeature(buildzip, null);
-			IFeatureContentProvider provider = feature.getFeatureContentProvider();
-			
-			ContentReference[] refs = provider.getFeatureEntryContentReferences(null);
-			
-			File site = new File((args[0]+".packaged/").replace('/',File.separatorChar));
-			site.mkdirs();
-			File featuresDir = new File(site,"features");
-			featuresDir.mkdirs();
-			File pluginsDir = new File(site, "plugins");
-			pluginsDir.mkdirs();
-			
-			File jarFile = new File(featuresDir,feature.getVersionedIdentifier()+".jar");
-			System.out.println("writing feature archive: "+feature.getVersionedIdentifier()+".jar");
-			writeJar(jarFile, refs, feature, null, null);
-			JarContentReference jar = new JarContentReference("build.zip",buildzip);
-			Properties manifest = getBuildManifest(jar);
-			
-			IPluginEntry[] plugins = feature.getPluginEntries();
-			for (int i=0; i<plugins.length; i++) {
-				refs = provider.getPluginEntryContentReferences(plugins[i], null);
-				jarFile = new File(pluginsDir,plugins[i].getVersionedIdentifier()+".jar");
-				System.out.println("writing plugin archive: "+plugins[i].getVersionedIdentifier()+".jar");
-				writeJar(jarFile, refs, feature, plugins[i].getVersionedIdentifier().getIdentifier(), manifest);
-			}
-			
-			writeSiteManifest(site, feature);
-		} catch(Exception e) {
-			e.printStackTrace();
-		}
-	}
-	
-	public static void writeJar(File jarFile,ContentReference[] refs, IFeature feature, String pluginId, Properties manifest) {
-			
-		JarOutputStream jos = null;
-		FileOutputStream os = null;
-		InputStream is = null;
-		
-		try {
-			os = new FileOutputStream(jarFile);
-			jos = new JarOutputStream(os);
-			JarEntry entry = null;
-			String buf = null;
-			StringBufferInputStream sbis = null;
-			
-			// write jar manifest (first entry in output stream)
-			buf = "Manifest-Version: 1.0\nCreated-By: 2.0.0 (www.eclipse.org Feature Packager)\n";
-			sbis = new StringBufferInputStream(buf);
-			entry = new JarEntry("META-INF/MANIFEST.MF");
-			jos.putNextEntry(entry);
-			Utilities.copy(sbis,jos,null);
-			sbis.close();
-			
-			// jar up the references
-			for (int i=0; i<refs.length; i++) {
-				String id = refs[i].getIdentifier();
-				entry = new JarEntry(id);
-				jos.putNextEntry(entry);
-				is = refs[i].getInputStream();
-				Utilities.copy(is,jos,null);
-				is.close(); is = null;
-			}
-			
-			// for plugin jars, write build manifest
-			if (pluginId != null && manifest != null) {
-				String key = "plugin@"+pluginId;
-				String value = manifest.getProperty(key);
-				if (value != null) {
-					if (value.equals("HEAD")) {
-						value += "-" + feature.getVersionedIdentifier().getVersion().getMajorComponent();
-					}
-					buf = key + "=" + value;
-					sbis = new StringBufferInputStream(buf);
-					entry = new JarEntry("buildmanifest.properties");
-					jos.putNextEntry(entry);
-					Utilities.copy(sbis,jos,null);
-					sbis.close();
-				}
-			}
-			
-			// close jar
-			jos.close(); jos = null; os = null;
-		} catch(Exception e) {
-			e.printStackTrace();
-		} finally {
-			if (is != null) 
-				try {is.close();} catch(IOException e) {}
-				
-			if (jos != null) 
-				try {jos.close();} catch(IOException e) {}
-			else if (os != null)
-				try {os.close();} catch(IOException e) {}
-		}		
-	}
-	
-	public static void writeSiteManifest(File site, IFeature feature) throws IOException, InstallAbortedException {
-		File manifest = new File(site, "site.xml");
-		FileOutputStream os = new FileOutputStream(manifest);
-		String siteXML = "<site>\n   <feature url=\"features/"+feature.getVersionedIdentifier().toString()+".jar\"/>\n</site>";
-		StringBufferInputStream sbis = new StringBufferInputStream(siteXML);
-		Utilities.copy(sbis,os,null);
-		os.close();
-		sbis.close();
-	}
-	
-	public static Properties getBuildManifest(JarContentReference jar) throws IOException {
-		ContentReference manifestEntry = jar.peek("eclipse/buildmanifest.properties",null/*ContentSelector*/, null/*ProgressMonitor*/);
-		InputStream is = null;
-		Properties props = null;
-		try {
-			props = new Properties();
-			is = manifestEntry.getInputStream();
-			props.load(is);
-		} finally {
-			if (is != null) try{ is.close(); } catch(IOException e) {}
-		}
-		return props;
-	}
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureContentProvider.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureContentProvider.java
deleted file mode 100644
index a0f1c0e..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureContentProvider.java
+++ /dev/null
@@ -1,256 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.jar.JarEntry;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.ContentReference;
-import org.eclipse.update.core.FeatureContentProvider;
-import org.eclipse.update.core.IFeatureContentProvider;
-import org.eclipse.update.core.INonPluginEntry;
-import org.eclipse.update.core.IPluginEntry;
-import org.eclipse.update.core.IVerifier;
-import org.eclipse.update.core.InstallMonitor;
-import org.eclipse.update.core.JarContentReference;
-import org.eclipse.update.core.JarContentReference.ContentSelector;
-import org.eclipse.update.core.model.FeatureModel;
-import org.eclipse.update.core.model.InstallAbortedException;
-
-/**
- * An example feature content provider. It handles features packaged as
- * build zip's using the format used for integration and stable builds
- * posted on the downloads pages at www.eclipse.org
- * </p>
- * @since 2.0
- */
-
-public class BuildZipFeatureContentProvider extends FeatureContentProvider implements IFeatureContentProvider {
-
-	private JarContentReference baseReference;
-	private ContentReference generatedFeatureManifest;	
-	private ContentReference[] featureEntryContentReferences;
-	private IPluginEntry currentPluginEntry;
-	private INonPluginEntry currentNonPluginEntry;
-	
-	public BuildZipFeatureContentProvider(URL base) {
-		super(base);
-		this.baseReference = new JarContentReference("build.zip",base);
-	}
-	
-	/*
-	 * @see IFeatureContentProvider#getFeatureManifest()
-	 */
-	public ContentReference getFeatureManifestReference(InstallMonitor monitor) throws CoreException {
-		if (generatedFeatureManifest == null) {
-			throw newCoreException("Feature manifest is not available",null);
-		}
-		else
-			return generatedFeatureManifest;
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getArchiveReferences()
-	 */
-	public ContentReference[] getArchiveReferences(InstallMonitor monitor) {
-		// the feature and all its plugins files are packaged in a single archive
-		return new ContentReference[] { baseReference };
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getFeatureEntryArchiveReferences()
-	 */
-	public ContentReference[] getFeatureEntryArchiveReferences(InstallMonitor monitor) {
-		// the feature and all its plugins files are packaged in a single archive
-		return new ContentReference[] { baseReference };
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getPluginEntryArchiveReferences(IPluginEntry)
-	 */
-	public ContentReference[] getPluginEntryArchiveReferences(IPluginEntry pluginEntry, InstallMonitor monitor) {
-		// the feature and all its plugins files are packaged in a single archive
-		return new ContentReference[] { baseReference };
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getNonPluginEntryArchiveReferences(INonPluginEntry)
-	 */
-	public ContentReference[] getNonPluginEntryArchiveReferences(INonPluginEntry nonPluginEntry, InstallMonitor monitor) 
-		throws CoreException {
-		try {
-			return peekNonPluginEntryContent(nonPluginEntry,monitor);
-		} catch(IOException e) {
-			throw newCoreException("Unable to return content for non plugin entry "+nonPluginEntry.getIdentifier(),e);
-		}
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getFeatureEntryContentReferences()
-	 */
-	public ContentReference[] getFeatureEntryContentReferences(InstallMonitor monitor) {
-		if (featureEntryContentReferences == null)
-			return new ContentReference[0];
-		else
-			return  featureEntryContentReferences;
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getPluginEntryContentReferences(IPluginEntry)
-	 */
-	public ContentReference[] getPluginEntryContentReferences(IPluginEntry pluginEntry, InstallMonitor monitor)
-		throws CoreException {
-		try {
-			return peekPluginEntryContent(pluginEntry, monitor);
-		} catch(IOException e) {
-			throw newCoreException("Unable to return content for plugin entry "+pluginEntry.getVersionedIdentifier(),e);
-		}
-	}
-	
-	public URL getFeatureBaseURL() throws IOException {
-		return getWorkingDirectory().toURL();
-			
-	}
-
-	ContentReference getFeatureBuildManifest() throws Exception {
-		return baseReference.peek("eclipse/buildmanifest.properties",null/*ContentSelector*/, null/*ProgressMonitor*/);
-	}
-
-	ContentReference getPluginManifest(String pluginId, boolean isFragment) throws Exception {			
-		String manifestName = "eclipse/plugins/" + pluginId + "/" + (isFragment ? "fragment.xml" : "plugin.xml");
-		return baseReference.peek(manifestName, null/*ContentSelector*/, null/*ProgressMonitor*/);
-	}
-	
-	void unpackFeatureEntryContent(FeatureModel feature, InstallMonitor monitor) throws IOException, InstallAbortedException {
-			
-		// define selector for feature entry files
-		ContentSelector selector = new ContentSelector() {
-			public boolean include(JarEntry jarEntry) {
-				if (jarEntry.isDirectory())
-					return false;					
-				String entry = jarEntry.getName();
-				if (entry.startsWith("eclipse/readme/"))
-					return true;
-				else if (entry.startsWith("eclipse/splash/"))
-					return true;
-				else if (entry.startsWith("eclipse/") && entry.indexOf("/",8)==-1 && entry.endsWith(".html"))
-					return true;
-				else
-					return false;	
-			}
-			public String defineIdentifier(JarEntry jarEntry) {
-				String entry = jarEntry.getName();
-				if (entry.startsWith("eclipse/"))
-					return entry.substring(8);
-				else
-					return entry;
-			}
-		};
-		
-		// unpack feature entry files
-		File tmpDir = getWorkingDirectory();
-		ContentReference[] refs = baseReference.unpack(tmpDir, selector, monitor);
-		
-		// write out feature manifest (feature.xml);
-		File manifest = Utilities.createLocalFile(tmpDir,"feature.xml");
-		ContentReference manifestReference = new ContentReference("feature.xml", manifest);
-		DefaultModelWriter w = new DefaultModelWriter(feature);
-		FileOutputStream os = null;
-		try {
-			os = new FileOutputStream(manifest);
-			w.writeFeatureManifest(os);
-		} finally {
-			if (os != null) try { os.close(); } catch(IOException e) {}
-		}
-		this.generatedFeatureManifest = manifestReference;
-		
-		// save references (newly-written feature.xml plus rest of selected feature files)
-		ContentReference[] allRefs = new ContentReference[refs.length+1];
-		allRefs[0] = manifestReference;
-		System.arraycopy(refs,0,allRefs,1,refs.length);
-		featureEntryContentReferences = allRefs;
-	}
-		
-	ContentReference[] peekPluginEntryContent(IPluginEntry plugin, InstallMonitor monitor) throws IOException {
-		
-		// define selector for plugin entry files
-		ContentSelector selector = new ContentSelector() {
-			public boolean include(JarEntry jarEntry) {
-				if (jarEntry.isDirectory())
-					return false;
-				String entry = jarEntry.getName();
-				String id = currentPluginEntry.getVersionedIdentifier().getIdentifier();
-				if (id==null)
-					return false;
-				else if (entry.startsWith("eclipse/plugins/"+id+"/"))
-					return true;
-				else
-					return false;	
-			}
-			public String defineIdentifier(JarEntry jarEntry) {
-				String entry = jarEntry.getName();
-				int ix = entry.indexOf("/",16);
-				if (ix != -1) {
-					return entry.substring(ix+1);
-				} else {
-					return entry;
-				}
-			}
-		};
-		
-		// unpack plugin entry files
-		currentPluginEntry = plugin;
-		return baseReference.peek(selector, monitor);
-	}
-		
-	ContentReference[] peekNonPluginEntryContent(INonPluginEntry data, InstallMonitor monitor) throws IOException {
-		
-		// define selector for non plugin entry files
-		ContentSelector selector = new ContentSelector() {
-			public boolean include(JarEntry jarEntry) {
-				if (jarEntry.isDirectory())
-					return false;
-				String entry = jarEntry.getName();
-				String id = currentNonPluginEntry.getIdentifier();
-				if (!id.equals("root"))
-					return false;
-				else if (!entry.startsWith("eclipse/plugins/"))
-					return true;
-				else
-					return false;	
-			}
-			public String defineIdentifier(JarEntry jarEntry) {
-				String entry = jarEntry.getName();
-				if (entry.startsWith("eclipse/"))
-					return entry.substring(8);
-				else
-					return entry;
-			}
-		};
-		
-		// unpack non plugin entry files
-		currentNonPluginEntry = data;
-		return baseReference.peek(selector, monitor);
-	}
-	
-	private CoreException newCoreException(String s, Throwable e) throws CoreException {
-		return new CoreException(new Status(IStatus.ERROR,"org.eclipse.update.examples",0,s,e));
-	}
-	/*
-	 * @see IFeatureContentProvider#getVerifier()
-	 */
-	public IVerifier getVerifier() throws CoreException {
-		return null;
-	}
-
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureFactory.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureFactory.java
deleted file mode 100644
index d6150b7..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.update.core.BaseFeatureFactory;
-import org.eclipse.update.core.Feature;
-import org.eclipse.update.core.IFeature;
-import org.eclipse.update.core.IFeatureFactory;
-import org.eclipse.update.core.ISite;
-import org.eclipse.update.core.model.FeatureModel;
-
-/**
- * An example feature factory based on the packaging 
- * format used for integration and stable builds
- * posted on the downloads pages at www.eclipse.org
- * </p>
- * @since 2.0
- */
-
-public class BuildZipFeatureFactory
-	extends BaseFeatureFactory
-	implements IFeatureFactory {
-
-	/*
-	 * @see IFeatureFactory#createFeature(URL, ISite, IProgressMonitor)
-	 */
-	public IFeature createFeature(URL url, ISite site, IProgressMonitor monitor) throws CoreException {
-		try {
-			// create content provider for feature
-			BuildZipFeatureContentProvider cp = new BuildZipFeatureContentProvider(url);
-			Feature feature = null;
-			
-			// parse the feature
-			feature = (Feature) parseFeature(cp);
-			
-			// initialize feature
-			feature.setFeatureContentProvider(cp);
-			feature.setSite(site);
-			feature.resolve(cp.getFeatureBaseURL(), null); 
-			feature.markReadOnly();
-			return feature;
-		} catch (Exception e) {
-			throw new CoreException(new Status(IStatus.ERROR,"org.eclipse.update.examples.buildzip",0,"Unable to create feature",e));
-		}
-	}
-
-	/*
-	 * parse the build zip to reconstruct a feature model
-	 */
-	public FeatureModel parseFeature(BuildZipFeatureContentProvider cp) throws Exception {
-		return (new BuildZipFeatureParser(this)).parse(cp);
-	}
-
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureParser.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureParser.java
deleted file mode 100644
index 6748ded..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureParser.java
+++ /dev/null
@@ -1,203 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
- 
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URLDecoder;
-import java.util.Enumeration;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.PluginVersionIdentifier;
-import org.eclipse.update.core.ContentReference;
-import org.eclipse.update.core.model.FeatureModel;
-import org.eclipse.update.core.model.PluginEntryModel;
-import org.eclipse.update.core.model.URLEntryModel;
-
-/**
- * An example feature parser. It handles features packaged as
- * build zip's using the format used for integration and stable builds
- * posted on the downloads pages at www.eclipse.org
- * </p>
- * @since 2.0
- */
-
-public class BuildZipFeatureParser {	
-	
-	private BuildZipFeatureFactory factory;
-	private BuildZipPluginParser pluginParser;
-	
-	public BuildZipFeatureParser(BuildZipFeatureFactory factory) {
-		this.factory = factory;
-	}
-	
-	public FeatureModel parse(BuildZipFeatureContentProvider cp) throws Exception {				
-		return parseFeature(cp);
-	}
-	
-	private FeatureModel parseFeature(BuildZipFeatureContentProvider cp) throws Exception {		
-		
-		// get reference to the build manifest
-		ContentReference manifestRef = cp.getFeatureBuildManifest();
-		InputStream is = manifestRef.getInputStream();		
-		
-		// load buildmanifest.properties
-		Properties manifest = new Properties();
-		try {
-			manifest.load(is);
-		} finally {
-			if (is!=null) try { is.close(); } catch(IOException e) {}
-		}
-		
-		// populate feature model
-		FeatureModel feature = factory.createFeatureModel();
-		parseFeatureEntry(cp, feature, manifest);
-		
-		// parse plugin entries
-		parsePluginEntries(cp, feature, manifest); 
-		
-		// parse non-plugin entries
-		parseNonPluginEntries(cp, feature, manifest);
-		
-		// unpack feature entry content
-		cp.unpackFeatureEntryContent(feature, null/*IProgressMonitor*/);
-		
-		return feature;
-	}
-	
-	private void parseFeatureEntry(BuildZipFeatureContentProvider cp, FeatureModel feature, Properties manifest) throws Exception {
-		
-		// parse out build zip file name. It is assumed to be in the
-		// form <package identifier>-<build date>-<target platform>.zip,
-		// where
-		//		<package identifier> is hyphen (-) separaterd token list
-		//		<build date> is single all-numeric token
-		//		<target platform> is hyphen (-) separaterd token list
-		
-		String pkgId = "";
-		String target = "";
-		String build = "";
-		String state = "ID";
-		boolean firstToken = true;
-		String zipName = URLDecoder.decode(cp.getURL().getFile());
-		int ix = zipName.lastIndexOf("/");
-		if (ix != -1)
-			zipName = zipName.substring(ix+1);
-		if (zipName.endsWith(".zip")) {
-			zipName = zipName.substring(0,zipName.length()-4);
-		}
-		StringTokenizer tokenizer = new StringTokenizer(zipName,"-",false);
-		String token;
-		while(tokenizer.hasMoreTokens()) {
-			token = tokenizer.nextToken();
-			try {
-				Long.parseLong(token);
-				state = "TARGET";
-				target = "";
-				firstToken = true;
-				build = token+".0.0";
-			} catch (NumberFormatException e) {
-				if (state.equals("ID")) {
-					pkgId += (firstToken ? "" : " ") + token;
-				} else {
-					target += (firstToken ? "" : " ") + token;
-				}
-				firstToken = false;
-			}
-		}
-		
-		// generate base feature attributes
-		feature.setFeatureIdentifier(pkgId.replace(' ','.'));
-		feature.setFeatureVersion(build);
-		feature.setLabel(pkgId.substring(0,1).toUpperCase() + pkgId.substring(1) + " for " + target);
-		feature.setProvider("www.eclipse.org");
-		feature.setImageURLString("splash/splash_full.bmp");
-		feature.setOS(target.replace(' ','-'));	
-		
-		// add description
-		URLEntryModel description = factory.createURLEntryModel();
-		description.setURLString("readme/readme.html");
-		description.setAnnotation("x");
-		feature.setDescriptionModel(description);
-		
-		// add license
-		URLEntryModel license = factory.createURLEntryModel();
-		license.setURLString("about.html");
-		license.setAnnotation("You must view the full license by following the \"License\" link in the feature preview.\nSelecting \"Accept\" indicates that you have viewed and accepted the feature license.");
-		feature.setLicenseModel(license);
-		
-		// add copyright
-		URLEntryModel copyright = factory.createURLEntryModel();
-		copyright.setURLString("notice.html");
-		copyright.setAnnotation("x");
-		feature.setCopyrightModel(copyright);
-	}	
-	
-	private void parsePluginEntries(BuildZipFeatureContentProvider cp, FeatureModel feature, Properties manifest) throws Exception {
-		
-		Enumeration entries = manifest.keys();
-		String plugin;
-		String pluginId;
-		String pluginVersion;
-		String pluginBuildVersion;
-		PluginEntryModel pluginEntry;
-		while(entries.hasMoreElements()) {
-			plugin = (String) entries.nextElement();
-			if (plugin.startsWith("plugin@")) {
-				pluginId = plugin.substring(7);
-				pluginBuildVersion = manifest.getProperty(plugin);
-				if (pluginBuildVersion.equals("HEAD")) {
-					String featureVersion = feature.getFeatureVersion();
-					int ix = featureVersion.indexOf(".");
-					String featureMajor = ix==-1 ? featureVersion : featureVersion.substring(0,ix);
-					pluginBuildVersion += "-" + featureMajor;
-				}
-				pluginEntry = factory.createPluginEntryModel();
-				pluginVersion = parsePluginVersionInManifest(cp, pluginId, pluginEntry);
-				if (pluginVersion != null) {
-					pluginEntry.setPluginIdentifier(pluginId);
-					pluginEntry.setPluginVersion((new PluginVersionIdentifier(pluginVersion)).toString()+"."+pluginBuildVersion);
-					feature.addPluginEntryModel(pluginEntry);
-				}
-			}
-		}		
-	}
-	
-	private void parseNonPluginEntries(BuildZipFeatureContentProvider cp, FeatureModel feature, Properties manifest) throws Exception {
-	//	NonPluginEntryModel nonPluginEntry = factory.createNonPluginEntryModel();
-	//	nonPluginEntry.setIdentifier("root");
-	//	feature.addNonPluginEntryModel(nonPluginEntry);
-	}
-	
-	private String parsePluginVersionInManifest(BuildZipFeatureContentProvider cp, String pluginId, PluginEntryModel pluginEntry) {
-
-		if (pluginParser == null)
-			pluginParser = new BuildZipPluginParser();
-				
-		InputStream is = null;				
-		ContentReference pluginManifest;
-		try {
-			// try plugin.xml
-			pluginManifest  = cp.getPluginManifest(pluginId, false);
-			is = pluginManifest.getInputStream();
-			return pluginParser.parse(is);
-		} catch (Exception e) {
-			try {
-				// retry with feature.xml
-				pluginManifest  = cp.getPluginManifest(pluginId, true);
-				is = pluginManifest.getInputStream();
-				String result = pluginParser.parse(is);
-				pluginEntry.isFragment(true);
-				return result;
-			} catch (Exception e2) {
-				return null;
-			}
-		} finally {
-			if (is != null) try { is.close(); } catch (IOException e) {}
-		}
-	}
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipPluginParser.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipPluginParser.java
deleted file mode 100644
index 90e1d1f..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipPluginParser.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.xerces.parsers.SAXParser;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Parse default feature.xml
- */
-
-public class BuildZipPluginParser extends DefaultHandler {
-
-	private SAXParser parser;
-	private String version;
-	
-	private static final String PLUGIN = "plugin";
-	private static final String FRAGMENT = "fragment";
-	private static final String ID = "id";
-	private static final String VERSION = "version";	
-	
-	private class ParseCompleteException extends SAXException {
-		public ParseCompleteException(String arg0) {
-			super(arg0);
-		}
-	}
-
-	/**
-	 * Constructor for DefaultFeatureParser
-	 */
-	public BuildZipPluginParser() {
-		super();
-		this.parser = new SAXParser();
-		this.parser.setContentHandler(this);
-	}
-	
-	/**
-	 * @since 2.0
-	 */
-	public synchronized String parse(InputStream in) throws SAXException, IOException {
-		try {
-			version = null;
-			parser.parse(new InputSource(in));
-		} catch(ParseCompleteException e) {
-		}
-		return version;
-	}
-	
-	/**
-	 * @see DefaultHandler#startElement(String, String, String, Attributes)
-	 */
-	public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
-		
-		String tag = localName.trim();
-	
-		if (tag.equalsIgnoreCase(PLUGIN)) {
-			processPlugin(attributes);
-			return;
-		}
-	
-		if (tag.equalsIgnoreCase(FRAGMENT)) {
-			processPlugin(attributes);
-			return;
-		}
-	}
-	
-	/** 
-	 * process plugin entry info
-	 */
-	private void processPlugin(Attributes attributes) throws ParseCompleteException {
-		version = attributes.getValue("version");
-		throw new ParseCompleteException("");
-	}
-}
-
-
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteContentProvider.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteContentProvider.java
deleted file mode 100644
index 05ec032..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteContentProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.SiteContentProvider;
-
-public class BuildZipSiteContentProvider extends SiteContentProvider {
-
-	/**
-	 * Constructor for SiteContentProvider.
-	 */
-	public BuildZipSiteContentProvider(URL url) {
-		super(url);
-	}
-	
-	/*
-	 * @see ISiteContentProvider#getArchiveReference(String)
-	 */
-	public URL getArchiveReference(String id) throws CoreException {
-		// build zip features do not have associated archives
-		// the zip file also contains the archives files
-		return null;
-	}
-
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteFactory.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteFactory.java
deleted file mode 100644
index df9196b..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteFactory.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.BaseSiteFactory;
-import org.eclipse.update.core.ISite;
-import org.eclipse.update.core.Site;
-import org.eclipse.update.core.model.InvalidSiteTypeException;
-import org.eclipse.update.core.model.CategoryModel;
-
-public class BuildZipSiteFactory extends BaseSiteFactory {
-
-	/*
-	 * @see ISiteFactory#createSite(URL)
-	 */
-	public ISite createSite(URL url) throws CoreException,InvalidSiteTypeException {
-
-		Site site = null;
-
-		// create site and add category
-		site = (Site) createSiteMapModel();
-		CategoryModel category = createSiteCategoryModel();
-		category.setName("eclipse-builds");
-		category.setLabel("Eclipse Builds");
-		site.addCategoryModel(category);
-
-		// set content provider
-		BuildZipSiteContentProvider contentProvider = new BuildZipSiteContentProvider(url);
-		site.setSiteContentProvider(contentProvider);
-
-		// get all matching zip files on the site
-		FileFilter filter = new FileFilter() {
-			public boolean accept(File file) {
-				if (file.getName().endsWith(".zip")) {
-					try {
-						ZipFile zip = new ZipFile(file);
-						ZipEntry entry = zip.getEntry("eclipse/buildmanifest.properties");
-						if (entry == null)
-							return false;
-						else
-							return true;
-					} catch (IOException e) {
-						return false;
-					}
-				} else
-					return false;
-			}
-		};
-		File file = new File(URLDecoder.decode(url.getFile()));
-		File[] zips = file.listFiles(filter);
-
-		// create a reference for each matching zip
-		SiteFeatureReferenceModel ref = null;
-		for (int i = 0; zips != null && i < zips.length; i++) {
-			ref = createFeatureReferenceModel();
-			ref.setType("org.eclipse.update.examples.zip");
-			ref.setSiteModel(site);
-			ref.setURLString("file:" + zips[i].getAbsolutePath());
-			ref.setCategoryNames(new String[] { "eclipse-builds" });
-			site.addFeatureReferenceModel(ref);
-		}
-		try {
-			site.resolve(url, null); // resolve any URLs relative to the site
-		} catch (MalformedURLException e){
-			throw Utilities.newCoreException("",e);
-		}
-
-		return site;
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/DefaultModelWriter.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/DefaultModelWriter.java
deleted file mode 100644
index 9ca8bc4..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/DefaultModelWriter.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
- 
-import java.io.OutputStream;
-import java.io.PrintWriter;
-
-import org.eclipse.update.core.model.*;
-
-/**
- * Write standard feature manifest (feature.xml) from model.
- * </p>
- * @since 2.0
- */
-
-public class DefaultModelWriter {
-	
-	private FeatureModel feature;
-	
-	/**
-	 * @since 2.0
-	 */
-	public DefaultModelWriter(FeatureModel feature) {
-		this.feature = feature;
-	}
-	
-	/**
-	 * @since 2.0
-	 */
-	public void writeFeatureManifest(OutputStream os) {
-		PrintWriter w = new PrintWriter(os);
-		writeFeature(w,0,feature);
-		w.flush();
-	}
-	
-	private void writeFeature(PrintWriter w, int level, FeatureModel feature) {
-		if (feature == null) return;
-		
-		String in = getIndent(level);
-		w.println(in+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-		
-		w.println(in+"<feature");
-		if (feature.getFeatureIdentifier()!=null)
-			w.println(in+"   "+"id=\""+feature.getFeatureIdentifier()+"\"");
-		if (feature.getFeatureVersion()!=null)
-			w.println(in+"   "+"version=\""+feature.getFeatureVersion()+"\"");
-		if (feature.getLabelNonLocalized()!=null)
-			w.println(in+"   "+"label=\""+feature.getLabelNonLocalized()+"\"");
-		if (feature.getProviderNonLocalized()!=null)
-			w.println(in+"   "+"provider-name=\""+feature.getProviderNonLocalized()+"\"");
-		if (feature.getImageURLString()!=null)
-			w.println(in+"   "+"image=\""+feature.getImageURLString()+"\"");
-		if (feature.getOS()!=null)
-			w.println(in+"   "+"os=\""+feature.getOS()+"\"");
-		if (feature.getWS()!=null)
-			w.println(in+"   "+"ws=\""+feature.getWS()+"\"");
-		if (feature.getNL()!=null)
-			w.println(in+"   "+"nl=\""+feature.getNL()+"\"");
-		if (feature.getApplication()!=null)
-			w.println(in+"   "+"application=\""+feature.getApplication()+"\"");
-		w.println(in+"   "+">");
-		
-		writeDescription(w, level+1, feature.getDescriptionModel());
-		writeCopyright(w, level+1, feature.getCopyrightModel());
-		writeLicense(w, level+1, feature.getLicenseModel());
-		writeURLs(w, level+1, feature);
-		writePrereqs(w, level+1, feature);
-		writePluginEntries(w, level+1, feature);
-		writeNonPluginEntries(w, level+1, feature);
-         
-        w.println("");
-        w.println(in+"</feature>");
-	}
-	
-	private void writeDescription(PrintWriter w, int level, URLEntryModel ue) {
-		writeDescriptionEntry(w,level, ue, "description");
-	}
-	
-	private void writeCopyright(PrintWriter w, int level, URLEntryModel ue) {
-		writeDescriptionEntry(w,level, ue, "copyright");
-	}
-	
-	private void writeLicense(PrintWriter w, int level, URLEntryModel ue) {
-		writeDescriptionEntry(w,level, ue, "license");
-	}
-	
-	private void writeDescriptionEntry(PrintWriter w, int level, URLEntryModel ue, String tag) {
-		if (ue == null) return;
-		String url = ue.getURLString();
-		String txt = ue.getAnnotationNonLocalized();
-		if (url==null && txt==null) return;
-		
-		String in = getIndent(level);
-		w.println("");
-		if (url==null)
-			w.println(in+"<"+tag+">");
-		else {
-			w.print(in+"<"+tag+" url=\""+ue.getURLString()+"\"");
-			if (txt==null)
-				w.println("/>");
-			else
-				w.println(">");
-		}
-		if (txt!=null) {
-			w.println(in + txt);
-			w.println(in+"</"+tag+">");
-		}
-	}
-	
-	private void writeURLs(PrintWriter w, int level, FeatureModel feature) {	
-		URLEntryModel update = feature.getUpdateSiteEntryModel();
-		URLEntryModel[] discovery = feature.getDiscoverySiteEntryModels();		
-		if (update == null && (discovery == null || discovery.length==0)) return;
-		
-		String in = getIndent(level);
-		String in2 = getIndent(level+1);		
-		w.println("");
-		w.println(in+"<url>");
-		
-		if (update != null) {
-			w.println(in2+"<update");
-			if (update.getURLString()!=null)
-				w.println(in2+"   "+"url=\""+update.getURLString()+"\"");
-			if (update.getAnnotationNonLocalized()!=null)
-				w.println(in2+"   "+"label=\""+update.getAnnotationNonLocalized()+"\"");
-			w.println(in2+"   "+"/>");
-		}
-		
-		for (int i=0; discovery!=null && i<discovery.length; i++) {
-			w.println(in2+"<discovery");
-			if (discovery[i].getURLString()!=null)	
-				w.println(in2+"   "+"url=\""+discovery[i].getURLString()+"\"");
-			if (discovery[i].getAnnotationNonLocalized()!=null)
-				w.println(in2+"   "+"label=\""+discovery[i].getAnnotationNonLocalized()+"\"");
-			w.println(in2+"   "+"/>");
-		}
-		
-		w.println(in+"</url>");
-	}
-	
-	private void writePrereqs(PrintWriter w, int level, FeatureModel feature) {	
-		ImportModel[] imp = feature.getImportModels();	
-		if (imp == null || imp.length == 0) return;
-		
-		String in = getIndent(level);
-		String in2 = getIndent(level+1);
-		w.println("");
-		w.println(in+"<requires>");
-		
-		for (int i=0; imp!=null && i<imp.length; i++) {
-			w.println(in2+"<import");
-			if (imp[i].getIdentifier()!=null)
-				w.println(in2+"   "+"plugin=\""+imp[i].getIdentifier()+"\"");
-			if (imp[i].getVersion()!=null)
-				w.println(in2+"   "+"version=\""+imp[i].getVersion()+"\"");
-			if (imp[i].getMatchingRuleName()!=null)
-				w.println(in2+"   "+"match=\""+imp[i].getMatchingRuleName()+"\"");
-			w.println(in2+"   "+"/>");
-		}
-		
-		w.println(in+"</requires>");
-	}
-	
-	private void writePluginEntries(PrintWriter w, int level, FeatureModel feature) {
-		PluginEntryModel[] plugin = feature.getPluginEntryModels();
-		if (plugin == null || plugin.length == 0) return;
-		
-		String in = getIndent(level);
-		w.println("");
-		
-		for (int i=0; i<plugin.length; i++) {
-			w.println(in+"<plugin");
-			if (plugin[i].getPluginIdentifier()!=null)
-				w.println(in+"   "+"id=\""+plugin[i].getPluginIdentifier()+"\"");
-			if (plugin[i].getPluginVersion()!=null)
-				w.println(in+"   "+"version=\""+plugin[i].getPluginVersion()+"\"");
-			if (plugin[i].isFragment())
-				w.println(in+"   "+"fragment=\""+plugin[i].isFragment()+"\"");
-			if (plugin[i].getOS()!=null)
-				w.println(in+"   "+"os=\""+plugin[i].getOS()+"\"");
-			if (plugin[i].getWS()!=null)
-				w.println(in+"   "+"ws=\""+plugin[i].getWS()+"\"");
-			if (plugin[i].getNL()!=null)
-				w.println(in+"   "+"nl=\""+plugin[i].getNL()+"\"");
-			if (plugin[i].getDownloadSize()!=ContentEntryModel.UNKNOWN_SIZE)
-				w.println(in+"   "+"download-size=\""+plugin[i].getDownloadSize()+"\"");
-			if (plugin[i].getInstallSize()!=ContentEntryModel.UNKNOWN_SIZE)
-				w.println(in+"   "+"install-size=\""+plugin[i].getInstallSize()+"\"");
-			w.println(in+"   "+"/>");
-		}
-	}
-	
-	private void writeNonPluginEntries(PrintWriter w, int level, FeatureModel feature) {
-		NonPluginEntryModel[] data = feature.getNonPluginEntryModels();
-		if (data == null || data.length == 0) return;
-		
-		String in = getIndent(level);
-		w.println("");
-		
-		for (int i=0; i<data.length; i++) {
-			w.println(in+"<data");
-			if (data[i].getIdentifier()!=null)
-				w.println(in+"   "+"id=\""+data[i].getIdentifier()+"\"");
-			if (data[i].getOS()!=null)
-				w.println(in+"   "+"os=\""+data[i].getOS()+"\"");
-			if (data[i].getWS()!=null)
-				w.println(in+"   "+"ws=\""+data[i].getWS()+"\"");
-			if (data[i].getNL()!=null)
-				w.println(in+"   "+"nl=\""+data[i].getNL()+"\"");
-			if (data[i].getDownloadSize()!=ContentEntryModel.UNKNOWN_SIZE)
-				w.println(in+"   "+"download-size=\""+data[i].getDownloadSize()+"\"");
-			if (data[i].getInstallSize()!=ContentEntryModel.UNKNOWN_SIZE)
-				w.println(in+"   "+"install-size=\""+data[i].getInstallSize()+"\"");
-			w.println(in+"   "+"/>");
-		}
-	}
-	
-	
-	private String getIndent(int level) {
-		String indent = "";
-		for (int i=0; i<level; i++) 
-			indent += "   ";
-		return indent;
-	}
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/Test.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/Test.java
deleted file mode 100644
index 1e189df..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/Test.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
-
-import java.net.URL;
-
-import org.eclipse.update.core.*;
- 
-/**
- * unit test harness
- */
-
-public class Test {
-
-	public static void main(String[] args) {
-		
-		try {
-			URL url = new URL("file:d:/downloads/eclipse 2.0/integration-eclipse-SDK-20020109-win32.zip");
-			BuildZipFeatureFactory factory = new BuildZipFeatureFactory();
-			Feature feature = (Feature) factory.createFeature(url,null/*ISite*/);
-			DefaultModelWriter w = new DefaultModelWriter(feature);
-			w.writeFeatureManifest(System.out);
-			
-			System.out.println("");
-			System.out.println("Feature entry references");
-			ContentReference[] refs = feature.getFeatureContentProvider().getFeatureEntryContentReferences(null);
-			for (int i=0; i< refs.length; i++) {
-				System.out.println("   "+refs[i].getIdentifier());
-			}
-			
-			System.out.println("");
-			System.out.println("Plug-in entry references");
-			IPluginEntry[] entry = feature.getPluginEntries();
-			refs = feature.getFeatureContentProvider().getPluginEntryContentReferences(entry[0], null);
-			for (int i=0; i< refs.length; i++) {
-				System.out.println("   "+refs[i].getIdentifier());
-			}			
-			
-			System.out.println("");
-			System.out.println("Non-plug-in entry references");
-			INonPluginEntry[] data = feature.getNonPluginEntries();
-			refs = feature.getFeatureContentProvider().getNonPluginEntryArchiveReferences(data[0], null);
-			for (int i=0; i< refs.length; i++) {
-				System.out.println("   "+refs[i].getIdentifier());
-			}			
-			
-			System.out.println("Done ...");
-		} catch (Exception e) {
-			e.printStackTrace();
-		}		
-	}
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/java.page.jpage b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/java.page.jpage
deleted file mode 100644
index 6cb24bd..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/java.page.jpage
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-java.util.Properties p = System.getProperties();
-java.util.Enumeration keys = p.keys();
-while (keys.hasMoreElements()) {
-	String key = (String)keys.nextElement();
-	System.out.println(key + " = " + (String)p.get(key));
-}
-
-
-
-
-
-String fileName = "d:\\downloads\\eclipse 2.0\\integration-eclipse-SDK-20020109-win32.zip";
-java.io.File archiveFile = new java.io.File(fileName);
-java.util.jar.JarFile jarArchive = new java.util.jar.JarFile(archiveFile);
-java.util.jar.JarEntry entry;
-java.util.Enumeration entries = jarArchive.entries();
-while(entries.hasMoreElements()) {
-	entry = (java.util.jar.JarEntry) entries.nextElement();
-	System.out.println(entry.getName());
-}
-
-
-String a = "223";
-String b = "123";
-a.compareTo(b);
-
-
-org.eclipse.update.core.Version v1 = 
-	new org.eclipse.update.core.Version(1,2,3,"build 127J");
-org.eclipse.update.core.Version v2 = 
-	new org.eclipse.update.core.Version(1,2,3,"build 127J");
-v1.compare(v2);
-
-
-java.io.File f = new java.io.File("d:\\downloads\\eclipse 2.0\\x\\");
-f.isDirectory();
-
-
-String s = "hello";
-Object a = java.lang.reflect.Array.newInstance(s.getClass(),0);
-System.out.println(a.getClass().getName());
-
-
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteContentProvider.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteContentProvider.java
deleted file mode 100644
index 2cbeab4..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteContentProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.eclipse.update.examples.freeform;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.update.core.SiteContentProvider;
-
-public class FreeFormSiteContentProvider extends SiteContentProvider {
-
-	/**
-	 * Constructor for SiteContentProvider.
-	 */
-	public FreeFormSiteContentProvider(URL url) {
-		super(url);
-	}
-	
-	/*
-	 * @see ISiteContentProvider#getArchiveReference(String)
-	 */
-	public URL getArchiveReference(String id) throws CoreException {
-		try {
-			return new URL(getURL(),id);
-		} catch(MalformedURLException e) {
-			throw newCoreException("Unable to return archive URL",e);
-		}
-	}
-	
-	private CoreException newCoreException(String s, Throwable e) throws CoreException {
-		return new CoreException(new Status(IStatus.ERROR,"org.eclipse.update.examples",0,s,e));
-	}
-
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteFactory.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteFactory.java
deleted file mode 100644
index cb3c7fc..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteFactory.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.update.examples.freeform;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.BaseSiteFactory;
-import org.eclipse.update.core.ISite;
-import org.eclipse.update.core.Site;
-import org.eclipse.update.core.model.InvalidSiteTypeException;
-import org.eclipse.update.core.model.URLEntryModel;
-
-public class FreeFormSiteFactory extends BaseSiteFactory {
-
-	/*
-	 * @see ISiteFactory#createSite(URL)
-	 */
-	public ISite createSite(URL url)
-		throws CoreException, InvalidSiteTypeException {
-
-		// Create site
-		Site site = null;
-		InputStream is = null;
-		try {
-			is = url.openStream();
-			site = (Site) parseSite(is);
-
-			URLEntryModel realSiteRef = site.getDescriptionModel();
-			if (realSiteRef == null)
-				throw Utilities.newCoreException(
-					"Unable to obtain update site reference",
-					null);
-			String siteURLString = realSiteRef.getURLString();
-			if (siteURLString == null)
-				throw Utilities.newCoreException(
-					"Unable to obtain update site reference",
-					null);
-			URL siteURL = new URL(siteURLString);
-			FreeFormSiteContentProvider contentProvider =
-				new FreeFormSiteContentProvider(siteURL);
-			site.setSiteContentProvider(contentProvider);
-			site.resolve(siteURL, null); // resolve any URLs relative to the site
-
-		} catch (MalformedURLException e){
-			throw Utilities.newCoreException("Unable to create URL",e);
-		} catch (IOException e){
-			throw Utilities.newCoreException("Unable to access URL",e);
-		} finally {
-			if (is != null)
-				try {
-					is.close();
-				} catch (IOException e) {
-				}
-		}
-
-		return site;
-	}
-
-	/*
-	 * @see SiteModelFactory#canParseSiteType(String)
-	 */
-	public boolean canParseSiteType(String type) {
-		return type != null
-			&& type.equals("org.eclipse.update.examples.site.freeform");
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.scheduler/.classpath b/update/org.eclipse.update.scheduler/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/update/org.eclipse.update.scheduler/.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/update/org.eclipse.update.scheduler/.cvsignore b/update/org.eclipse.update.scheduler/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/update/org.eclipse.update.scheduler/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/update/org.eclipse.update.scheduler/.project b/update/org.eclipse.update.scheduler/.project
deleted file mode 100644
index 2321d8c..0000000
--- a/update/org.eclipse.update.scheduler/.project
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.scheduler</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.jface.text</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.ui.editors</project>
-		<project>org.eclipse.ui.ide</project>
-		<project>org.eclipse.ui.views</project>
-		<project>org.eclipse.ui.workbench.texteditor</project>
-		<project>org.eclipse.update.core</project>
-		<project>org.eclipse.update.core.linux</project>
-		<project>org.eclipse.update.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/update/org.eclipse.update.scheduler/about.html b/update/org.eclipse.update.scheduler/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/update/org.eclipse.update.scheduler/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.scheduler/build.properties b/update/org.eclipse.update.scheduler/build.properties
deleted file mode 100644
index c0f5125..0000000
--- a/update/org.eclipse.update.scheduler/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-bin.includes = plugin.properties,\
-               *.jar,\
-               plugin.xml,\
-               about.html
-src.includes = about.html
-source.scheduler.jar = src/
diff --git a/update/org.eclipse.update.scheduler/plugin.properties b/update/org.eclipse.update.scheduler/plugin.properties
deleted file mode 100644
index 5469fc3..0000000
--- a/update/org.eclipse.update.scheduler/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#
-# Update Scheduler plugin.xml resources
-#
-pluginName = Automatic Updates Scheduler
-providerName = Eclipse.org
-automaticUpdatesPrefPage = Automatic Updates
\ No newline at end of file
diff --git a/update/org.eclipse.update.scheduler/plugin.xml b/update/org.eclipse.update.scheduler/plugin.xml
deleted file mode 100644
index f73f003..0000000
--- a/update/org.eclipse.update.scheduler/plugin.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.update.scheduler"
-   name="%pluginName"
-   version="3.0.0"
-   provider-name="%providerName"
-   class="org.eclipse.update.internal.scheduler.UpdateScheduler">
-
-   <runtime>
-      <library name="scheduler.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.ui.ide" optional="true"/>
-      <import plugin="org.eclipse.ui.views" optional="true"/>
-      <import plugin="org.eclipse.jface.text" optional="true"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor" optional="true"/>
-      <import plugin="org.eclipse.ui.editors" optional="true"/>
-      <import plugin="org.eclipse.update.core"/>
-      <import plugin="org.eclipse.update.ui"/>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-
-	<extension id="preferences" point="org.eclipse.core.runtime.preferences" name="preferences">
-		<initializer class="org.eclipse.update.internal.scheduler.preferences.PreferenceInitializer"/>
-	</extension>
-   <extension
-         point="org.eclipse.ui.startup">
-      <startup class="org.eclipse.update.internal.scheduler.SchedulerStartup">
-      </startup>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%automaticUpdatesPrefPage"
-            category="org.eclipse.update.internal.ui.preferences.MainPreferencePage"
-            class="org.eclipse.update.internal.scheduler.preferences.AutomaticUpdatesPreferencePage"
-            id="org.eclipse.update.scheduler.AutomaticUpdatesPreferencePage">
-      </page>
-   </extension>
-
-</plugin>
diff --git a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/AutomaticUpdatesJob.java b/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/AutomaticUpdatesJob.java
deleted file mode 100644
index a5bc048..0000000
--- a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/AutomaticUpdatesJob.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.scheduler;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.update.core.IFeature;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.operations.UpdateUtils;
-import org.eclipse.update.internal.ui.wizards.*;
-import org.eclipse.update.operations.*;
-import org.eclipse.update.search.*;
-
-public class AutomaticUpdatesJob extends Job {
-	
-	private class AutomaticSearchResultCollector implements IUpdateSearchResultCollector {
-		public void accept(IFeature feature) {
-			IInstallFeatureOperation operation =
-				OperationsManager
-					.getOperationFactory()
-					.createInstallOperation(null, feature, null, null, null);
-			updates.add(operation);
-		}
-	}
-	
-	// job family	
-	public static final Object family = new Object();
-	private IUpdateSearchResultCollector resultCollector;
-	
-	private static final IStatus OK_STATUS =
-		new Status(
-			IStatus.OK,
-			UpdateScheduler.getPluginId(),
-			IStatus.OK,
-			"", //$NON-NLS-1$
-			null);
-	private UpdateSearchRequest searchRequest;
-	private ArrayList updates;
-
-	public AutomaticUpdatesJob() {
-		super(UpdateScheduler.getString("AutomaticUpdatesJob.AutomaticUpdateSearch")); //$NON-NLS-1$
-		updates = new ArrayList();
-		setPriority(Job.DECORATE);
-	}
-
-
-	/**
-	 * Returns the standard display to be used. The method first checks, if
-	 * the thread calling this method has an associated disaply. If so, this
-	 * display is returned. Otherwise the method returns the default display.
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null)
-			display = Display.getDefault();
-		return display;
-	}
-
-	public boolean belongsTo(Object family) {
-		return AutomaticUpdatesJob.family == family;
-	}
-	
-	public IStatus run(IProgressMonitor monitor) {
-		if (UpdateCore.DEBUG) {
-			UpdateCore.debug("Automatic update search started."); //$NON-NLS-1$
-		}
-		searchRequest = UpdateUtils.createNewUpdatesRequest(null);
-		try {
-			if (resultCollector == null)
-				resultCollector = new AutomaticSearchResultCollector();
-			searchRequest.performSearch(resultCollector, monitor);
-			if (UpdateCore.DEBUG) {
-				UpdateCore.debug("Automatic update search finished - " //$NON-NLS-1$
-				+ updates.size()
-				+ " results."); //$NON-NLS-1$
-			}
-			if (updates.size() > 0) {
-				boolean download = UpdateScheduler.getDefault().getPluginPreferences().getBoolean(UpdateScheduler.P_DOWNLOAD);
-				// silently download if download enabled 
-				if (download)
-				{
-					if (UpdateCore.DEBUG) {
-						UpdateCore.debug("Automatic download of updates started."); //$NON-NLS-1$
-					}
-					for (int i=0; i<updates.size(); i++) {
-						IInstallFeatureOperation op = (IInstallFeatureOperation)updates.get(i);
-						IFeature feature = op.getFeature();
-						UpdateUtils.downloadFeatureContent(op.getTargetSite(), feature, null, monitor);
-					}
-					if (UpdateCore.DEBUG) {
-						UpdateCore.debug("Automatic download of updates finished."); //$NON-NLS-1$
-					}
-				}
-				// prompt the user
-				if (!InstallWizard.isRunning()) {
-					if (download) {
-						getStandardDisplay().asyncExec(new Runnable() {
-							public void run() {
-								asyncNotifyDownloadUser();
-							}
-						});
-					} else {
-						getStandardDisplay().asyncExec(new Runnable() {
-							public void run() {
-								asyncNotifyUser();
-							}
-						});	
-					}
-				}
-				return Job.ASYNC_FINISH;
-			}
-		} catch (CoreException e) {
-			return e.getStatus();
-		}
-		return OK_STATUS;
-	}
-
-	private void asyncNotifyUser() {
-		// ask the user to install updates
-		getStandardDisplay().beep();
-		if (MessageDialog
-			.openQuestion(
-				UpdateScheduler.getActiveWorkbenchShell(),
-				UpdateScheduler.getString("AutomaticUpdatesJob.EclipseUpdates1"), //$NON-NLS-1$
-				UpdateScheduler.getString("AutomaticUpdatesJob.UpdatesAvailable"))) { //$NON-NLS-1$
-			BusyIndicator.showWhile(getStandardDisplay(), new Runnable() {
-				public void run() {
-					openInstallWizard();
-				}
-			});
-		}
-		// notify the manager that the job is done
-		done(OK_STATUS);
-	}
-	
-	private void asyncNotifyDownloadUser() {
-		// ask the user to install updates
-		getStandardDisplay().beep();
-		if (MessageDialog
-			.openQuestion(
-				UpdateScheduler.getActiveWorkbenchShell(),
-				UpdateScheduler.getString("AutomaticUpdatesJob.EclipseUpdates2"), //$NON-NLS-1$
-				UpdateScheduler.getString("AutomaticUpdatesJob.UpdatesDownloaded"))) { //$NON-NLS-1$
-			BusyIndicator.showWhile(getStandardDisplay(), new Runnable() {
-				public void run() {
-					openInstallWizard();
-				}
-			});
-		} else {
-			// Don't discard downloaded data, as next time we compare timestamps.
-			
-			// discard all the downloaded data from cache (may include old data as well)
-			//Utilities.flushLocalFile();
-		}
-		// notify the manager that the job is done
-		done(OK_STATUS);
-	}
-
-	private void openInstallWizard() {
-		if (InstallWizard.isRunning())
-			// job ends and a new one is rescheduled
-			return;
-			
-		InstallWizard wizard = new InstallWizard(searchRequest, updates);
-		WizardDialog dialog =
-			new ResizableInstallWizardDialog(
-				UpdateScheduler.getActiveWorkbenchShell(),
-				wizard,
-				UpdateScheduler.getString("AutomaticUpdatesJob.Updates")); //$NON-NLS-1$
-		dialog.create();
-		dialog.open();
-	}
-}
diff --git a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/SchedulerStartup.java b/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/SchedulerStartup.java
deleted file mode 100644
index f764f4c..0000000
--- a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/SchedulerStartup.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.scheduler;
-
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.*;
-import org.eclipse.ui.*;
-
-
-/**
- * This plug-in is loaded on startup to fork a job that
- * searches for new plug-ins.
- */
-public class SchedulerStartup implements IStartup {
-	// Preferences
-	public static final String P_ENABLED = "enabled"; //$NON-NLS-1$
-
-	public static final String P_SCHEDULE = "schedule"; //$NON-NLS-1$
-	public static final String VALUE_ON_STARTUP = "on-startup"; //$NON-NLS-1$
-	public static final String VALUE_ON_SCHEDULE = "on-schedule"; //$NON-NLS-1$
-	
-	public static final String P_DOWNLOAD = "download"; // value is true or false, default is false //$NON-NLS-1$
-
-	// values are to be picked up from the arryas DAYS and HOURS 
-	public static final String P_DAY = "day"; //$NON-NLS-1$
-	public static final String P_HOUR = "hour"; //$NON-NLS-1$
-
-	// Keeps track of running job
-	private Job job;
-	// Listener for job changes
-	private UpdateJobChangeAdapter jobListener;
-
-	public static final String[] DAYS =
-		{
-			UpdateScheduler.getString("SchedulerStartup.day"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.Monday"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.Tuesday"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.Wednesday"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.Thursday"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.Friday"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.Saturday"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.Sunday") }; //$NON-NLS-1$
-
-	public static final String[] HOURS =
-		{
-			UpdateScheduler.getString("SchedulerStartup.1AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.2AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.3AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.4AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.5AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.6AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.7AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.8AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.9AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.10AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.11AM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.12PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.1PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.2PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.3PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.4PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.5PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.6PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.7PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.8PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.9PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.10PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.11PM"), //$NON-NLS-1$
-			UpdateScheduler.getString("SchedulerStartup.12AM"), //$NON-NLS-1$
-			};
-
-	private class UpdateJobChangeAdapter extends JobChangeAdapter {
-		public void done(IJobChangeEvent event) {
-			if (event.getJob() == SchedulerStartup.this.job) {
-				scheduleUpdateJob();
-			}
-		}
-	}
-	
-	/**
-	 * The constructor.
-	 */
-	public SchedulerStartup() {
-		UpdateScheduler.setScheduler(this);
-		jobListener = new UpdateJobChangeAdapter();
-		Platform.getJobManager().addJobChangeListener(jobListener);
-	}
-
-	public void earlyStartup() {
-		scheduleUpdateJob();
-	}
-
-	public void scheduleUpdateJob() {
-		Preferences pref = UpdateScheduler.getDefault().getPluginPreferences();
-		// See if automatic search is enabled at all
-		if (pref.getBoolean(P_ENABLED) == false)
-			return;
-
-		String schedule = pref.getString(P_SCHEDULE);
-		long delay = -1L;
-		if (schedule.equals(VALUE_ON_STARTUP))
-			// have we already started a job ?
-			if (job == null)
-				delay = 0L;
-			else
-				delay = -1L;
-		else
-			delay = computeDelay(pref);
-		if (delay == -1L)
-			return;
-		startSearch(delay);
-	}
-
-	private int getDay(Preferences pref) {
-		String day = pref.getString(P_DAY);
-		for (int d = 0; d < DAYS.length; d++)
-			if (DAYS[d].equals(day))
-				switch (d) {
-					case 0 :
-						return -1;
-					case 1 :
-						return Calendar.MONDAY;
-					case 2 :
-						return Calendar.TUESDAY;
-					case 3 :
-						return Calendar.WEDNESDAY;
-					case 4 :
-						return Calendar.THURSDAY;
-					case 5 :
-						return Calendar.FRIDAY;
-					case 6 :
-						return Calendar.SATURDAY;
-					case 7 :
-						return Calendar.SUNDAY;
-				}
-		return -1;
-	}
-
-	private int getHour(Preferences pref) {
-		String hour = pref.getString(P_HOUR);
-		for (int h = 0; h < HOURS.length; h++)
-			if (HOURS[h].equals(hour))
-				return h + 1;
-		return 1;
-	}
-	/*
-	 * Computes the number of milliseconds from this moment
-	 * to the next scheduled search. If that moment has
-	 * already passed, returns 0L (start immediately).
-	 */
-	private long computeDelay(Preferences pref) {
-
-		int target_d = getDay(pref);
-		int target_h = getHour(pref);
-
-		Calendar calendar = Calendar.getInstance();
-		// may need to use the BootLoader locale
-		int current_d = calendar.get(Calendar.DAY_OF_WEEK);
-		// starts with SUNDAY
-		int current_h = calendar.get(Calendar.HOUR_OF_DAY);
-		int current_m = calendar.get(Calendar.MINUTE);
-		int current_s = calendar.get(Calendar.SECOND);
-		int current_ms = calendar.get(Calendar.MILLISECOND);
-
-		long delay = 0L; // milliseconds
-
-		if (target_d == -1) {
-			// Compute the delay for "every day at x o'clock"
-			// Is it now ?
-			if (target_h == current_h && current_m == 0 && current_s == 0)
-				return delay;
-
-			int delta_h = target_h - current_h;
-			if (target_h <= current_h)
-				delta_h += 24;
-			delay =
-				((delta_h * 60 - current_m) * 60 - current_s) * 1000 - current_ms;
-			return delay;
-		} else {
-			// Compute the delay for "every Xday at x o'clock"
-			// Is it now ?
-			if (target_d == current_d
-				&& target_h == current_h
-				&& current_m == 0
-				&& current_s == 0)
-				return delay;
-
-			int delta_d = target_d - current_d;
-			if (target_d < current_d
-				|| target_d == current_d
-				&& (target_h < current_h
-					|| target_h == current_h
-					&& current_m > 0))
-				delta_d += 7;
-
-			delay =
-				(((delta_d * 24 + target_h - current_h) * 60 - current_m) * 60 - current_s)* 1000 - current_ms;
-
-			return delay;
-		}
-		//return -1L;
-	}
-
-	private void startSearch(long delay) {
-		if (job != null) {
-			// cancel old job.
-			// We need to deregister the listener first,so we won't automatically start another job
-			Platform.getJobManager().removeJobChangeListener(jobListener);
-			Platform.getJobManager().cancel(AutomaticUpdatesJob.family);
-			Platform.getJobManager().addJobChangeListener(jobListener);
-		}
-		job = new AutomaticUpdatesJob();
-		job.schedule(delay);
-	}
-}
diff --git a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/UpdateScheduler.java b/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/UpdateScheduler.java
deleted file mode 100644
index b44d5d6..0000000
--- a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/UpdateScheduler.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.scheduler;
-
-import java.lang.reflect.*;
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.dialogs.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.plugin.*;
-import org.osgi.framework.*;
-
-/**
- * This plug-in is loaded on startup to fork a job that
- * searches for new plug-ins.
- */
-public class UpdateScheduler extends AbstractUIPlugin{
-	// Preferences
-	public static final String P_ENABLED = "enabled"; //$NON-NLS-1$
-	public static final String P_SCHEDULE = "schedule"; //$NON-NLS-1$
-	public static final String VALUE_ON_STARTUP = "on-startup"; //$NON-NLS-1$
-	public static final String VALUE_ON_SCHEDULE = "on-schedule"; //$NON-NLS-1$
-	public static final String P_DOWNLOAD = "download"; // value is true or false, default is false //$NON-NLS-1$
-
-	//The shared instance.
-	private static UpdateScheduler plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-	
-	// singleton
-	private static SchedulerStartup scheduler;
-
-	/**
-	 * The constructor.
-	 */
-	public UpdateScheduler() {
-		plugin = this;
-	}
-
-
-	public ResourceBundle getResourceBundle() {
-		if (resourceBundle == null)
-			try {
-				resourceBundle = ResourceBundle.getBundle("org.eclipse.update.internal.scheduler.UpdateSchedulerResources"); //$NON-NLS-1$
-			} catch (MissingResourceException x) {
-				resourceBundle = null;
-			}
-		return resourceBundle;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static UpdateScheduler getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle,
-	 * or 'key' if not found.
-	 */
-	public static String getString(String key) {
-		ResourceBundle bundle =
-			UpdateScheduler.getDefault().getResourceBundle();
-		try {
-			return bundle.getString(key);
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	public static String getFormattedMessage(String key, String[] args) {
-		String text = getString(key);
-		return java.text.MessageFormat.format(text, args);
-	}
-
-	public static String getFormattedMessage(String key, String arg) {
-		String text = getString(key);
-		return java.text.MessageFormat.format(text, new String[] { arg });
-	}
-
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	public static void logException(Throwable e) {
-		logException(e, true);
-	}
-
-	public static void logException(Throwable e, boolean showErrorDialog) {
-		if (e instanceof InvocationTargetException) {
-			e = ((InvocationTargetException) e).getTargetException();
-		}
-
-		IStatus status = null;
-		if (e instanceof CoreException) {
-			status = ((CoreException) e).getStatus();
-		} else {
-			String message = e.getMessage();
-			if (message == null)
-				message = e.toString();
-			status =
-				new Status(
-					IStatus.ERROR,
-					getPluginId(),
-					IStatus.OK,
-					message,
-					e);
-		}
-		log(status, showErrorDialog);
-	}
-
-	public static void log(IStatus status, boolean showErrorDialog) {
-		if (status.getSeverity() != IStatus.INFO) {
-			if (showErrorDialog)
-				ErrorDialog.openError(
-					getActiveWorkbenchShell(),
-					null,
-					null,
-					status);
-//			 Should log on the update plugin's log
-//			Platform.getPlugin("org.eclipse.core.runtime").getLog().log(status); //$NON-NLS-1$
-			Bundle bundle = Platform.getBundle("org.eclipse.update.scheduler");  //$NON-NLS-1$
-			Platform.getLog(bundle).log(status);
-		} else {
-			MessageDialog.openInformation(
-				getActiveWorkbenchShell(),
-				null,
-				status.getMessage());
-		}
-	}
-
-	public static IWorkbenchPage getActivePage() {
-		UpdateScheduler plugin = getDefault();
-		IWorkbenchWindow window =
-			plugin.getWorkbench().getActiveWorkbenchWindow();
-		if (window != null)
-			return window.getActivePage();
-		return null;
-	}
-
-	public static Shell getActiveWorkbenchShell() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		return window != null ? window.getShell() : null;
-	}
-
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-	
-	public static SchedulerStartup getScheduler() {
-		// If the scheduler was disabled, it does not get initialized
-		if (scheduler == null)
-			scheduler = new SchedulerStartup();
-		return scheduler;
-	}
-	
-	static void setScheduler(SchedulerStartup scheduler) {
-		UpdateScheduler.scheduler = scheduler;
-	}
-}
diff --git a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/UpdateSchedulerResources.properties b/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/UpdateSchedulerResources.properties
deleted file mode 100644
index 3680cd4..0000000
--- a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/UpdateSchedulerResources.properties
+++ /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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#Messages for Update Scheduler plug-in
-
-SchedulerStartup.day=Every day
-SchedulerStartup.Monday=Every Monday
-SchedulerStartup.Tuesday=Every Tuesday
-SchedulerStartup.Wednesday=Every Wednesday
-SchedulerStartup.Thursday=Every Thursday
-SchedulerStartup.Friday=Every Friday
-SchedulerStartup.Saturday=Every Saturday
-SchedulerStartup.Sunday=Every Sunday
-SchedulerStartup.1AM=1:00 AM
-SchedulerStartup.2AM=2:00 AM
-SchedulerStartup.3AM=3:00 AM
-SchedulerStartup.4AM=4:00 AM
-SchedulerStartup.5AM=5:00 AM
-SchedulerStartup.6AM=6:00 AM
-SchedulerStartup.7AM=7:00 AM
-SchedulerStartup.8AM=8:00 AM
-SchedulerStartup.9AM=9:00 AM
-SchedulerStartup.10AM=10:00 AM
-SchedulerStartup.11AM=11:00 AM
-SchedulerStartup.12PM=12:00 PM
-SchedulerStartup.1PM=1:00 PM
-SchedulerStartup.2PM=2:00 PM
-SchedulerStartup.3PM=3:00 PM
-SchedulerStartup.4PM=4:00 PM
-SchedulerStartup.5PM=5:00 PM
-SchedulerStartup.6PM=6:00 PM
-SchedulerStartup.7PM=7:00 PM
-SchedulerStartup.8PM=8:00 PM
-SchedulerStartup.9PM=9:00 PM
-SchedulerStartup.10PM=10:00 PM
-SchedulerStartup.11PM=11:00 PM
-SchedulerStartup.12AM=12:00 AM
-AutomaticUpdatesJob.AutomaticUpdateSearch=Automatic Update Search
-AutomaticUpdatesPreferencePage.findUpdates=Automatically &find new updates and notify me
-AutomaticUpdatesPreferencePage.UpdateSchedule=Update &Schedule
-AutomaticUpdatesPreferencePage.findOnStart=Look for updates each time platform is started
-AutomaticUpdatesPreferencePage.findOnSchedule=Look for updates on the following schedule:
-AutomaticUpdatesPreferencePage.downloadOptions=&Download Options
-AutomaticUpdatesPreferencePage.searchAndNotify=Search for updates and notify me when they are available
-AutomaticUpdatesPreferencePage.downloadAndNotify=Download new updates automatically and notify me when ready to install them
-AutomaticUpdatesJob.EclipseUpdates1=Eclipse Updates
-AutomaticUpdatesJob.UpdatesAvailable=New updates are available. Do you want to review and install them now?
-AutomaticUpdatesJob.EclipseUpdates2=Eclipse Updates
-AutomaticUpdatesPreferencePage.at=at
-AutomaticUpdatesJob.UpdatesDownloaded=New updates are available and downloaded. Do you want to review and install them now?
-AutomaticUpdatesJob.Updates=Updates
diff --git a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/preferences/AutomaticUpdatesPreferencePage.java b/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/preferences/AutomaticUpdatesPreferencePage.java
deleted file mode 100644
index 55236bd..0000000
--- a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/preferences/AutomaticUpdatesPreferencePage.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.scheduler.preferences;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.update.internal.scheduler.*;
-import org.eclipse.update.internal.scheduler.UpdateScheduler;
-
-public class AutomaticUpdatesPreferencePage
-	extends PreferencePage
-	implements IWorkbenchPreferencePage {
-
-	private Button enabledCheck;
-	private Button onStartupRadio;
-	private Button onScheduleRadio;
-	private Combo dayCombo;
-	private Combo hourCombo;
-	private Button searchOnlyRadio;
-	private Button searchAndDownloadRadio;
-	private Group updateScheduleGroup;
-	private Group downloadGroup;
-
-	public void init(IWorkbench workbench) {
-	}
-
-	protected Control createContents(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = layout.marginHeight = 0;
-		container.setLayout(layout);
-
-		enabledCheck = new Button(container, SWT.CHECK);
-		enabledCheck.setText(UpdateScheduler.getString("AutomaticUpdatesPreferencePage.findUpdates")); //$NON-NLS-1$
-
-		createSpacer(container, 1);
-
-		updateScheduleGroup = new Group(container, SWT.NONE);
-		updateScheduleGroup.setText(UpdateScheduler.getString("AutomaticUpdatesPreferencePage.UpdateSchedule")); //$NON-NLS-1$
-		layout = new GridLayout();
-		layout.numColumns = 3;
-		updateScheduleGroup.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		updateScheduleGroup.setLayoutData(gd);
-
-		onStartupRadio = new Button(updateScheduleGroup, SWT.RADIO);
-		onStartupRadio.setText(
-			UpdateScheduler.getString("AutomaticUpdatesPreferencePage.findOnStart")); //$NON-NLS-1$
-		gd = new GridData();
-		gd.horizontalSpan = 3;
-		onStartupRadio.setLayoutData(gd);
-		onStartupRadio.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				pageChanged();
-			}
-		});
-
-		onScheduleRadio = new Button(updateScheduleGroup, SWT.RADIO);
-		onScheduleRadio.setText(UpdateScheduler.getString("AutomaticUpdatesPreferencePage.findOnSchedule")); //$NON-NLS-1$
-		gd = new GridData();
-		gd.horizontalSpan = 3;
-		onScheduleRadio.setLayoutData(gd);
-		onScheduleRadio.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				pageChanged();
-			}
-		});
-
-		dayCombo = new Combo(updateScheduleGroup, SWT.READ_ONLY);
-		dayCombo.setItems(SchedulerStartup.DAYS);
-		gd = new GridData();
-		gd.widthHint = 200;
-		gd.horizontalIndent = 30;
-		dayCombo.setLayoutData(gd);
-		
-		Label label = new Label(updateScheduleGroup, SWT.NULL);
-		label.setText(UpdateScheduler.getString("AutomaticUpdatesPreferencePage.at")); //$NON-NLS-1$
-		
-		hourCombo = new Combo(updateScheduleGroup, SWT.READ_ONLY);
-		hourCombo.setItems(SchedulerStartup.HOURS);
-		gd = new GridData();
-		gd.widthHint = 100;
-		hourCombo.setLayoutData(gd);
-	
-		createSpacer(container, 1);
-		
-		downloadGroup = new Group(container, SWT.NONE);
-		downloadGroup.setText(UpdateScheduler.getString("AutomaticUpdatesPreferencePage.downloadOptions")); //$NON-NLS-1$
-		layout = new GridLayout();
-		layout.numColumns = 3;
-		downloadGroup.setLayout(layout);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		downloadGroup.setLayoutData(gd);
-
-		searchOnlyRadio = new Button(downloadGroup, SWT.RADIO);
-		searchOnlyRadio.setText(
-			UpdateScheduler.getString("AutomaticUpdatesPreferencePage.searchAndNotify")); //$NON-NLS-1$
-		gd = new GridData();
-		gd.horizontalSpan = 3;
-		searchOnlyRadio.setLayoutData(gd);
-		searchOnlyRadio.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				pageChanged();
-			}
-		});
-
-		searchAndDownloadRadio = new Button(downloadGroup, SWT.RADIO);
-		searchAndDownloadRadio.setText(UpdateScheduler.getString("AutomaticUpdatesPreferencePage.downloadAndNotify")); //$NON-NLS-1$
-		gd = new GridData();
-		gd.horizontalSpan = 3;
-		searchAndDownloadRadio.setLayoutData(gd);
-		searchAndDownloadRadio.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				pageChanged();
-			}
-		});
-			
-		initialize();
-
-		enabledCheck.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				pageChanged();
-			}
-		});
-
-		Dialog.applyDialogFont(container);
-		return container;
-	}
-
-	protected void createSpacer(Composite composite, int columnSpan) {
-		Label label = new Label(composite, SWT.NONE);
-		GridData gd = new GridData();
-		gd.horizontalSpan = columnSpan;
-		label.setLayoutData(gd);
-	}
-
-	private void initialize() {
-		Preferences pref = UpdateScheduler.getDefault().getPluginPreferences();
-		enabledCheck.setSelection(pref.getBoolean(UpdateScheduler.P_ENABLED));
-		setSchedule(pref.getString(UpdateScheduler.P_SCHEDULE));
-
-		dayCombo.setText(SchedulerStartup.DAYS[getDay(pref)]);
-		hourCombo.setText(SchedulerStartup.HOURS[getHour(pref)]);
-		
-		searchOnlyRadio.setSelection(!pref.getBoolean(UpdateScheduler.P_DOWNLOAD));
-		searchAndDownloadRadio.setSelection(pref.getBoolean(UpdateScheduler.P_DOWNLOAD));
-
-		pageChanged();
-	}
-
-	private void setSchedule(String value) {
-		if (value.equals(UpdateScheduler.VALUE_ON_STARTUP))
-			onStartupRadio.setSelection(true);
-		else
-			onScheduleRadio.setSelection(true);
-	}
-
-	private void pageChanged() {
-		boolean master = enabledCheck.getSelection();
-		updateScheduleGroup.setEnabled(master);
-		onStartupRadio.setEnabled(master);
-		onScheduleRadio.setEnabled(master);
-		dayCombo.setEnabled(master && onScheduleRadio.getSelection());
-		hourCombo.setEnabled(master && onScheduleRadio.getSelection());
-		downloadGroup.setEnabled(master);
-		searchOnlyRadio.setEnabled(master);
-		searchAndDownloadRadio.setEnabled(master);
-	}
-
-	protected void performDefaults() {
-		super.performDefaults();
-		Preferences pref = UpdateScheduler.getDefault().getPluginPreferences();
-		enabledCheck.setSelection(
-			pref.getDefaultBoolean(UpdateScheduler.P_ENABLED));
-	}
-
-	/** 
-	 * Method declared on IPreferencePage.
-	 * Subclasses should override
-	 */
-	public boolean performOk() {
-		Preferences pref = UpdateScheduler.getDefault().getPluginPreferences();
-		pref.setValue(UpdateScheduler.P_ENABLED, enabledCheck.getSelection());
-		if (onStartupRadio.getSelection())
-			pref.setValue(UpdateScheduler.P_SCHEDULE, UpdateScheduler.VALUE_ON_STARTUP);
-		else 
-			pref.setValue(UpdateScheduler.P_SCHEDULE, UpdateScheduler.VALUE_ON_SCHEDULE);
-			
-		pref.setValue(SchedulerStartup.P_DAY, dayCombo.getText());
-		pref.setValue(SchedulerStartup.P_HOUR, hourCombo.getText());
-		
-		pref.setValue(UpdateScheduler.P_DOWNLOAD, searchAndDownloadRadio.getSelection());
-		
-		UpdateScheduler.getDefault().savePluginPreferences();
-		
-		UpdateScheduler.getScheduler().scheduleUpdateJob();
-		return true;
-	}
-	
-	private int getDay(Preferences pref) {
-		String day = pref.getString(SchedulerStartup.P_DAY);
-		for (int i=0; i<SchedulerStartup.DAYS.length; i++)
-			if (SchedulerStartup.DAYS[i].equals(day))
-				return i;
-		return 0;
-	}
-	
-	private int getHour(Preferences pref) {
-		String hour = pref.getString(SchedulerStartup.P_HOUR);
-		for (int i=0; i<SchedulerStartup.HOURS.length; i++)
-			if (SchedulerStartup.HOURS[i].equals(hour))
-				return i;
-		return 0;
-	}
-}
diff --git a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/preferences/PreferenceInitializer.java b/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/preferences/PreferenceInitializer.java
deleted file mode 100644
index 42a9708..0000000
--- a/update/org.eclipse.update.scheduler/src/org/eclipse/update/internal/scheduler/preferences/PreferenceInitializer.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.internal.scheduler.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.update.internal.scheduler.UpdateScheduler;
-import org.osgi.service.prefs.Preferences;
-
-
-/**
- * @since 3.1
- */
-public class PreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		Preferences node = new DefaultScope().getNode("org.eclipse.update.scheduler");
-		node.putBoolean(UpdateScheduler.P_ENABLED, false);
-		node.put(UpdateScheduler.P_SCHEDULE, UpdateScheduler.VALUE_ON_STARTUP);
-		node.putBoolean(UpdateScheduler.P_DOWNLOAD, false);
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/.classpath b/update/org.eclipse.update.tests.core/.classpath
deleted file mode 100644
index 4848249..0000000
--- a/update/org.eclipse.update.tests.core/.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/update/org.eclipse.update.tests.core/.cvsignore b/update/org.eclipse.update.tests.core/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/update/org.eclipse.update.tests.core/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/.project b/update/org.eclipse.update.tests.core/.project
deleted file mode 100644
index fc1ca7f..0000000
--- a/update/org.eclipse.update.tests.core/.project
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.tests.core</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.help.appserver</project>
-		<project>org.eclipse.tomcat</project>
-		<project>org.eclipse.update.configurator</project>
-		<project>org.eclipse.update.core</project>
-		<project>org.eclipse.update.core.linux</project>
-		<project>org.junit</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ui.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ui.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.ui.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/about.html b/update/org.eclipse.update.tests.core/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/update/org.eclipse.update.tests.core/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/build.properties b/update/org.eclipse.update.tests.core/build.properties
deleted file mode 100644
index 2861d65..0000000
--- a/update/org.eclipse.update.tests.core/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.updatetests.jar=src/
-bin.includes=*.jar,about.html,test.xml,plugin.xml,data/,webserver/
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/features/feature3/feature.xml
deleted file mode 100644
index 361c287..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.core.tests.feature1.plugin1" install-size="1000" fragment="false" nl="en" os="WIN32,LINUX,HPUX" version="3.5.6" ws="WIN32,MOTIF,GTK"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/Pde_core.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/help.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/junit_3.7.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index 7f05d82..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/feature3/feature.xml
deleted file mode 100644
index c0634a4..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" nl="en,fr" os="WIN32,LINUX,HPUX" version="1.1.1" ws="WIN32,GTK,MOTIF"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/helpFeature.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/helpFeature.jar
deleted file mode 100644
index 0213585..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/org.eclipse.pde.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/org.eclipse.pde.feature_1.0.0.jar
deleted file mode 100644
index 7e23cab..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/org.eclipse.pde.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/siteInfo.html b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/Pde_core.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/help.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/junit_3.7.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index 7f05d82..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/site.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/site.xml
deleted file mode 100644
index b6211a8..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/site.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="features/helpFeature.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features/org.eclipse.pde.feature_1.0.0.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <feature url="features/feature3/" os="LINUX">
-    <category name="eclipse"/>
-  </feature>
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins/junit_3.7.jar"/>
-  <archive path="plugins/org.eclipse.update.plugin1_1.1.1.jar" url="plugins/org.eclipse.update.plugin1_1.1.1"/>  
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FTPLikeSite/site.xml b/update/org.eclipse.update.tests.core/data/FTPLikeSite/site.xml
deleted file mode 100644
index da62e2e..0000000
--- a/update/org.eclipse.update.tests.core/data/FTPLikeSite/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.tests.core.ftp">
-  <feature url="features/feature3/features2.jarfile"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/features/feature3/feature.xml
deleted file mode 100644
index 2c98f42..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0">
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" os="WIN32,LINUX" version="1.1.1" ws="WIN32,MOTIF,GTK"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/site.xml b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/site.xml
deleted file mode 100644
index 486d119..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-  <feature url="features/feature3" type="org.eclipse.update.tests.core.feature1"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/features/feature3/features2.jarfile b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/features/feature3/features2.jarfile
deleted file mode 100644
index 240ab4f..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/features/feature3/features2.jarfile
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/site.xml b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/site.xml
deleted file mode 100644
index fb5fe0e..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-  <feature url="features/feature3/features2.jarfile" type="org.eclipse.update.core.packaged"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/features/feature3/features2.jarfile b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/features/feature3/features2.jarfile
deleted file mode 100644
index 240ab4f..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/features/feature3/features2.jarfile
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/site.xml b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/site.xml
deleted file mode 100644
index daf372d..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-  <feature url="features/feature3/features2.jarfile" type="org.eclipse.update.core.unknowntype.jar"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/features space/helpFeature.jar b/update/org.eclipse.update.tests.core/data/Site with space/features space/helpFeature.jar
deleted file mode 100644
index 4b83c7e..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/features space/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/features space/space feature.jar b/update/org.eclipse.update.tests.core/data/Site with space/features space/space feature.jar
deleted file mode 100644
index 4f1e991..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/features space/space feature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/data/Site with space/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/data/Site with space/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/info/siteInfo.html b/update/org.eclipse.update.tests.core/data/Site with space/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/install/features space/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/Site with space/install/features space/feature3/feature.xml
deleted file mode 100644
index 3b7890b..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/install/features space/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" nl="en,fr" os="WIN32,LINUX,HPUX" version="1.1.1" ws="WIN32,MOTIF,GTK"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/Pde_core.jar b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/help.jar b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/junit_3.7.jar b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index e01846c..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/site.xml b/update/org.eclipse.update.tests.core/data/Site with space/site.xml
deleted file mode 100644
index 54928fb..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/site.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="features space/helpFeature.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features space/space feature.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <feature url="install/features space/feature3/">
-    <category name="eclipse"/>
-  </feature>
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins space/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins space/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins space/junit_3.7.jar"/>
-  <archive path="plugins/org.eclipse.update.plugin1_1.1.1.jar" url="plugins space/org.eclipse.update.plugin1_1.1.1"/>  
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/features/feature3/features2.jarfile b/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/features/feature3/features2.jarfile
deleted file mode 100644
index 240ab4f..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/features/feature3/features2.jarfile
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/site.xml b/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/site.xml
deleted file mode 100644
index 6f7165a..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.http">
-  <feature url="features/feature3/features2.jarfile"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/helpFeature.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/helpFeature.jar
deleted file mode 100644
index 9809713..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/org.eclipse.pde.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/org.eclipse.pde.feature_1.0.0.jar
deleted file mode 100644
index f592c1d..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/org.eclipse.pde.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/Pde_core.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/help.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/junit_3.7.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/siteInfo.html b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/site.xml b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/site.xml
deleted file mode 100644
index e3ea684..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/site.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site url = "artifacts/">
-<description url="info/siteInfo.html"/>
-  <feature url="features/helpFeature.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features/org.eclipse.pde.feature_1.0.0.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins/junit_3.7.jar"/>
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/file1.zip b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/file1.zip
deleted file mode 100644
index 1a70b7e..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/file1.zip
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/install/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/install/features/feature3/feature.xml
deleted file mode 100644
index 6b454ec..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/install/features/feature3/feature.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0">
-	<install-handler handler="org.eclipse.update.core.DefaultInstallHandler"/>
-  	<data download-size="1500" id="file.zip" install-size="1000"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/site.xml b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/site.xml
deleted file mode 100644
index c41f21d..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/site.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="install/features/feature3">
-  </feature>
-  <archive path="features/org.eclipse.update.core.tests.feature3_1.0.0/file.zip" url="file1.zip"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/features/features3.jar b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/features/features3.jar
deleted file mode 100644
index 74c6eca..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/features/features3.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/non data/another file.zip b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/non data/another file.zip
deleted file mode 100644
index 1a70b7e..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/non data/another file.zip
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/site.xml b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/site.xml
deleted file mode 100644
index 040943c..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/site.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="features/features3.jar" type="org.eclipse.update.core.packaged">
-  </feature>
-  <archive path="features/org.eclipse.update.core.tests.feature3_1.0.0/file.zip" url="non data/another file.zip"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/features/features2.jar b/update/org.eclipse.update.tests.core/data/features/features2.jar
deleted file mode 100644
index e8d004d..0000000
--- a/update/org.eclipse.update.tests.core/data/features/features2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/features/org.eclipse.test.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/data/features/org.eclipse.test.feature_1.0.0.jar
deleted file mode 100644
index 870a70d..0000000
--- a/update/org.eclipse.update.tests.core/data/features/org.eclipse.test.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/features/org.eclipse.update.core.tests.feature1_1.0.4.jar b/update/org.eclipse.update.tests.core/data/features/org.eclipse.update.core.tests.feature1_1.0.4.jar
deleted file mode 100644
index 9dc9463..0000000
--- a/update/org.eclipse.update.tests.core/data/features/org.eclipse.update.core.tests.feature1_1.0.4.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/features/org.eclipse_test_feature.jar b/update/org.eclipse.update.tests.core/data/features/org.eclipse_test_feature.jar
deleted file mode 100644
index 938ddc4..0000000
--- a/update/org.eclipse.update.tests.core/data/features/org.eclipse_test_feature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/.project b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/.project
deleted file mode 100644
index 5d52069..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>update-site1</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.UpdateSiteBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.UpdateSiteNature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/.sitebuild/build.log b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/.sitebuild/build.log
deleted file mode 100644
index 3bce194..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/.sitebuild/build.log
+++ /dev/null
@@ -1,318 +0,0 @@
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin3.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: javac
-Message logged: Compile failed; see the compiler error output for details.
-Task finished: javac
-Task started: copy
-Task finished: copy
-Task started: mkdir
-Task finished: mkdir
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: plugin3.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin4.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: javac
-Message logged: Compile failed; see the compiler error output for details.
-Task finished: javac
-Task started: copy
-Task finished: copy
-Task started: mkdir
-Task finished: mkdir
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: plugin4.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature3_1.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Build finished.
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/.sitebuild/sitebuild.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/.sitebuild/sitebuild.xml
deleted file mode 100644
index 1e700b9..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/.sitebuild/sitebuild.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site-build
-      feature-location="features"
-      plugin-location="plugins"
-      autobuild="false"
-      scrub-output="false"
-      use-console="true">
-   <feature id="update.feature1" version="1.0.0"/>
-   <feature id="update.feature2" version="1.0.0"/>
-   <feature id="update.feature3" version="1.0.0"/>
-</site-build>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/features/update.feature1_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/features/update.feature1_1.0.0.jar
deleted file mode 100644
index c812b0b..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/features/update.feature1_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/features/update.feature2_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/features/update.feature2_1.0.0.jar
deleted file mode 100644
index fbf1754..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/features/update.feature2_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/features/update.feature3_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/features/update.feature3_1.0.0.jar
deleted file mode 100644
index 8682a62..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/features/update.feature3_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin1_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin1_1.0.0.jar
deleted file mode 100644
index 8bbc7f3..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin1_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin2_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin2_1.0.0.jar
deleted file mode 100644
index 5d42583..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin2_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin3_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin3_1.0.0.jar
deleted file mode 100644
index aa94e52..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin3_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin4_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin4_1.0.0.jar
deleted file mode 100644
index c8cca28..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/plugins/com.plugin4_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/site.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site1/site.xml
deleted file mode 100644
index 163f7bb..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site1/site.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <feature url="features/update.feature1_1.0.0.jar" id="update.feature1" version="1.0.0">
-      <category name="Site1-Category1"/>
-   </feature>
-   <feature url="features/update.feature2_1.0.0.jar" id="update.feature2" version="1.0.0">
-      <category name="Site1-Category2"/>
-   </feature>
-   <feature url="features/update.feature3_1.0.0.jar" id="update.feature3" version="1.0.0">
-      <category name="Site1-Category3"/>
-   </feature>
-   <category-def name="Site1-Category1" label="Site1-Category1-Label">
-      <description>
-         ecetera.
-      </description>
-   </category-def>
-   <category-def name="Site1-Category2" label="Site1-Category2-Label">
-      <description>
-         ecetera.
-      </description>
-   </category-def>
-   <category-def name="Site1-Category3" label="Site1-Category3-Label">
-      <description>
-         ecetera.
-      </description>
-   </category-def>
-</site>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/.project b/update/org.eclipse.update.tests.core/data/mirrors/update-site2/.project
deleted file mode 100644
index a4b687e..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>update-site2</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.UpdateSiteBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.UpdateSiteNature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/.sitebuild/build.log b/update/org.eclipse.update.tests.core/data/mirrors/update-site2/.sitebuild/build.log
deleted file mode 100644
index e977850..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/.sitebuild/build.log
+++ /dev/null
@@ -1,203 +0,0 @@
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin2.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: javac
-Message logged: Compile failed; see the compiler error output for details.
-Task finished: javac
-Task started: copy
-Task finished: copy
-Task started: mkdir
-Task finished: mkdir
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: plugin2.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature2_1.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Build finished.
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/.sitebuild/sitebuild.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site2/.sitebuild/sitebuild.xml
deleted file mode 100644
index 2258820..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/.sitebuild/sitebuild.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site-build
-      feature-location="features"
-      plugin-location="plugins"
-      autobuild="false"
-      scrub-output="false"
-      use-console="true">
-   <feature id="update.feature1" version="1.0.1"/>
-   <feature id="update.feature2" version="1.0.1"/>
-</site-build>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/features/update.feature1_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site2/features/update.feature1_1.0.0.jar
deleted file mode 100644
index 5175b4a..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/features/update.feature1_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/features/update.feature2_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site2/features/update.feature2_1.0.0.jar
deleted file mode 100644
index d1660b9..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/features/update.feature2_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/plugins/com.plugin1_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site2/plugins/com.plugin1_1.0.0.jar
deleted file mode 100644
index d815f20..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/plugins/com.plugin1_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/plugins/com.plugin2_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site2/plugins/com.plugin2_1.0.0.jar
deleted file mode 100644
index dec5f4c..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/plugins/com.plugin2_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/site.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site2/site.xml
deleted file mode 100644
index f1d4b71..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site2/site.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <feature url="features/update.feature1_1.0.1.jar" id="update.feature1" version="1.0.1"/>
-   <feature url="features/update.feature2_1.0.1.jar" id="update.feature2" version="1.0.1"/>
-</site>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/.project b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/.project
deleted file mode 100644
index 0ddb6b7..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>update-site3</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.UpdateSiteBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.UpdateSiteNature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/.sitebuild/build.log b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/.sitebuild/build.log
deleted file mode 100644
index 4a2ee01..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/.sitebuild/build.log
+++ /dev/null
@@ -1,318 +0,0 @@
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin2a.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: javac
-Message logged: Compile failed; see the compiler error output for details.
-Task finished: javac
-Task started: copy
-Task finished: copy
-Task started: mkdir
-Task finished: mkdir
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: plugin2a.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin2.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: javac
-Message logged: Compile failed; see the compiler error output for details.
-Task finished: javac
-Task started: copy
-Task finished: copy
-Task started: mkdir
-Task finished: mkdir
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: plugin2.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature2b_2.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Build finished.
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/.sitebuild/sitebuild.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/.sitebuild/sitebuild.xml
deleted file mode 100644
index e3510b0..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/.sitebuild/sitebuild.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site-build
-      feature-location="features"
-      plugin-location="plugins"
-      autobuild="false"
-      scrub-output="false"
-      use-console="true">
-   <feature id="update.feature1b" version="2.0.0"/>
-   <feature id="update.feature2b" version="2.0.0"/>
-</site-build>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/features/update.feature1b_2.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/features/update.feature1b_2.0.0.jar
deleted file mode 100644
index 6b9a876..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/features/update.feature1b_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/features/update.feature2b_2.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/features/update.feature2b_2.0.0.jar
deleted file mode 100644
index 97bb70f..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/features/update.feature2b_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin1_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin1_1.0.0.jar
deleted file mode 100644
index ee2d41d..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin1_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin1a_1.0.1.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin1a_1.0.1.jar
deleted file mode 100644
index 97183c7..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin1a_1.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin2_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin2_1.0.0.jar
deleted file mode 100644
index e31b28e..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin2_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin2a_1.0.1.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin2a_1.0.1.jar
deleted file mode 100644
index 557ba5d..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/plugins/com.plugin2a_1.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/site.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site3/site.xml
deleted file mode 100644
index e28506b..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site3/site.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <feature url="features/update.feature1b_2.0.0.jar" id="update.feature1b" version="2.0.0">
-      <category name="Site3-Category1"/>
-   </feature>
-   <feature url="features/update.feature2b_2.0.0.jar" id="update.feature2b" version="2.0.0">
-      <category name="Site3-Category2"/>
-   </feature>
-   <category-def name="Site3-Category1" label="Site3-Category1-Label">
-      <description>
-         ecetera.
-      </description>
-   </category-def>
-   <category-def name="Site3-Category2" label="Site3-Category2-Label">
-      <description>
-         ecetera.
-      </description>
-   </category-def>
-</site>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/.project b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/.project
deleted file mode 100644
index 8a07aaf..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>update-site4</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.UpdateSiteBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.UpdateSiteNature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/.sitebuild/build.log b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/.sitebuild/build.log
deleted file mode 100644
index 1cfe8e3..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/.sitebuild/build.log
+++ /dev/null
@@ -1,791 +0,0 @@
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin1.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: javac
-Message logged: Compile failed; see the compiler error output for details.
-Task finished: javac
-Task started: copy
-Task finished: copy
-Task started: mkdir
-Task finished: mkdir
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: plugin1.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin1.jar
-Target finished: plugin1.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin1.jar
-Target finished: plugin1.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin1a.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: javac
-Message logged: Compile failed; see the compiler error output for details.
-Task finished: javac
-Task started: copy
-Task finished: copy
-Task started: mkdir
-Task finished: mkdir
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: plugin1a.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.features
-Target started: all.plugins
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature1c_3.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature1_1.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Task finished: ant
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature1_1.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Task finished: ant
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature1b_2.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Task finished: ant
-Target finished: all.features
-Target started: all.plugins
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Build finished.
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/.sitebuild/sitebuild.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/.sitebuild/sitebuild.xml
deleted file mode 100644
index 47cb017..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/.sitebuild/sitebuild.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site-build
-      feature-location="features"
-      plugin-location="plugins"
-      autobuild="false"
-      scrub-output="false"
-      use-console="true">
-   <feature id="update.feature1c" version="3.0.0"/>
-</site-build>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1_1.0.0.jar
deleted file mode 100644
index 78d2f28..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1_1.0.1.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1_1.0.1.jar
deleted file mode 100644
index eeb0b6f..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1_1.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1b_2.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1b_2.0.0.jar
deleted file mode 100644
index 31b6bcb..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1b_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1c_3.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1c_3.0.0.jar
deleted file mode 100644
index 3753305..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/features/update.feature1c_3.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/plugins/com.plugin1_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/plugins/com.plugin1_1.0.0.jar
deleted file mode 100644
index 3e0760f..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/plugins/com.plugin1_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/plugins/com.plugin1a_1.0.1.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/plugins/com.plugin1a_1.0.1.jar
deleted file mode 100644
index 634eb07..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/plugins/com.plugin1a_1.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/site.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site4/site.xml
deleted file mode 100644
index 2c73cbe..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site4/site.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <feature url="features/update.feature1c_3.0.0.jar" id="update.feature1c" version="3.0.0">
-      <category name="Site4-Category1"/>
-   </feature>
-   <category-def name="Site4-Category1" label="Site4-Category1-Label">
-      <description>
-         ecetera.
-      </description>
-   </category-def>
-</site>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/.project b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/.project
deleted file mode 100644
index 0a93302..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>update-site5</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.UpdateSiteBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.UpdateSiteNature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/.sitebuild/build.log b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/.sitebuild/build.log
deleted file mode 100644
index db44faa..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/.sitebuild/build.log
+++ /dev/null
@@ -1,791 +0,0 @@
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin2.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: javac
-Message logged: Compile failed; see the compiler error output for details.
-Task finished: javac
-Task started: copy
-Task finished: copy
-Task started: mkdir
-Task finished: mkdir
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: plugin2.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin2.jar
-Target finished: plugin2.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin2a.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: javac
-Message logged: Compile failed; see the compiler error output for details.
-Task finished: javac
-Task started: copy
-Task finished: copy
-Task started: mkdir
-Task finished: mkdir
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: plugin2a.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.update.jar
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: build.jars
-Task started: available
-Task finished: available
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: plugin2.jar
-Target finished: plugin2.jar
-Task finished: antcall
-Target finished: build.jars
-Task finished: antcall
-Task started: antcall
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: copy
-Task finished: copy
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: zip
-Task finished: zip
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Task finished: ant
-Target finished: all.features
-Target started: all.plugins
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Task started: property
-Task finished: property
-Task started: delete
-Task finished: delete
-Task started: mkdir
-Task finished: mkdir
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: gather.bin.parts
-Task started: antcall
-Target started: children
-Target finished: children
-Task finished: antcall
-Task started: mkdir
-Task finished: mkdir
-Task started: copy
-Task finished: copy
-Task started: eclipse.idReplacer
-Task finished: eclipse.idReplacer
-Task started: antcall
-Target started: ROOTFILES*_*_*
-Target finished: ROOTFILES*_*_*
-Task finished: antcall
-Target finished: gather.bin.parts
-Task finished: antcall
-Task started: jar
-Task finished: jar
-Task started: delete
-Task finished: delete
-Target finished: build.update.jar
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature2c_3.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature2_1.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Task finished: ant
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature2_1.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Task finished: ant
-Task started: ant
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Message logged: Project ${update.feature2b_2.0.0} does not exist and cannot be refreshed.
-Task finished: eclipse.refreshLocal
-Task started: antcall
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: all.features
-Target finished: all.features
-Target started: all.plugins
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Task started: ant
-Target started: properties
-Task started: property
-Task finished: property
-Target finished: properties
-Target started: init
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Task started: property
-Task finished: property
-Target finished: init
-Target started: refresh
-Task started: eclipse.convertPath
-Task finished: eclipse.convertPath
-Task started: eclipse.refreshLocal
-Task finished: eclipse.refreshLocal
-Target finished: refresh
-Task finished: ant
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Task finished: ant
-Target finished: all.features
-Target started: all.plugins
-Target finished: all.plugins
-Target started: update.feature
-Target finished: update.feature
-Target started: all.children
-Target finished: all.children
-Task finished: antcall
-Target finished: refresh
-Build finished.
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/.sitebuild/sitebuild.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/.sitebuild/sitebuild.xml
deleted file mode 100644
index 49243d3..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/.sitebuild/sitebuild.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site-build
-      feature-location="features"
-      plugin-location="plugins"
-      autobuild="false"
-      scrub-output="false"
-      use-console="true">
-   <feature id="update.feature1c" version="3.0.0"/>
-   <feature id="update.feature2c" version="3.0.0"/>
-</site-build>
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1_1.0.0.jar
deleted file mode 100644
index 152d9e2..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1_1.0.1.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1_1.0.1.jar
deleted file mode 100644
index eeb0b6f..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1_1.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1b_2.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1b_2.0.0.jar
deleted file mode 100644
index 49b0764..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1b_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1c_3.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1c_3.0.0.jar
deleted file mode 100644
index d426f86..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature1c_3.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature2_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature2_1.0.0.jar
deleted file mode 100644
index b070ccd..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature2_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature2b_2.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature2b_2.0.0.jar
deleted file mode 100644
index e48ac05..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature2b_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature2c_3.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature2c_3.0.0.jar
deleted file mode 100644
index 00037df..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/features/update.feature2c_3.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin1_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin1_1.0.0.jar
deleted file mode 100644
index 3543749..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin1_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin1a_1.0.1.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin1a_1.0.1.jar
deleted file mode 100644
index 632cc3f..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin1a_1.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin2_1.0.0.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin2_1.0.0.jar
deleted file mode 100644
index dbc8a88..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin2_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin2a_1.0.1.jar b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin2a_1.0.1.jar
deleted file mode 100644
index a3cd0fb..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/plugins/com.plugin2a_1.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/site.xml b/update/org.eclipse.update.tests.core/data/mirrors/update-site5/site.xml
deleted file mode 100644
index 6e26db1..0000000
--- a/update/org.eclipse.update.tests.core/data/mirrors/update-site5/site.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <feature url="features/update.feature1c_3.0.0.jar" id="update.feature1c" version="3.0.0">
-      <category name="Site5-Category1"/>
-   </feature>
-   <feature url="features/update.feature2c_3.0.0.jar" id="update.feature2c" version="3.0.0">
-      <category name="Site5-Category2"/>
-   </feature>
-   <category-def name="Site5-Category1" label="Site5-Category1-Label">
-      <description>
-         ecetera.
-      </description>
-   </category-def>
-   <category-def name="Site5-Category2" label="Site5-Category2-Label">
-      <description>
-         ecetera.
-      </description>
-   </category-def>
-</site>
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/features/org.eclipse.update.core.tests.childrenfeature_2.0.0.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/features/org.eclipse.update.core.tests.childrenfeature_2.0.0.jar
deleted file mode 100644
index 6658034..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/features/org.eclipse.update.core.tests.childrenfeature_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/features/rootfeature.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/features/rootfeature.jar
deleted file mode 100644
index b011050..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/features/rootfeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
deleted file mode 100644
index 5d9f5bc..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
deleted file mode 100644
index 8b4b04a..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar
deleted file mode 100644
index 52208fe..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/site.xml b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/site.xml
deleted file mode 100644
index 623cb1a..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-  <feature url="features/rootfeature.jar"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/features/childrenfeature.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/features/childrenfeature.jar
deleted file mode 100644
index 7e057e6..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/features/childrenfeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/features/rootfeature.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/features/rootfeature.jar
deleted file mode 100644
index 38a0a3c..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/features/rootfeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
deleted file mode 100644
index 5d9f5bc..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
deleted file mode 100644
index 8b4b04a..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar
deleted file mode 100644
index 52208fe..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/site.xml b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/site.xml
deleted file mode 100644
index 1752da2..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest2/site.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-  <feature url="features/rootfeature.jar"/>
-  <feature url="features/childrenfeature.jar"/>  
-  
-  <archive path="features/org.eclipse.update.core.tests.childrenfeature_2.1.0.jar" url="features/childrenfeature.jar"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/features/childrenfeature.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/features/childrenfeature.jar
deleted file mode 100644
index 12ee4ba..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/features/childrenfeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/features/rootfeature.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/features/rootfeature.jar
deleted file mode 100644
index 899bdda..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/features/rootfeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
deleted file mode 100644
index 5d9f5bc..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
deleted file mode 100644
index 8b4b04a..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar
deleted file mode 100644
index 52208fe..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/site.xml b/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/site.xml
deleted file mode 100644
index 4f696ba..0000000
--- a/update/org.eclipse.update.tests.core/data/nestedFeatureSiteTest3/site.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-  <feature url="features/rootfeature.jar"/>
-  
-  <archive path="features/org.eclipse.update.core.tests.childrenfeature_2.1.0.jar" url="features/childrenfeature.jar"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/feature1.xml b/update/org.eclipse.update.tests.core/data/parsertests/feature1.xml
deleted file mode 100644
index 93d7080..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/feature1.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-   id="org.eclipse.platform"
-   version="2.1.0"
-   label="Eclipse Platform"
-   provider-name="www.eclipse.org"
-   image="splash/splash_full.bmp"
-   >
-
-	<license>
-    	 license
-	</license>
-
-   <copyright url="notice.html"/>
-   x
-	
-   <license url="about.html">
-   x
-   </license>
-
-   <url>
-      <update url="file:/D:/" label="Eclipse Update Site"/>
-   </url>
-
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/feature1bis.xml b/update/org.eclipse.update.tests.core/data/parsertests/feature1bis.xml
deleted file mode 100644
index e855f97..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/feature1bis.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-   id="org.eclipse.platform"
-   version="2.1.0"
-   label="Eclipse Platform"
-   provider-name="www.eclipse.org"
-   image="splash/splash_full.bmp"
-   >
-
-   <description>
-   Eclipse platform feature.
-   </description>
-
-   <copyright url="notice.html"/>
-   <blah />
-	
-   <license url="about.html">
-
-   </license>
-
-   <url>
-      <update url="file:/D:/" label="Eclipse Update Site"/>
-   </url>
-
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/feature2.xml b/update/org.eclipse.update.tests.core/data/parsertests/feature2.xml
deleted file mode 100644
index 9c2df9b..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/feature2.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-   id="org.eclipse.platform"
-   version="2.1.0"
-   label="Eclipse Platform"
-   provider-name="www.eclipse.org"
-   image="splash/splash_full.bmp"
-   blah="blah"
-   >
-
-   <description blah="blah">
-   Eclipse platform feature.
-   </description>
-
-   <copyright url="notice.html" blah="blah"/>
-	
-   <license url="about.html" blah="blah">
-   </license>
-
-   <url blah="blah">
-      <update url="file:/D:/" label="Eclipse Update Site" blah="blah"/>
-   </url>
-
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/feature3.xml b/update/org.eclipse.update.tests.core/data/parsertests/feature3.xml
deleted file mode 100644
index ca660be..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/feature3.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-   id="org.eclipse.platform"
-   version="2.1.0"
-   label="Eclipse Platform"
-   provider-name="www.eclipse.org"
-   image="splash/splash_full.bmp"
-   >
-
-   <description>
-   Eclipse platform feature.
-   </description>
-
-   <copyright url="$os$/$ws$/notice.html"/>
-   x
-	
-   <license url="about.html">
-   x
-   </license>
-
-   <url>
-      <update url="file:/D:/" label="Eclipse Update Site"/>
-   </url>
-
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/feature4.xml b/update/org.eclipse.update.tests.core/data/parsertests/feature4.xml
deleted file mode 100644
index 17187c9..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/feature4.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-   id="org.eclipse.platform"
-   version="2.1.0"
-   label="Eclipse Platform"
-   provider-name="www.eclipse.org"
-   image="splash/splash_full.bmp"
-   >
-
-   <description>
-   Eclipse platform feature.
-   </description>
-
-   <copyright url="$os$/$ws$/notice.html"/>
-   x
-	
-   <license url="about.html">
-   x
-   </license>
-
-   <url>
-      <update url="file:/D:/" label="Eclipse Update Site"/>
-      <discovery url="file:/c:/" label = "Discovery" type="web"/>
-   </url>
-
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/reddot.xml b/update/org.eclipse.update.tests.core/data/parsertests/reddot.xml
deleted file mode 100644
index f3f1701..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/reddot.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<site url="info/siteInfo.html">
-<feature url="features/reddot_1.0.0.jar"> 
-<category name="reddot"/>
-</feature>
-<feature url="features/reddot_2.1.0.jar">
-<category name="reddot"/>
-</feature>
-<archive path="com.reddot.redot_1.0.0" url="plugins/com.reddot.reddot_1.0.0.jar"/>
-<archive path="com.reddot.redot_2.1.0" url="plugins/com.reddot.reddot_2.1.0.jar"/>
-<category-def label="Red Dot Versions" name="reddot">
-<description url="RedDotVersions.html">
-This category contains all of the &lt;currently&gt; available versions of Red Dot feature.
-<![CDATA[<greeting>Hello, world!</greeting>]]>
-</description>
-</category-def>
-</site>
-
-
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/reddot1.xml b/update/org.eclipse.update.tests.core/data/parsertests/reddot1.xml
deleted file mode 100644
index 074490e..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/reddot1.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<site url="info/siteInfo.html">
-<feature url="features/reddot_1.0.0.jar"> 
-<category name="reddot"/>
-</feature>
-<feature url="features/reddot_2.1.0.jar">
-<category name="reddot"/>
-</feature>
-<archive path="com.reddot.redot_1.0.0" url="plugins/com.reddot.reddot_1.0.0.jar"/>
-<archive path="com.reddot.redot_2.1.0" url="plugins/com.reddot.reddot_2.1.0.jar"/>
-<category-def label="Red Dot Versions" name="reddot">
-<description url="RedDotVersions.html">
-This category contains all of the &lt;currently&gt; available versions of Red Dot feature.
-</description>
-</category-def>
-</site>
-
-
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site.properties b/update/org.eclipse.update.tests.core/data/parsertests/site.properties
deleted file mode 100644
index 8e1ced4..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-drivers=Required Drivers
-security=Security Fixes
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site.xml b/update/org.eclipse.update.tests.core/data/parsertests/site.xml
deleted file mode 100644
index b40d831..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site id="org.eclipse.update.core.tests" name="Tests" version="0.0.1" type="org.eclipse.update.core.file">
-  <handler>
-  	<boo class ="unknown"/>
-  </handler>
-  
-  <feature url="features/org.eclipse.test.feature_1.0.0.jar">
-    <category name="category1"/>
-  </feature>
-  
-  <feature url="features/features2.jar">
-    <category name="category1/subcat1"/>
-    <category name="category2"/>
-  </feature>
-  
-  <feature url="features/org.eclipse.update.core.tests.feature1_1.0.4.jar">
-    <category name="category1"/>
-    <category name="category2"/>
-    <blah/>
-  </feature>
-  
-  <feature url="features/org.eclipse_test_feature.jar"/>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-    <category name="category1"/>
-  </feature>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-  </feature>
-  
-  <archive path="plugins/hello" >
-  	<default/>
-  </archive>
-
-  <category-def name="category2" label="%security"/>
-  <category-def name="category1/subcat1" label="Special Fix"/>
-  <category-def name="category1" label="%drivers"/>  
-
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site10.xml b/update/org.eclipse.update.tests.core/data/parsertests/site10.xml
deleted file mode 100644
index e42680d..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site10.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site id="org.eclipse.update.core.tests" name="Tests" version="0.0.1" type="org.eclipse.update.core.file" blah="blah">
-  
-  <feature url="features/org.eclipse.test.feature_1.0.0.jar" blah="blah" id="org.eclipse.test.feature" version="1.0.0"/>
-  
-  <feature url="features/features2.jar" id="unknwon.id" version="bad version"/>
-  
-  <feature url="features/org.eclipse.update.core.tests.feature1_1.0.4.jar" id="only.id"/>
-    
-  <feature url="features/org.eclipse_test_feature.jar" version="1.0.0"/>
-  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site2.xml b/update/org.eclipse.update.tests.core/data/parsertests/site2.xml
deleted file mode 100644
index 007550e..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site2.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-  <feature id="com.ibm.jdt" url="http://www.not-eclipse.org/feature3" version="1.0.0"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site3.xml b/update/org.eclipse.update.tests.core/data/parsertests/site3.xml
deleted file mode 100644
index dbbb682..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site3.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-  <feature id="com.ibm.jdt" url="feature3/feature.jar" version="1.0.0">
-        <category name="unknown"/>
-  </feature>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site4.xml b/update/org.eclipse.update.tests.core/data/parsertests/site4.xml
deleted file mode 100644
index 41b7d16..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site4.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<site>
-   <description url="info/siteInfo.html"/>
-
-  <category-def label="Red Dot Versions" name="reddot">
-      <description url="RedDotVersions.html">
-         This category contains all of the currently available versions of Red Dot feature.
-      </description>
-   </category-def>
-   
-   <feature url="features/com.reddot.reddot_1.0.0.jar">
-      <category name="reddot"/>
-   </feature>
-
-   <feature url="features/com.reddot.reddot_2.1.0.jar">
-      <category name="reddot"/>
-   </feature>
-
- 
-</site>   
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site7.xml b/update/org.eclipse.update.tests.core/data/parsertests/site7.xml
deleted file mode 100644
index 2190d70..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site7.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site id="org.eclipse.update.core.tests" name="Tests" version="0.0.1" type="org.eclipse.update.core.file">
-  <handler>
-  	<boo class ="unknown"/>
-  </handler>
-  
-  <feature url="features/org.eclipse.test.feature_1.0.0.jar">
-    <category name="category1"/>
-  </feature>
-  
-  <feature url="features/features2.jar">
-    <category name="category1/subcat1"/>
-    <category name="category2"/>
-  </feature>
-  
-  <blah/>
-  
-  <feature url="features/org.eclipse.update.core.tests.feature1_1.0.4.jar">
-    <category name="category1"/>
-    <category name="category2"/>
-    <blah/>
-  </feature>
-  
-  <feature url="features/org.eclipse_test_feature.jar"/>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-    <category name="category1"/>
-  </feature>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-  </feature>
-  
-  <archive path="plugins/hello" >
-  	<default/>
-  </archive>
-
-  <category-def name="category2" label="%security"/>
-  <category-def name="category1/subcat1" label="Special Fix"/>
-  <category-def name="category1" label="%drivers"/>  
-
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site8.xml b/update/org.eclipse.update.tests.core/data/parsertests/site8.xml
deleted file mode 100644
index afcbaa1..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site8.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site id="org.eclipse.update.core.tests" name="Tests" version="0.0.1" type="org.eclipse.update.core.file">
-  <handler>
-  	<boo class ="unknown"/>
-  </handler>
-  
-  <feature url="features/org.eclipse.test.feature_1.0.0.jar">
-    <category name="category1"/>
-  </feature>
-  
-  <feature url="features/features2.jar">
-    <category name="category1/subcat1"/>
-    <category name="category2"/>
-  </feature>
-  xcxgfsdfgsdsd
-  
-  <feature url="features/org.eclipse.update.core.tests.feature1_1.0.4.jar">
-    <category name="category1"/>
-    <category name="category2"/>
-    <blah/>
-  </feature>
-  
-  <feature url="features/org.eclipse_test_feature.jar"/>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-    <category name="category1"/>
-  </feature>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-  </feature>
-  
-  <archive path="plugins/hello" >
-  	<default/>
-  </archive>
-
-  <category-def name="category2" label="%security"/>
-  <category-def name="category1/subcat1" label="Special Fix"/>
-  <category-def name="category1" label="%drivers"/>  
-
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site9.xml b/update/org.eclipse.update.tests.core/data/parsertests/site9.xml
deleted file mode 100644
index f38c5a4..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site9.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site id="org.eclipse.update.core.tests" name="Tests" version="0.0.1" type="org.eclipse.update.core.file" blah="blah">
-  <handler blah="blah">
-  	<boo class ="unknown" blah="blah"/>
-  </handler>
-  
-  <feature url="features/org.eclipse.test.feature_1.0.0.jar" blah="blah">
-    <category name="category1" blah="blah" />
-  </feature>
-  
-  <feature url="features/features2.jar">
-    <category name="category1/subcat1"/>
-    <category name="category2"/>
-  </feature>
-  
-  <feature url="features/org.eclipse.update.core.tests.feature1_1.0.4.jar">
-    <category name="category1"/>
-    <category name="category2"/>
-    <blah/>
-  </feature>
-  
-  <feature url="features/org.eclipse_test_feature.jar"/>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-    <category name="category1"/>
-  </feature>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-  </feature>
-  
-  <archive path="plugins/hello" blah="blah">
-  	<default blah="blah"/>
-  </archive>
-
-  <category-def name="category2" label="%security" blah="blah"/>
-  <category-def name="category1/subcat1" label="Special Fix" blah="blah"/>
-  <category-def name="category1" label="%drivers"/>  
-
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/siteftp.xml b/update/org.eclipse.update.tests.core/data/parsertests/siteftp.xml
deleted file mode 100644
index f883ec0..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/siteftp.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.tests.core.ftp">
-  <feature url="features/feature3/features2.jarfile"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/.classpath b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/.classpath
deleted file mode 100644
index 88acb39..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="/org.eclipse.update.core"/>
-	<classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-	<classpathentry kind="src" path="/org.eclipse.ui"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/.project b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/.project
deleted file mode 100644
index 1ebc505..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>FeatureWithInstallHandler</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/FeatureWithInstallHandler_1.0.0.jar b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/FeatureWithInstallHandler_1.0.0.jar
deleted file mode 100644
index 695b722..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/FeatureWithInstallHandler_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/bin/HandlerWithUI$1.class b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/bin/HandlerWithUI$1.class
deleted file mode 100644
index 57291b0..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/bin/HandlerWithUI$1.class
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/bin/HandlerWithUI.class b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/bin/HandlerWithUI.class
deleted file mode 100644
index fe8e881..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/bin/HandlerWithUI.class
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/build.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/build.properties
deleted file mode 100644
index f3794db..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.handler.jar = src/,\
-                     bin/
-output.handler.jar = bin/
-bin.includes = feature.xml,\
-               handler.jar
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/feature.xml
deleted file mode 100644
index 8b90ea7..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/feature.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="FeatureWithInstallHandler"
-      label="FeatureWithInstallHandler"
-      version="1.0.0">
-
-   <install-handler library="handler.jar" handler="HandlerWithUI" />
-
-   <description url="[Enter Feature URL here.]">
-      [Enter Feature Description here.]
-   </description>
-
-   <copyright url="[Enter Copyright URL here.]">
-      [Enter Copyright Description here.]
-   </copyright>
-
-   <license url="[Enter License URL here.]">
-      [Enter License Description here.]
-   </license>
-
-   <plugin
-         id="org.apache.lucene"
-         download-size="0"
-         install-size="0"
-         version="1.3.0"/>
-
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/handler.jar b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/handler.jar
deleted file mode 100644
index 87bc244..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/handler.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/src/HandlerWithUI.java b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/src/HandlerWithUI.java
deleted file mode 100644
index 4c80d69..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/FeatureWithInstallHandler/src/HandlerWithUI.java
+++ /dev/null
@@ -1,135 +0,0 @@
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.dialogs.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.update.core.*;
-/*
- * Created on Oct 1, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-
-/**
- * @author birsan
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-public class HandlerWithUI implements IInstallHandler {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#completeConfigure()
-	 */
-	public void completeConfigure() throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("completeConfigure()");
-
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#completeInstall(org.eclipse.update.core.IFeatureContentConsumer)
-	 */
-	public void completeInstall(IFeatureContentConsumer consumer)
-			throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("completeInstall()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#completeUnconfigure()
-	 */
-	public void completeUnconfigure() throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("completeInstall()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#completeUninstall()
-	 */
-	public void completeUninstall() throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("completeUninstall()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#configureCompleted(boolean)
-	 */
-	public void configureCompleted(boolean success) throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("configureCompleted()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#configureInitiated()
-	 */
-	public void configureInitiated() throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("configureInitiated()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#initialize(int, org.eclipse.update.core.IFeature, org.eclipse.update.core.IInstallHandlerEntry, org.eclipse.update.core.InstallMonitor)
-	 */
-	public void initialize(int type, IFeature feature,
-			IInstallHandlerEntry entry, InstallMonitor monitor)
-			throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("initialize()");
-		Display.getDefault().asyncExec( new Runnable() {
-			public void run() {
-				MessageDialog.openInformation(Display.getDefault().getActiveShell(), "InstallHandler", "This is a dummy message");
-			}
-		});
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#installCompleted(boolean)
-	 */
-	public void installCompleted(boolean success) throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("installCompleted()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#installInitiated()
-	 */
-	public void installInitiated() throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("installInitiated()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#nonPluginDataDownloaded(org.eclipse.update.core.INonPluginEntry[], org.eclipse.update.core.IVerificationListener)
-	 */
-	public void nonPluginDataDownloaded(INonPluginEntry[] nonPluginData,
-			IVerificationListener listener) throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("nonPluginDataDownloaded()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#pluginsDownloaded(org.eclipse.update.core.IPluginEntry[])
-	 */
-	public void pluginsDownloaded(IPluginEntry[] plugins) throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("pluginsDownloaded()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#unconfigureCompleted(boolean)
-	 */
-	public void unconfigureCompleted(boolean success) throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("unconfigureCompleted()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#unconfigureInitiated()
-	 */
-	public void unconfigureInitiated() throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("unconfigureInitiated()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#uninstallCompleted(boolean)
-	 */
-	public void uninstallCompleted(boolean success) throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("uninstallCompleted()");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.IInstallHandler#uninstallInitiated()
-	 */
-	public void uninstallInitiated() throws CoreException {
-		// TODO Auto-generated method stub
-		System.out.println("uninstallInitiated()");
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/cpl-v10.html
deleted file mode 100644
index 95416c1..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/cpl-v10.html
+++ /dev/null
@@ -1,266 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta name="generator" content="HTML Tidy, see www.w3.org" />
-<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 style="font-weight: bold; text-align: center">Common Public
-License - v 1.0</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">1. DEFINITIONS</p>
-
-<p>"Contribution" means:</p>
-
-<div style="margin-left: 2em">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:</div>
-
-<div style="margin-left: 2em">i) changes to the Program, and</div>
-
-<div style="margin-left: 2em">ii) additions to the Program;</div>
-
-<div style="margin-left: 2em">where such changes and/or additions
-to the Program originate from and are distributed by that
-particular Contributor. 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. 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.</div>
-
-<p>"Contributor" means any person or entity that distributes the
-Program.</p>
-
-<p>"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.</p>
-
-<p>"Program" means the Contributions distributed in accordance with
-this Agreement.</p>
-
-<p>"Recipient" means anyone who receives the Program under this
-Agreement, including all Contributors.</p>
-
-<p style="font-weight: bold">2. GRANT OF RIGHTS</p>
-
-<div style="margin-left: 2em">a) Subject to the terms of this
-Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, royalty-free copyright license to
-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.</div>
-
-<div style="margin-left: 2em">b) Subject to the terms of this
-Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, 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.</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<p style="font-weight: bold">3. REQUIREMENTS</p>
-
-<p>A Contributor may choose to distribute the Program in object
-code form under its own license agreement, provided that:</p>
-
-<div style="margin-left: 2em">a) it complies with the terms and
-conditions of this Agreement; and</div>
-
-<div style="margin-left: 2em">b) its license agreement:</div>
-
-<div style="margin-left: 2em">i) effectively disclaims on behalf of
-all Contributors all warranties and conditions, express and
-implied, including warranties or conditions of title and
-non-infringement, and implied warranties or conditions of
-merchantability and fitness for a particular purpose;</div>
-
-<div style="margin-left: 2em">ii) effectively excludes on behalf of
-all Contributors all liability for damages, including direct,
-indirect, special, incidental and consequential damages, such as
-lost profits;</div>
-
-<div style="margin-left: 2em">iii) states that any provisions which
-differ from this Agreement are offered by that Contributor alone
-and not by any other party; and</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<p>When the Program is made available in source code form:</p>
-
-<div style="margin-left: 2em">a) it must be made available under
-this Agreement; and</div>
-
-<div style="margin-left: 2em">b) a copy of this Agreement must be
-included with each copy of the Program.</div>
-
-<p>Contributors may not remove or alter any copyright notices
-contained within the Program.</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">4. COMMERCIAL DISTRIBUTION</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">5. NO WARRANTY</p>
-
-<p>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 solely responsible for determining the appropriateness of using
-and distributing the Program and assumes all risks associated with
-its exercise of rights under this Agreement, including but not
-limited to the risks and costs of program errors, compliance with
-applicable laws, damage to or loss of data, programs or equipment,
-and unavailability or interruption of operations.</p>
-
-<p style="font-weight: bold">6. DISCLAIMER OF LIABILITY</p>
-
-<p>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 (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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.</p>
-
-<p style="font-weight: bold">7. GENERAL</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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 publish new versions
-(including revisions) of this Agreement from time to 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. 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
-version. 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, by implication, estoppel or otherwise. All rights in the
-Program not expressly granted under this Agreement are
-reserved.</p>
-
-<p>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.</p>
-</body>
-</html>
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/feature.properties
deleted file mode 100644
index f8cfdf4..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/feature.properties
+++ /dev/null
@@ -1,141 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $Id: feature.properties,v 1.2 2004/05/26 15:16:28 marcelop Exp $
-#  */
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# This file 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 Modeling Framework (EMF) Documentation
-
-# "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=Eclipse Modeling Framework. (documentation)
-
-# "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 ##########################################
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/feature.xml
deleted file mode 100644
index 09363e7..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/feature.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-/**
- * <copyright>
- *
- * 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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *
- * </copyright>
- *
- * $Id: feature.xml,v 1.1 2004/03/06 17:31:31 marcelop Exp $
- */
--->
-
-<feature
-	id="org.eclipse.emf.doc"
-    label="%featureName"
-    version="2.0.0"
-    image= "eclipse_update_120.jpg"
-    provider-name="%providerName">
-
-	<description>
-    	%description
-	</description>
-
-    <license url="%licenseURL">
-		%license
-	</license>
-
-	<url>
-		<update url="http://update.eclipse.org/updates" label="%updateSiteName"/>
-	</url>
-
-	<plugin
-		id="org.eclipse.emf.doc"
-        download-size="0"
-        install-size="0"   		
-		version="2.0.0"/>
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/license.html
deleted file mode 100644
index 07a5e18..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.doc_2.0.0/license.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta name="generator" content="HTML Tidy, see www.w3.org" />
-<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
-"CONTENT"). 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 ("CPL"). 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, "Program" 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 ("Repository") in CVS modules ("Modules") and made
-available as downloadable archives ("Downloads").</p>
-
-<p>Content may be apportioned into plug-ins ("Plug-ins"), plug-in
-fragments ("Fragments"), and features ("Features"). A Feature is a
-bundle of one or more Plug-ins and/or Fragments and associated
-material. Files named "feature.xml" 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 "plugins" and Features are located in directories named
-"features".</p>
-
-<p>Features may also include other Features ("Included Features").
-Files named "feature.xml" 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 "about.html" ("Abouts"). The terms and
-conditions governing Features and Included Features should be
-contained in files named "license.html" ("Feature Licenses").
-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 "src" 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
-("Feature Update License") 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 "license" property of
-files named "feature.properties". 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>
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 3a4d639..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/feature.properties
deleted file mode 100644
index 0c94af5..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/feature.properties
+++ /dev/null
@@ -1,141 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $Id: feature.properties,v 1.1 2004/03/26 15:24:15 marcelop Exp $ 
-#  */
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# This file 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=EMF Service Data Objects (SDO) Documentation
-
-# "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=EMF Service Data Objects (SDO) Documentation
-
-# "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 ##########################################
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/feature.xml
deleted file mode 100644
index 1dfb44a..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/feature.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-/**
- * <copyright>
- *
- * 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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *
- * </copyright>
- *
- * $Id: feature.xml,v 1.2 2004/03/26 15:32:13 marcelop Exp $
- */
--->
-
-<feature
-	id="org.eclipse.emf.ecore.sdo.doc"
-    label="%featureName"
-    version="2.0.0"
-    image= "eclipse_update_120.jpg"
-    provider-name="%providerName">
-
-	<description>
-    	%description
-	</description>
-
-    <license url="%licenseURL">
-		%license
-	</license>
-
-	<url>
-		<update url="http://update.eclipse.org/updates" label="%updateSiteName"/>
-	</url>
-
-	<plugin
-		id="org.eclipse.emf.ecore.sdo.doc"
-        download-size="0"
-        install-size="0"   		
-		version="2.0.0"/>
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/license.html
deleted file mode 100644
index af8c380..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.doc_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 3a4d639..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/feature.properties
deleted file mode 100644
index faf0eed..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/feature.properties
+++ /dev/null
@@ -1,141 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $Id: feature.properties,v 1.1 2004/03/26 15:24:15 marcelop Exp $ 
-#  */
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# This file 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=EMF Service Data Objects (SDO) Source
-
-# "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=EMF Service Data Objects (SDO) Source
-
-# "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 ##########################################
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/feature.xml
deleted file mode 100644
index ba5d87d..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/feature.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature primary="false"  provider-name="%providerName"    label="%featureName"  image="eclipse_update_120.jpg" id="org.eclipse.emf.ecore.sdo.source"  version="2.0.0">
-	<description >
-		%description
-	</description>
-	<copyright url="http://www.eclipse.org/legal/cpl-v10.html">
-		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 Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-	</copyright>
-	<license url="%licenseURL">
-		%license
-	</license>
-	<url>
-		<update label="%updateSiteName" url="http://update.eclipse.org/updates/"/>
-		<discovery label="%secondaryUpdateSiteName" url="http://download.eclipse.org/tools/emf/updates/"/>
-	</url>
-	<plugin    fragment="false"  download-size="0" install-size="0" id="org.eclipse.emf.ecore.sdo.source" version="2.0.0"/>
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/license.html
deleted file mode 100644
index af8c380..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo.source_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 3a4d639..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/feature.properties
deleted file mode 100644
index 7d4ad3d..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/feature.properties
+++ /dev/null
@@ -1,144 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $id$
-#  */
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# This file 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=EMF Service Data Objects (SDO)
-
-# "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=EMF Service Data Objects (SDO).
-
-# "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 ##########################################
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
-
-# "secondaryUpdateSiteName" property - label for the secondary update site (on download.eclipse.org)
-secondaryUpdateSiteName=EMF/SDO/XSD Secondary Update Site
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/feature.xml
deleted file mode 100644
index f04662b..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/feature.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.emf.ecore.sdo"
-      label="%featureName"
-      version="2.0.0"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright url="http://www.eclipse.org/legal/cpl-v10.html">
-      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 Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://update.eclipse.org/updates/"/>
-      <discovery label="%secondaryUpdateSiteName" url="http://download.eclipse.org/tools/emf/updates/"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.core.resources" version="3.0.0" match="compatible"/>
-      <import plugin="org.eclipse.emf.ecore" version="2.0.0" match="compatible"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.emf.commonj.sdo"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.sdo"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.sdo.edit"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.sdo.editor"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/license.html
deleted file mode 100644
index af8c380..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.ecore.sdo_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/cpl-v10.html
deleted file mode 100644
index 95416c1..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/cpl-v10.html
+++ /dev/null
@@ -1,266 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta name="generator" content="HTML Tidy, see www.w3.org" />
-<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 style="font-weight: bold; text-align: center">Common Public
-License - v 1.0</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">1. DEFINITIONS</p>
-
-<p>"Contribution" means:</p>
-
-<div style="margin-left: 2em">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:</div>
-
-<div style="margin-left: 2em">i) changes to the Program, and</div>
-
-<div style="margin-left: 2em">ii) additions to the Program;</div>
-
-<div style="margin-left: 2em">where such changes and/or additions
-to the Program originate from and are distributed by that
-particular Contributor. 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. 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.</div>
-
-<p>"Contributor" means any person or entity that distributes the
-Program.</p>
-
-<p>"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.</p>
-
-<p>"Program" means the Contributions distributed in accordance with
-this Agreement.</p>
-
-<p>"Recipient" means anyone who receives the Program under this
-Agreement, including all Contributors.</p>
-
-<p style="font-weight: bold">2. GRANT OF RIGHTS</p>
-
-<div style="margin-left: 2em">a) Subject to the terms of this
-Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, royalty-free copyright license to
-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.</div>
-
-<div style="margin-left: 2em">b) Subject to the terms of this
-Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, 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.</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<p style="font-weight: bold">3. REQUIREMENTS</p>
-
-<p>A Contributor may choose to distribute the Program in object
-code form under its own license agreement, provided that:</p>
-
-<div style="margin-left: 2em">a) it complies with the terms and
-conditions of this Agreement; and</div>
-
-<div style="margin-left: 2em">b) its license agreement:</div>
-
-<div style="margin-left: 2em">i) effectively disclaims on behalf of
-all Contributors all warranties and conditions, express and
-implied, including warranties or conditions of title and
-non-infringement, and implied warranties or conditions of
-merchantability and fitness for a particular purpose;</div>
-
-<div style="margin-left: 2em">ii) effectively excludes on behalf of
-all Contributors all liability for damages, including direct,
-indirect, special, incidental and consequential damages, such as
-lost profits;</div>
-
-<div style="margin-left: 2em">iii) states that any provisions which
-differ from this Agreement are offered by that Contributor alone
-and not by any other party; and</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<p>When the Program is made available in source code form:</p>
-
-<div style="margin-left: 2em">a) it must be made available under
-this Agreement; and</div>
-
-<div style="margin-left: 2em">b) a copy of this Agreement must be
-included with each copy of the Program.</div>
-
-<p>Contributors may not remove or alter any copyright notices
-contained within the Program.</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">4. COMMERCIAL DISTRIBUTION</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">5. NO WARRANTY</p>
-
-<p>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 solely responsible for determining the appropriateness of using
-and distributing the Program and assumes all risks associated with
-its exercise of rights under this Agreement, including but not
-limited to the risks and costs of program errors, compliance with
-applicable laws, damage to or loss of data, programs or equipment,
-and unavailability or interruption of operations.</p>
-
-<p style="font-weight: bold">6. DISCLAIMER OF LIABILITY</p>
-
-<p>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 (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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.</p>
-
-<p style="font-weight: bold">7. GENERAL</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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 publish new versions
-(including revisions) of this Agreement from time to 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. 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
-version. 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, by implication, estoppel or otherwise. All rights in the
-Program not expressly granted under this Agreement are
-reserved.</p>
-
-<p>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.</p>
-</body>
-</html>
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/feature.properties
deleted file mode 100644
index 9e4b7cd..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/feature.properties
+++ /dev/null
@@ -1,130 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $Id: feature.properties,v 1.1 2004/03/06 17:31:31 marcelop Exp $
-#  */
-
-# 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=EMF SDK
-
-# "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=Binaries and API documentation and source zips for EMF.
-
-# "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 ##########################################
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/feature.xml
deleted file mode 100644
index 6418de2..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/feature.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-/**
- * <copyright>
- *
- * 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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *
- * </copyright>
- *
- * $Id: feature.xml,v 1.2 2004/03/25 14:06:34 marcelop Exp $
- */
--->
-
-<feature
-    id="org.eclipse.emf.sdk"
-    label="%featureName"
-    version="2.0.0"
-    image= "eclipse_update_120.jpg"
-    provider-name="%providerName">
-
-	<description>
-        %description
-    </description>
-   
-	<license url="%licenseURL">
-        %license
-    </license>
-
-    <url>
-      <update url="http://update.eclipse.org/updates" label="%updateSiteName"/>
-    </url>
-
-    <includes
-        id="org.eclipse.emf"
-        version="2.0.0"
-        match="compatible"/> 
-        
-    <includes
-        id="org.eclipse.emf.source"
-        version="2.0.0"
-        match="compatible"/> 
-
-    <includes
-        id="org.eclipse.emf.doc"
-        version="2.0.0"
-        match="compatible"/>   
-
-    <includes
-        id="org.eclipse.xsd"
-        version="2.0.0"
-        match="compatible"/> 
-
-    <includes
-        id="org.eclipse.xsd.source"
-        version="2.0.0"
-        match="compatible"/> 
-
-    <includes
-        id="org.eclipse.xsd.doc"
-        version="2.0.0"
-        match="compatible"/> 
-
-    <includes
-        id="org.eclipse.emf.ecore.sdo"
-        version="2.0.0"
-        match="compatible"/> 
-
-    <includes
-        id="org.eclipse.emf.ecore.sdo.source"
-        version="2.0.0"
-        match="compatible"/> 
-
-    <includes
-        id="org.eclipse.emf.ecore.sdo.doc"
-        version="2.0.0"
-        match="compatible"/> 
-       
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/license.html
deleted file mode 100644
index 07a5e18..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.sdk_2.0.0/license.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta name="generator" content="HTML Tidy, see www.w3.org" />
-<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
-"CONTENT"). 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 ("CPL"). 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, "Program" 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 ("Repository") in CVS modules ("Modules") and made
-available as downloadable archives ("Downloads").</p>
-
-<p>Content may be apportioned into plug-ins ("Plug-ins"), plug-in
-fragments ("Fragments"), and features ("Features"). A Feature is a
-bundle of one or more Plug-ins and/or Fragments and associated
-material. Files named "feature.xml" 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 "plugins" and Features are located in directories named
-"features".</p>
-
-<p>Features may also include other Features ("Included Features").
-Files named "feature.xml" 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 "about.html" ("Abouts"). The terms and
-conditions governing Features and Included Features should be
-contained in files named "license.html" ("Feature Licenses").
-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 "src" 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
-("Feature Update License") 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 "license" property of
-files named "feature.properties". 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>
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/cpl-v10.html
deleted file mode 100644
index 95416c1..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/cpl-v10.html
+++ /dev/null
@@ -1,266 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta name="generator" content="HTML Tidy, see www.w3.org" />
-<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 style="font-weight: bold; text-align: center">Common Public
-License - v 1.0</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">1. DEFINITIONS</p>
-
-<p>"Contribution" means:</p>
-
-<div style="margin-left: 2em">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:</div>
-
-<div style="margin-left: 2em">i) changes to the Program, and</div>
-
-<div style="margin-left: 2em">ii) additions to the Program;</div>
-
-<div style="margin-left: 2em">where such changes and/or additions
-to the Program originate from and are distributed by that
-particular Contributor. 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. 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.</div>
-
-<p>"Contributor" means any person or entity that distributes the
-Program.</p>
-
-<p>"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.</p>
-
-<p>"Program" means the Contributions distributed in accordance with
-this Agreement.</p>
-
-<p>"Recipient" means anyone who receives the Program under this
-Agreement, including all Contributors.</p>
-
-<p style="font-weight: bold">2. GRANT OF RIGHTS</p>
-
-<div style="margin-left: 2em">a) Subject to the terms of this
-Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, royalty-free copyright license to
-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.</div>
-
-<div style="margin-left: 2em">b) Subject to the terms of this
-Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, 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.</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<p style="font-weight: bold">3. REQUIREMENTS</p>
-
-<p>A Contributor may choose to distribute the Program in object
-code form under its own license agreement, provided that:</p>
-
-<div style="margin-left: 2em">a) it complies with the terms and
-conditions of this Agreement; and</div>
-
-<div style="margin-left: 2em">b) its license agreement:</div>
-
-<div style="margin-left: 2em">i) effectively disclaims on behalf of
-all Contributors all warranties and conditions, express and
-implied, including warranties or conditions of title and
-non-infringement, and implied warranties or conditions of
-merchantability and fitness for a particular purpose;</div>
-
-<div style="margin-left: 2em">ii) effectively excludes on behalf of
-all Contributors all liability for damages, including direct,
-indirect, special, incidental and consequential damages, such as
-lost profits;</div>
-
-<div style="margin-left: 2em">iii) states that any provisions which
-differ from this Agreement are offered by that Contributor alone
-and not by any other party; and</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<p>When the Program is made available in source code form:</p>
-
-<div style="margin-left: 2em">a) it must be made available under
-this Agreement; and</div>
-
-<div style="margin-left: 2em">b) a copy of this Agreement must be
-included with each copy of the Program.</div>
-
-<p>Contributors may not remove or alter any copyright notices
-contained within the Program.</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">4. COMMERCIAL DISTRIBUTION</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">5. NO WARRANTY</p>
-
-<p>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 solely responsible for determining the appropriateness of using
-and distributing the Program and assumes all risks associated with
-its exercise of rights under this Agreement, including but not
-limited to the risks and costs of program errors, compliance with
-applicable laws, damage to or loss of data, programs or equipment,
-and unavailability or interruption of operations.</p>
-
-<p style="font-weight: bold">6. DISCLAIMER OF LIABILITY</p>
-
-<p>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 (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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.</p>
-
-<p style="font-weight: bold">7. GENERAL</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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 publish new versions
-(including revisions) of this Agreement from time to 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. 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
-version. 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, by implication, estoppel or otherwise. All rights in the
-Program not expressly granted under this Agreement are
-reserved.</p>
-
-<p>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.</p>
-</body>
-</html>
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/feature.properties
deleted file mode 100644
index b51fd10..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/feature.properties
+++ /dev/null
@@ -1,141 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $Id: feature.properties,v 1.2 2004/05/26 15:16:25 marcelop Exp $
-#  */
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# This file 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 Modeling Framework (EMF) Source
-
-# "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=Eclipse Modeling Framework. (source code)
-
-# "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 ##########################################
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/feature.xml
deleted file mode 100644
index 2200214..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/feature.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature primary="false"  provider-name="%providerName"    label="%featureName"  image="eclipse_update_120.jpg" id="org.eclipse.emf.source"  version="2.0.0">
-	<description >
-		%description
-	</description>
-	<copyright url="http://www.eclipse.org/legal/cpl-v10.html">
-		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 Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-	</copyright>
-	<license url="%licenseURL">
-		%license
-	</license>
-	<url>
-		<update label="%updateSiteName" url="http://update.eclipse.org/updates/"/>
-		<discovery label="%secondaryUpdateSiteName" url="http://download.eclipse.org/tools/emf/updates/"/>
-	</url>
-	<plugin    fragment="false"  download-size="0" install-size="0" id="org.eclipse.emf.source" version="2.0.0"/>
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/license.html
deleted file mode 100644
index 07a5e18..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf.source_2.0.0/license.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta name="generator" content="HTML Tidy, see www.w3.org" />
-<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
-"CONTENT"). 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 ("CPL"). 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, "Program" 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 ("Repository") in CVS modules ("Modules") and made
-available as downloadable archives ("Downloads").</p>
-
-<p>Content may be apportioned into plug-ins ("Plug-ins"), plug-in
-fragments ("Fragments"), and features ("Features"). A Feature is a
-bundle of one or more Plug-ins and/or Fragments and associated
-material. Files named "feature.xml" 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 "plugins" and Features are located in directories named
-"features".</p>
-
-<p>Features may also include other Features ("Included Features").
-Files named "feature.xml" 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 "about.html" ("Abouts"). The terms and
-conditions governing Features and Included Features should be
-contained in files named "license.html" ("Feature Licenses").
-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 "src" 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
-("Feature Update License") 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 "license" property of
-files named "feature.properties". 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>
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/cpl-v10.html
deleted file mode 100644
index 95416c1..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/cpl-v10.html
+++ /dev/null
@@ -1,266 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta name="generator" content="HTML Tidy, see www.w3.org" />
-<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 style="font-weight: bold; text-align: center">Common Public
-License - v 1.0</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">1. DEFINITIONS</p>
-
-<p>"Contribution" means:</p>
-
-<div style="margin-left: 2em">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:</div>
-
-<div style="margin-left: 2em">i) changes to the Program, and</div>
-
-<div style="margin-left: 2em">ii) additions to the Program;</div>
-
-<div style="margin-left: 2em">where such changes and/or additions
-to the Program originate from and are distributed by that
-particular Contributor. 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. 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.</div>
-
-<p>"Contributor" means any person or entity that distributes the
-Program.</p>
-
-<p>"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.</p>
-
-<p>"Program" means the Contributions distributed in accordance with
-this Agreement.</p>
-
-<p>"Recipient" means anyone who receives the Program under this
-Agreement, including all Contributors.</p>
-
-<p style="font-weight: bold">2. GRANT OF RIGHTS</p>
-
-<div style="margin-left: 2em">a) Subject to the terms of this
-Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, royalty-free copyright license to
-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.</div>
-
-<div style="margin-left: 2em">b) Subject to the terms of this
-Agreement, each Contributor hereby grants Recipient a
-non-exclusive, worldwide, 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.</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<p style="font-weight: bold">3. REQUIREMENTS</p>
-
-<p>A Contributor may choose to distribute the Program in object
-code form under its own license agreement, provided that:</p>
-
-<div style="margin-left: 2em">a) it complies with the terms and
-conditions of this Agreement; and</div>
-
-<div style="margin-left: 2em">b) its license agreement:</div>
-
-<div style="margin-left: 2em">i) effectively disclaims on behalf of
-all Contributors all warranties and conditions, express and
-implied, including warranties or conditions of title and
-non-infringement, and implied warranties or conditions of
-merchantability and fitness for a particular purpose;</div>
-
-<div style="margin-left: 2em">ii) effectively excludes on behalf of
-all Contributors all liability for damages, including direct,
-indirect, special, incidental and consequential damages, such as
-lost profits;</div>
-
-<div style="margin-left: 2em">iii) states that any provisions which
-differ from this Agreement are offered by that Contributor alone
-and not by any other party; and</div>
-
-<div style="margin-left: 2em">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.</div>
-
-<p>When the Program is made available in source code form:</p>
-
-<div style="margin-left: 2em">a) it must be made available under
-this Agreement; and</div>
-
-<div style="margin-left: 2em">b) a copy of this Agreement must be
-included with each copy of the Program.</div>
-
-<p>Contributors may not remove or alter any copyright notices
-contained within the Program.</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">4. COMMERCIAL DISTRIBUTION</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p style="font-weight: bold">5. NO WARRANTY</p>
-
-<p>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 solely responsible for determining the appropriateness of using
-and distributing the Program and assumes all risks associated with
-its exercise of rights under this Agreement, including but not
-limited to the risks and costs of program errors, compliance with
-applicable laws, damage to or loss of data, programs or equipment,
-and unavailability or interruption of operations.</p>
-
-<p style="font-weight: bold">6. DISCLAIMER OF LIABILITY</p>
-
-<p>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 (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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.</p>
-
-<p style="font-weight: bold">7. GENERAL</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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.</p>
-
-<p>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 publish new versions
-(including revisions) of this Agreement from time to 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. 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
-version. 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, by implication, estoppel or otherwise. All rights in the
-Program not expressly granted under this Agreement are
-reserved.</p>
-
-<p>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.</p>
-</body>
-</html>
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/feature.properties
deleted file mode 100644
index 374b9bf..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/feature.properties
+++ /dev/null
@@ -1,144 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $Id: feature.properties,v 1.4 2004/05/26 15:16:25 marcelop Exp $
-#  */
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# This file 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 Modeling Framework (EMF)
-
-# "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=Eclipse Modeling Framework. (Binary runtime)
-
-# "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 ##########################################
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
-
-# "secondaryUpdateSiteName" property - label for the secondary update site (on download.eclipse.org)
-secondaryUpdateSiteName=EMF/SDO/XSD Secondary Update Site
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/feature.xml
deleted file mode 100644
index 6d59f37..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/feature.xml
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.emf"
-      label="%featureName"
-      version="2.0.0"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright url="http://www.eclipse.org/legal/cpl-v10.html">
-      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 Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://update.eclipse.org/updates/"/>
-      <discovery label="%secondaryUpdateSiteName" url="http://download.eclipse.org/tools/emf/updates/"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.core.resources" version="3.0.0" match="compatible"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.emf"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.codegen"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.codegen.ui"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.codegen.ecore"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.codegen.ecore.ui"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.common"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.common.ui"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.edit"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.editor"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.change"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.change.edit"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.xmi"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.edit"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.edit.ui"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping.ui"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping.ecore2ecore"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping.ecore2ecore.editor"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/license.html
deleted file mode 100644
index 07a5e18..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.emf_2.0.0/license.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta name="generator" content="HTML Tidy, see www.w3.org" />
-<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
-"CONTENT"). 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 ("CPL"). 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, "Program" 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 ("Repository") in CVS modules ("Modules") and made
-available as downloadable archives ("Downloads").</p>
-
-<p>Content may be apportioned into plug-ins ("Plug-ins"), plug-in
-fragments ("Fragments"), and features ("Features"). A Feature is a
-bundle of one or more Plug-ins and/or Fragments and associated
-material. Files named "feature.xml" 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 "plugins" and Features are located in directories named
-"features".</p>
-
-<p>Features may also include other Features ("Included Features").
-Files named "feature.xml" 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 "about.html" ("Abouts"). The terms and
-conditions governing Features and Included Features should be
-contained in files named "license.html" ("Feature Licenses").
-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 "src" 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
-("Feature Update License") 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 "license" property of
-files named "feature.properties". 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>
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/.project b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/.project
deleted file mode 100644
index 472b822..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jdt-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/feature.properties
deleted file mode 100644
index 38ba95a..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/feature.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# 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 Java Development 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=Eclipse Java development tools. (Binary runtime and user documentation.)
-
-# "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\
-15th June, 2004\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\
-    - Eclipse Public License Version 1.0 (available at http://www.eclipse.org/legal/epl-v10.html)\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 ##########################################
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/feature.xml
deleted file mode 100644
index cb0b530..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/feature.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jdt"
-      label="%featureName"
-      version="3.1.0"
-      image= "eclipse_update_120.jpg"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <license url="%licenseURL">
-     %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-      <discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-   </url>
-
-  <requires>
-      <import plugin="org.eclipse.platform" version="3.1.0" match="compatible" />
-  </requires>
-  
-   <plugin
-         id="org.eclipse.jdt"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.ant.ui"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.ltk.core.refactoring"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.ltk.ui.refactoring"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.jdt.core"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.jdt.debug.ui"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.jdt.debug"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.jdt.junit"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.jdt.junit.runtime"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.jdt.launching"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.eclipse.jdt.ui"
-         download-size="0"
-         install-size="0"
-         version="3.1.0">
-   </plugin>
-
-   <plugin
-         id="org.junit"
-         download-size="0"
-         install-size="0"
-         version="3.8.1">
-   </plugin>
-
-   <plugin id="org.eclipse.jdt.doc.user" version="3.1.0"/>
-
-   <plugin id="org.eclipse.jdt.launching.macosx" version="3.1.0"  os="macosx" ws="carbon"/>  
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/license.html
deleted file mode 100644
index e7d8500..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt-feature/license.html
+++ /dev/null
@@ -1,72 +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>15<sup>th</sup> June, 2004</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>Eclipse Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)</li>
-	<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>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/.project b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/.project
deleted file mode 100644
index 35af184..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jdt.source-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/cpl-v10.html
deleted file mode 100644
index 158d99c..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-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>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/feature.properties
deleted file mode 100644
index 631ceca..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/feature.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# 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 JDT Plug-in Developer Resources
-
-# "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=API documentation and source code zips for Eclipse Java development tools.
-
-# "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\
-15th June, 2004\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\
-    - Eclipse Public License Version 1.0 (available at http://www.eclipse.org/legal/epl-v10.html)\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 ##########################################
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/feature.xml
deleted file mode 100644
index 336ac86..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/feature.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature primary="false"  provider-name="%providerName"    label="%featureName"  image="eclipse_update_120.jpg" id="org.eclipse.jdt.source"  version="3.1.0">
-	<description >
-		%description
-	</description>
-	<license url="%licenseURL">
-		%license
-	</license>
-	<url>
-		<update label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-		<discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-	</url>
-	<plugin    fragment="false"  download-size="0" install-size="0" id="org.eclipse.jdt.doc.isv" version="3.1.0"/>
-	<plugin    fragment="false"  download-size="0" install-size="0" id="org.eclipse.jdt.source" version="3.1.0"/>
-	<plugin ws="carbon"  os="macosx" fragment="true" arch="ppc" download-size="0" install-size="0" id="org.eclipse.jdt.source.macosx.carbon.ppc" version="3.1.0"/>
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/license.html
deleted file mode 100644
index e7d8500..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.jdt.source-feature/license.html
+++ /dev/null
@@ -1,72 +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>15<sup>th</sup> June, 2004</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>Eclipse Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)</li>
-	<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>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/.project b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/.project
deleted file mode 100644
index 223a24d..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.pde-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/feature.properties
deleted file mode 100644
index 7b82e46..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/feature.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# 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 Plug-in Development Environment
-
-# "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=Eclipse plug-in development environment.
-
-# "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\
-15th June, 2004\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\
-    - Eclipse Public License Version 1.0 (available at http://www.eclipse.org/legal/epl-v10.html)\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 ##########################################
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/feature.xml
deleted file mode 100644
index 5d22266..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/feature.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.pde"
-      label="%featureName"
-      version="3.1.0"
-      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/3.0"/>
-      <discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.jdt" version="3.0.0" match="compatible"/>
-      <import plugin="org.eclipse.platform" version="3.0.0" match="compatible"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.pde"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.pde.build"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.pde.core"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.pde.junit.runtime"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-         
-   <plugin
-         id="org.eclipse.pde.runtime"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.pde.ui"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.pde.doc.user"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/license.html
deleted file mode 100644
index e7d8500..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde-feature/license.html
+++ /dev/null
@@ -1,72 +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>15<sup>th</sup> June, 2004</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>Eclipse Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)</li>
-	<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>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/.project b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/.project
deleted file mode 100644
index f4bce7b..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.pde.source-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/feature.properties
deleted file mode 100644
index cd87634..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/feature.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-###############################################################################
-# Copyright (c) 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# 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 PDE Plug-in Developer Resources
-
-# "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=Eclipse plug-in development environment, including documentation and source code zips.
-
-# "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\
-15th June, 2004\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\
-    - Eclipse Public License Version 1.0 (available at http://www.eclipse.org/legal/epl-v10.html)\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 ##########################################
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/feature.xml
deleted file mode 100644
index 5abbbc7..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/feature.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature primary="false"  provider-name="%providerName"    label="%featureName"  image="eclipse_update_120.jpg" id="org.eclipse.pde.source"  version="3.1.0">
-	<description >
-		%description
-	</description>
-	<license url="%licenseURL">
-		%license
-	</license>
-	<url>
-		<update label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-		<discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-	</url>
-	<plugin    fragment="false"  download-size="0" install-size="0" id="org.eclipse.pde.source" version="3.1.0"/>
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/license.html
deleted file mode 100644
index e7d8500..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.pde.source-feature/license.html
+++ /dev/null
@@ -1,72 +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>15<sup>th</sup> June, 2004</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>Eclipse Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)</li>
-	<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>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/.project b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/.project
deleted file mode 100644
index 9f53c70..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.platform-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/feature.properties
deleted file mode 100644
index 2e3efd1..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/feature.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# 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 Platform
-
-# "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=Common OS-independent base of the Eclipse platform. (Binary runtime and user documentation.)
-
-# "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\
-15th June, 2004\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\
-    - Eclipse Public License Version 1.0 (available at http://www.eclipse.org/legal/epl-v10.html)\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 ##########################################
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/feature.xml
deleted file mode 100644
index 872f5cb..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/feature.xml
+++ /dev/null
@@ -1,387 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-In the following markup, ignore the "primary" and "application" attributes.
-See https://bugs.eclipse.org/bugs/show_bug.cgi?id=68351 for more details.
--->
-<feature
-      id="org.eclipse.platform"
-      label="%featureName"
-      version="3.1.0"
-      provider-name="%providerName"
-      plugin=""
-      image="eclipse_update_120.jpg"
-      primary="true"
-      application="org.eclipse.ui.ide.workbench">
-
-   <description>
-      %description
-   </description>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-      <discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-   </url>
-
-   <plugin
-         id="org.apache.ant"
-         download-size="0"
-         install-size="0"
-         version="1.6.2"/>
-
-   <plugin
-         id="org.apache.lucene"
-         download-size="0"
-         install-size="0"
-         version="1.3.0"/>
-
-   <plugin
-         id="org.eclipse.ant.core"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.compare"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.core.boot"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-         
-   <plugin
-   		 id="org.eclipse.core.filebuffers"
-   		 download-size="0"
-   		 install-size="0"
-   		 version="3.1.0"/>
-   
-   <plugin
-   		 id="org.eclipse.core.expressions"
-   		 download-size="0"
-   		 install-size="0"
-   		 version="3.1.0"/>
-   
-   <plugin
-         id="org.eclipse.core.resources"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.core.runtime"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.core.runtime.compatibility"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.osgi"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.osgi.services"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.osgi.util"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.core.variables"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-         
-   <plugin
-         id="org.eclipse.debug.core"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.debug.ui"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.help"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.help.webapp"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.help.base"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.help.ui"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.help.appserver"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.help.ide"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.platform"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.platform.doc.user"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.search"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.swt"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.team.core"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.team.cvs.core"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.team.cvs.ssh"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.team.cvs.ssh2"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.team.cvs.ui"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.team.ui"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.tomcat"
-         download-size="0"
-         install-size="0"
-         version="4.1.30"/>
-
-   <plugin
-         id="org.eclipse.text"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.jface"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.jface.text"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-	
-   <plugin
-         id="org.eclipse.ui.console"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.ui.presentations.r21"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-            
-   <plugin
-         id="org.eclipse.ui.intro"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.ui.cheatsheets"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-            
-   <plugin
-         id="org.eclipse.ui.workbench"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.ui.workbench.texteditor"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.ui.views"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.ui.editors"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-         
-   <plugin
-         id="org.eclipse.ui.forms"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-         
-   <plugin
-         id="org.eclipse.ui"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.ui.externaltools"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.ui.ide"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"/>
-
-   <plugin
-         id="org.eclipse.update.configurator"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.update.core"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.update.scheduler"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-
-   <plugin
-         id="org.eclipse.update.ui"
-         download-size="0"
-         install-size="0"
-         version="3.0.0"/>
-        
-  <!-- Pre-3.0 binary compatibility -->
-   <plugin
-         id="org.eclipse.ui.workbench.compatibility"
-         download-size="0"
-         install-size="0"
-         version="3.1.0"
-         fragment="true"/>
-
-  <!--Aix platform inclusion -->
-  <plugin id="org.eclipse.swt.motif" download-size="0" install-size="0" version="3.1.0" fragment="true" os="aix" ws="motif"/>
-  
-  <!-- HPUX Platform specifics -->
-  <plugin id="org.eclipse.swt.motif" download-size="0" install-size="0" version="3.1.0" fragment="true" os="hpux" ws="motif"/>
-  <plugin id="org.eclipse.core.resources.hpux" download-size="0" install-size="0" version="3.0.0" fragment="true" os="hpux"/>
-
-  <!-- LINUX GTK-->  
-  <plugin id="org.eclipse.swt.gtk" download-size="0" install-size="0" version="3.1.0"  fragment="true" os="linux" ws="gtk" arch="x86" />
-  <plugin id="org.eclipse.swt.gtk" download-size="0" install-size="0" version="3.1.0"  fragment="true" os="linux" ws="gtk" arch="ppc" />
-  <plugin id="org.eclipse.core.resources.linux" download-size="0" install-size="0" version="3.0.0" fragment="true" os="linux"/>
-  <plugin id="org.eclipse.update.core.linux" download-size="0" install-size="0" version="3.0.0" fragment="true" os="linux" />
-
-  <!-- LINUX GTK AMD64-->
-  <plugin id="org.eclipse.swt.gtk64" download-size="0" install-size="0" version="3.1.0"  fragment="true" os="linux" ws="gtk" arch="amd64" />
-
-  <!-- LINUX Motif-->    
-  <plugin id="org.eclipse.swt.motif" download-size="0" install-size="0" version="3.1.0" fragment="true" os="linux" ws="motif"/>
-  <plugin id="org.eclipse.core.resources.linux" download-size="0" install-size="0" version="3.0.0" fragment="true" os="linux"/>
-  <plugin id="org.eclipse.update.core.linux" download-size="0" install-size="0" version="3.0.0" fragment="true" os="linux" />
-
-  <!-- MacOS X Carbon -->  
-  <plugin id="org.eclipse.swt.carbon" download-size="0" install-size="0" version="3.1.0"  fragment="true" os="macosx" ws="carbon"/> 
-  <plugin id="org.eclipse.core.resources.macosx" download-size="0" install-size="0" version="3.0.0" fragment="true" os="macosx" ws="carbon"/>
-  <plugin id="org.eclipse.ui.carbon" download-size="0" install-size="0" version="3.1.0" fragment="true" os="macosx" ws="carbon"/>
-  
-  <!-- QNX Photon -->
-  <plugin id="org.eclipse.swt.photon" download-size="0" install-size="0" version="3.1.0" fragment="true" os="qnx" ws="photon"/>
-  <plugin id="org.eclipse.core.resources.qnx" download-size="0" install-size="0" version="3.0.0" fragment="true" os="qnx" ws="photon"/>
-  
-  <!-- Solaris Motif -->
-  <plugin id="org.eclipse.swt.motif" download-size="0" install-size="0" version="3.1.0" fragment="true" os="solaris" ws="motif"/>
-  
-  <!-- Win32 -->
-  <plugin id="org.eclipse.swt.win32" download-size="0" install-size="0" version="3.1.0" fragment="true" ws="win32"/>
-  <plugin id="org.eclipse.core.resources.win32" download-size="0" install-size="0" version="3.0.0" fragment="true" os="win32"/>
-  <plugin id="org.eclipse.ui.win32" download-size="0" install-size="0" version="3.1.0" fragment="true" ws="win32"/>
-  <plugin id="org.eclipse.update.core.win32" download-size="0" install-size="0" version="3.0.0" fragment="true" os="win32"/>
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/license.html
deleted file mode 100644
index e7d8500..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform-feature/license.html
+++ /dev/null
@@ -1,72 +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>15<sup>th</sup> June, 2004</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>Eclipse Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)</li>
-	<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>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/.project b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/.project
deleted file mode 100644
index d7ca40c..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.platform.source-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/feature.properties
deleted file mode 100644
index 6ab9956..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/feature.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# 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 Platform Plug-in Developer Resources
-
-# "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=Common OS-independent API documentation and source code zips for the Eclipse Platform.
-
-# "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\
-15th June, 2004\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\
-    - Eclipse Public License Version 1.0 (available at http://www.eclipse.org/legal/epl-v10.html)\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 ##########################################
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/feature.xml
deleted file mode 100644
index 3bdee40..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/feature.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature primary="false"  provider-name="%providerName"    label="%featureName"  image="eclipse_update_120.jpg" id="org.eclipse.platform.source"  version="3.1.0">
-	<description >
-		%description
-	</description>
-	<license url="%licenseURL">
-		%license
-	</license>
-	<url>
-		<update label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-		<discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-	</url>
-	<plugin    fragment="false"  download-size="0" install-size="0" id="org.eclipse.platform.doc.isv" version="3.1.0"/>
-	<plugin    fragment="false"  download-size="0" install-size="0" id="org.eclipse.platform.source" version="3.1.0"/>
-	<plugin ws="gtk"  os="linux" fragment="true" arch="ia64" download-size="0" install-size="0" id="org.eclipse.platform.source.linux.gtk.ia64" version="3.1.0"/>
-	<plugin ws="carbon"  os="macosx" fragment="true" arch="ppc" download-size="0" install-size="0" id="org.eclipse.platform.source.macosx.carbon.ppc" version="3.1.0"/>
-	<plugin ws="photon"  os="qnx" fragment="true" arch="x86" download-size="0" install-size="0" id="org.eclipse.platform.source.qnx.photon.x86" version="3.1.0"/>
-	<plugin ws="gtk"  os="linux" fragment="true" arch="ppc" download-size="0" install-size="0" id="org.eclipse.platform.source.linux.gtk.ppc" version="3.1.0"/>
-	<plugin ws="motif"  os="hpux" fragment="true" arch="PA_RISC" download-size="0" install-size="0" id="org.eclipse.platform.source.hpux.motif.PA_RISC" version="3.1.0"/>
-	<plugin ws="motif"  os="aix" fragment="true" arch="ppc" download-size="0" install-size="0" id="org.eclipse.platform.source.aix.motif.ppc" version="3.1.0"/>
-	<plugin ws="gtk"  os="linux" fragment="true" arch="x86" download-size="0" install-size="0" id="org.eclipse.platform.source.linux.gtk.x86" version="3.1.0"/>
-	<plugin ws="win32"  os="win32" fragment="true" arch="x86" download-size="0" install-size="0" id="org.eclipse.platform.source.win32.win32.x86" version="3.1.0"/>
-	<plugin ws="motif"  os="solaris" fragment="true" arch="sparc" download-size="0" install-size="0" id="org.eclipse.platform.source.solaris.motif.sparc" version="3.1.0"/>
-	<plugin ws="gtk"  os="linux" fragment="true" arch="amd64" download-size="0" install-size="0" id="org.eclipse.platform.source.linux.gtk.amd64" version="3.1.0"/>
-	<plugin ws="motif"  os="linux" fragment="true" arch="x86" download-size="0" install-size="0" id="org.eclipse.platform.source.linux.motif.x86" version="3.1.0"/>
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/license.html
deleted file mode 100644
index e7d8500..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.platform.source-feature/license.html
+++ /dev/null
@@ -1,72 +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>15<sup>th</sup> June, 2004</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>Eclipse Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)</li>
-	<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>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/.project b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/.project
deleted file mode 100644
index 49f7d79..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.sdk-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/feature.properties
deleted file mode 100644
index b46d29a..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/feature.properties
+++ /dev/null
@@ -1,124 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# 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 Project SDK
-
-# "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=SDK for Eclipse.
-
-# "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\
-15th June, 2004\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\
-    - Eclipse Public License Version 1.0 (available at http://www.eclipse.org/legal/epl-v10.html)\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 ##########################################
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/feature.xml
deleted file mode 100644
index f29904c..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/feature.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.sdk"
-      label="%featureName"
-      version="3.1.0"
-      image= "eclipse_update_120.jpg"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-   
-   <license url="%licenseURL">
-     %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-      <discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.0"/>
-   </url>
-
-  <includes id="org.eclipse.platform" version="3.1.0" /> 
-  <includes id="org.eclipse.platform.source" version="3.1.0" /> 
-  <includes id="org.eclipse.jdt" version="3.1.0" />
-  <includes id="org.eclipse.jdt.source" version="3.1.0" /> 
-  <includes id="org.eclipse.pde" version="3.1.0" /> 
-  <includes id="org.eclipse.pde.source" version="3.1.0" /> 
-  <plugin id="org.eclipse.sdk" version="3.1.0"/>
-  
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/license.html
deleted file mode 100644
index e7d8500..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.sdk-feature/license.html
+++ /dev/null
@@ -1,72 +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>15<sup>th</sup> June, 2004</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>Eclipse Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>)</li>
-	<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>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/feature.properties
deleted file mode 100644
index d328679..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/feature.properties
+++ /dev/null
@@ -1,141 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $Id: feature.properties,v 1.2 2004/05/26 15:16:26 marcelop Exp $
-#  */
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# This file 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=XML Schema Infoset Model (XSD) Documentation
-
-# "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=Eclipse Modeling Framework. (documentation)
-
-# "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 ##########################################
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/feature.xml
deleted file mode 100644
index fe4f380..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/feature.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-/**
- * <copyright>
- *
- * 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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors: 
- *   IBM - Initial API and implementation
- *
- * </copyright>
- *
- * $Id: feature.xml,v 1.1 2004/03/06 18:00:09 marcelop Exp $
- */
--->
-
-<feature
-      id="org.eclipse.xsd.doc"
-      label="%featureName"
-      version="2.0.0"
-      image= "eclipse_update_120.jpg"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <license url="%licenseURL">
-     %license
-   </license>
-
-   <url>
-      <update url="http://update.eclipse.org/updates" label="%updateSiteName"/>
-   </url>
-
-   <plugin
-         id="org.eclipse.xsd.doc"
-         download-size="0"
-         install-size="0"
-         version="2.0.0">
-   </plugin>
-   		
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/license.html
deleted file mode 100644
index af8c380..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.doc_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/feature.properties
deleted file mode 100644
index 0c1959e..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/feature.properties
+++ /dev/null
@@ -1,141 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $Id: feature.properties,v 1.2 2004/05/26 15:16:27 marcelop Exp $
-#  */
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# This file 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=XML Schema Infoset Model (XSD) Source
-
-# "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=Eclipse Modeling Framework. (source code)
-
-# "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 ##########################################
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/feature.xml
deleted file mode 100644
index d5f2b77..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/feature.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-/**
- * <copyright>
- *
- * 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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors: 
- *   IBM - Initial API and implementation
- *
- * </copyright>
- *
- * $Id: feature.xml,v 1.1 2004/03/06 18:00:11 marcelop Exp $
- */
--->
-
-<feature
-      id="org.eclipse.xsd.source"
-      label="%featureName"
-      version="2.0.0"
-      image= "eclipse_update_120.jpg"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <license url="%licenseURL">
-     %license
-   </license>
-
-   <url>
-      <update url="http://update.eclipse.org/updates" label="%updateSiteName"/>
-   </url>
-
-   <plugin
-         id="org.eclipse.xsd.source"
-         download-size="0"
-         install-size="0"
-         version="2.0.0">
-   </plugin>
-   
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/license.html
deleted file mode 100644
index af8c380..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd.source_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/META-INF/MANIFEST.MF
deleted file mode 100644
index 59499bc..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/cpl-v10.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/eclipse_update_120.jpg b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/eclipse_update_120.jpg
deleted file mode 100644
index 68e3e02..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/feature.properties b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/feature.properties
deleted file mode 100644
index 58b3ec7..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/feature.properties
+++ /dev/null
@@ -1,144 +0,0 @@
-# /**
-#  * <copyright>
-#  *
-#  * 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 Common Public License v1.0
-#  * which accompanies this distribution, and is available at
-#  * http://www.eclipse.org/legal/cpl-v10.html
-#  * 
-#  * Contributors: 
-#  *   IBM - Initial API and implementation
-#  *
-#  * </copyright>
-#  *
-#  * $Id: feature.properties,v 1.3 2004/04/28 16:27:45 nickb Exp $ 
-#  */
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# This file 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=XSD Schema Infoset Model
-
-# "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=XML Schema Infoset Model
-
-# "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 ##########################################
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
-
-# "secondaryUpdateSiteName" property - label for the secondary update site (on download.eclipse.org)
-secondaryUpdateSiteName=EMF/SDO/XSD Secondary Update Site
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/feature.xml
deleted file mode 100644
index 3e51342..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/feature.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.xsd"
-      label="%featureName"
-      version="2.0.0"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright url="http://www.eclipse.org/legal/cpl-v10.html">
-      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 Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://update.eclipse.org/updates/"/>
-      <discovery label="%secondaryUpdateSiteName" url="http://download.eclipse.org/tools/emf/updates/"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.core.resources" version="3.0.0" match="compatible"/>
-      <import plugin="org.eclipse.emf.ecore" version="2.0.0" match="compatible"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.xsd"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.xsd.edit"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.xsd.editor"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.xsd.test"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping.xsd2ecore"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping.xsd2ecore.editor"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-</feature>
diff --git a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/license.html b/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/license.html
deleted file mode 100644
index af8c380..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/eclipse/features/org.eclipse.xsd_2.0.0/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/update/org.eclipse.update.tests.core/data/perf/platform.xml b/update/org.eclipse.update.tests.core/data/perf/platform.xml
deleted file mode 100644
index 983e5c4..0000000
--- a/update/org.eclipse.update.tests.core/data/perf/platform.xml
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--Created on Mon Aug 23 15:05:43 EDT 2004-->
-<config date="1093287943134" transient="false" version="3.0">
-<site enabled="true" policy="USER-EXCLUDE" updateable="true" url="platform:/base/">
-<feature id="org.eclipse.barrup.rad.feature" url="features/org.eclipse.barrup.rad.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barupdate.dev.product" url="features/org.eclipse.barupdate.dev.product_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barupdate.dev" url="features/org.eclipse.barupdate.dev_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.uml2" url="features/org.eclipse.uml2_1.0.1/" version="1.0.1"/>
-<feature id="org.eclipse.barxtools.comparemerge.ejbddfeature" url="features/org.eclipse.barxtools.comparemerge.ejbdd-feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.serverattach.v5" url="features/org.eclipse.foo.serverattach.v5_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardebug.xsl" url="features/org.eclipse.bardebug.xsl_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barxtools.platform.feature" url="features/org.eclipse.barxtools.platform.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barsupport.rad.doc" url="features/org.eclipse.barsupport.rad.doc_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.barr2a.rdj.feature" url="features/org.eclipse.barr2a.rdj.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barupdate.test.ct.feature" url="features/org.eclipse.barupdate.test.ct.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barxtools.eDataviz.feature" url="features/org.eclipse.barxtools.eDataviz.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barrad.welcome.feature" url="features/org.eclipse.barrad.welcome.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardebug.wsa.launch.load" url="features/org.eclipse.bardebug.wsa.launch.load_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barrup.feature" url="features/org.eclipse.barrup.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barxtools.visualization.feature" url="features/org.eclipse.barxtools.visualization.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barrad.nav.doc.feature" url="features/org.eclipse.barrad.nav.doc.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y.test" primary="true" url="features/org.eclipse.y.test_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.bardebug.activescript.win32" url="features/org.eclipse.bardebug.activescript.win32_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barxtools.platform.win32.feature" url="features/org.eclipse.barxtools.platform.win32.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.portal.tools.feature" url="features/org.eclipse.foo.portal.tools.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.serverattach" url="features/org.eclipse.foo.serverattach_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y.test.examples" primary="true" url="features/org.eclipse.y.test.examples_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.barz.common.ui" url="features/org.eclipse.barz.common.ui_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.ejb" url="features/org.eclipse.barz.ejb_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y.profiling" primary="true" url="features/org.eclipse.y.profiling_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.foo.ejbdeploy.feature.nl1" url="features/org.eclipse.foo.ejbdeploy.feature.nl1_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.emf.integration" url="features/org.eclipse.barz.emf.integration_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardebug.javascript" url="features/org.eclipse.bardebug.javascript_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardebug.ast.feature" url="features/org.eclipse.bardebug.ast.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.wsvt-feature" url="features/org.eclipse.wsvt-feature_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.foo.sib.mediation.develop.feature" url="features/org.eclipse.foo.sib.mediation.develop.feature_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.foo.webservice.was.creation.ejb.feature.nl1" url="features/org.eclipse.foo.webservice.was.creation.ejb.feature.nl1_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.webedit.editor.feature" url="features/org.eclipse.foo.webedit.editor.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.data" url="features/org.eclipse.barz.data_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.sib.mediation.deploy.feature" url="features/org.eclipse.foo.sib.mediation.deploy.feature_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.foo.e" url="features/org.eclipse.foo.e_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.webservice.was.creation.ejb.feature" url="features/org.eclipse.foo.webservice.was.creation.ejb.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.siteedit.feature" url="features/org.eclipse.foo.siteedit.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.profiling.server.compatible" url="features/org.eclipse.foo.profiling.server.compatible_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.ws" url="features/org.eclipse.barz.ws_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.ejb.samples-feature" url="features/org.eclipse.foo.ejb.samples-feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.activities.feature" url="features/org.eclipse.barz.activities.feature_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.foo.examples" url="features/org.eclipse.foo.examples_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barx.sdk" url="features/org.eclipse.barx.sdk_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardebug.pdt.win32" url="features/org.eclipse.bardebug.pdt.win32_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardebug.wsa" url="features/org.eclipse.bardebug.wsa_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.jve.express" url="features/org.eclipse.foo.jve.express_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardata.linux" url="features/org.eclipse.bardata.linux_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barsse.xmlmarkup" url="features/org.eclipse.barsse.xmlmarkup_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.validation" url="features/org.eclipse.barz.validation_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y.gla" primary="true" url="features/org.eclipse.y.gla_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.barz.ws.model" url="features/org.eclipse.barz.ws.model_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barx.ast" url="features/org.eclipse.barx.ast_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barws.ast.st.ext.nl1" url="features/org.eclipse.barws.ast.st.ext.nl1_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.common.utilities" url="features/org.eclipse.barz.common.utilities_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.barz.common" url="features/org.eclipse.barz.common_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.xml.model" url="features/org.eclipse.barz.xml.model_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardebug.pdt" url="features/org.eclipse.bardebug.pdt_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.navigator" url="features/org.eclipse.barz.navigator_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.webtools.feature" url="features/org.eclipse.foo.webtools.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.emf.integration.core" url="features/org.eclipse.barz.emf.integration.core_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.foo.struts.feature" url="features/org.eclipse.foo.struts.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barsse.base" url="features/org.eclipse.barsse.base_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardebug.help.doc" url="features/org.eclipse.bardebug.help.doc_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y.models" url="features/org.eclipse.y.models_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.y.logging" url="features/org.eclipse.y.logging_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.bardebug.javascript.nl1.feature" url="features/org.eclipse.bardebug.javascript.nl1.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barws.ast.st.batch" url="features/org.eclipse.barws.ast.st.batch_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barsse.snippets" url="features/org.eclipse.barsse.snippets_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barws.rapiddeploy" plugin-identifier="org.eclipse.barws.rapiddeploy.core" url="features/org.eclipse.barws.rapiddeploy_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.bardata" url="features/org.eclipse.bardata_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.security" url="features/org.eclipse.foo.security_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.probekit" url="features/org.eclipse.foo.probekit_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.jsf.feature" url="features/org.eclipse.foo.jsf.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.analysis" url="features/org.eclipse.foo.analysis_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.ac-tech" url="features/org.eclipse.foo.ac-tech_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.webservice.was.creation.feature" url="features/org.eclipse.foo.webservice.was.creation.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.ejb" url="features/org.eclipse.foo.ejb_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.ejbdeploy.feature" url="features/org.eclipse.foo.ejbdeploy.feature_5.1.1/" version="5.1.1"/>
-<feature id="org.eclipse.barz.e" url="features/org.eclipse.barz.e_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.ftp" url="features/org.eclipse.foo.ftp_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y.examples" url="features/org.eclipse.y.examples_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.foo.jve.core" url="features/org.eclipse.foo.jve.core_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y.core" url="features/org.eclipse.y.core_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.barz.ws.axis" url="features/org.eclipse.barz.ws.axis_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.jve.e" url="features/org.eclipse.foo.jve.e_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.resources.common.feature" url="features/org.eclipse.foo.resources.common.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barws" url="features/org.eclipse.barws_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y" url="features/org.eclipse.y_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.bardebug.ast.nl1.feature" url="features/org.eclipse.bardebug.ast.nl1.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz" url="features/org.eclipse.barz_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barlpex" url="features/org.eclipse.barlpex_3.0.0/" version="3.0.0"/>
-<feature id="org.eclipse.barxml" url="features/org.eclipse.barxml_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.ws.consumption" url="features/org.eclipse.barz.ws.consumption_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.egl.feature" url="features/org.eclipse.foo.egl.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.server.tomcat" url="features/org.eclipse.barz.server.tomcat_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barws.rapiddeploy.cmdframework" url="features/org.eclipse.barws.rapiddeploy.cmdframework_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.foo.ejb.sbf.feature" url="features/org.eclipse.foo.ejb.sbf.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.qev" url="features/org.eclipse.foo.qev_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.ws.ext.feature" url="features/org.eclipse.foo.ws.ext.feature_5.9.0/" version="5.9.0"/>
-<feature id="org.eclipse.barz.xml" url="features/org.eclipse.barz.xml_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barupdate.web.developer" url="features/org.eclipse.barupdate.web.developer_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barws.ast.st.base.nl1" url="features/org.eclipse.barws.ast.st.base.nl1_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.jdt.integration" url="features/org.eclipse.barz.jdt.integration_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y.source" url="features/org.eclipse.y.source_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.foo.gla" url="features/org.eclipse.foo.gla_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.ws.ejb.nl1.feature" url="features/org.eclipse.foo.ws.ejb.nl1.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barws.ast.st.base" url="features/org.eclipse.barws.ast.st.base_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barsupport.rwd.doc" url="features/org.eclipse.barsupport.rwd.doc_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.barupdate.pd.prof" url="features/org.eclipse.barupdate.pd.prof_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.webservice.was.creation.feature.nl1" url="features/org.eclipse.foo.webservice.was.creation.feature.nl1_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.wsvtvalidatorfeature" url="features/org.eclipse.wsvtvalidatorfeature_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.barws.ast.st.batch.nl1" url="features/org.eclipse.barws.ast.st.batch.nl1_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barws.ast.doc.feature" url="features/org.eclipse.barws.ast.doc.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.ws.ejb.feature" url="features/org.eclipse.foo.ws.ejb.feature_5.9.0/" version="5.9.0"/>
-<feature id="org.eclipse.barws.rapiddeploy.nl1" url="features/org.eclipse.barws.rapiddeploy.nl1_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.barz.jca" url="features/org.eclipse.barz.jca_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.xml.validate" url="features/org.eclipse.barz.xml.validate_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.extension" url="features/org.eclipse.barz.extension_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.env.ui" url="features/org.eclipse.barz.env.ui_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.env" url="features/org.eclipse.barz.env_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barupdate.jscrib.framework" url="features/org.eclipse.barupdate.jscrib.framework_1.2.0/" version="1.2.0"/>
-<feature id="org.eclipse.bardebug.pdt.nl1.feature" url="features/org.eclipse.bardebug.pdt.nl1.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barrwd.doc.feature" url="features/org.eclipse.barrwd.doc.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barupdate.orphans" url="features/org.eclipse.barupdate.orphans_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.foo.profiling" url="features/org.eclipse.foo.profiling_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.y.probekit" url="features/org.eclipse.y.probekit_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.barsse.webmarkup" url="features/org.eclipse.barsse.webmarkup_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardata.win32" url="features/org.eclipse.bardata.win32_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.server" url="features/org.eclipse.barz.server_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.jem" url="features/org.eclipse.jem_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.foo.project.interchange" url="features/org.eclipse.foo.project.interchange_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.ve" url="features/org.eclipse.ve_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.bardebug.wsa.nl1.feature" url="features/org.eclipse.bardebug.wsa.nl1.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.webservice.was.deploy.feature.nl1" url="features/org.eclipse.foo.webservice.was.deploy.feature.nl1_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.ws.ext.nl1.feature" url="features/org.eclipse.foo.ws.ext.nl1.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.bardebug.helpas.doc" url="features/org.eclipse.bardebug.helpas.doc_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.emf.ui.integration" url="features/org.eclipse.foo.emf.ui.integration_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.webservice.was.deploy.feature" url="features/org.eclipse.foo.webservice.was.deploy.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barz.web" url="features/org.eclipse.barz.web_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.foo.profiling.server" url="features/org.eclipse.foo.profiling.server_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barws.ast.st.ext" url="features/org.eclipse.barws.ast.st.ext_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barrup.updatezone.feature" url="features/org.eclipse.barrup.updatezone.feature_1.0.0/" version="1.0.0"/>
-<feature id="org.eclipse.barsamplegallery-feature" url="features/org.eclipse.barsamplegallery-feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.jdt.source" url="features/org.eclipse.jdt.source_3.0.1/" version="3.0.1"/>
-<feature application="org.eclipse.ui.ide.workbench" id="org.eclipse.barupdate.sdp.feature" primary="true" url="features/org.eclipse.barupdate.sdp.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.pde.source" url="features/org.eclipse.pde.source_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.foo.lum.utils.feature" url="features/org.eclipse.foo.lum.utils.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.baresupport.client.nl1" url="features/org.eclipse.baresupport.client/" version="0.9.14"/>
-<feature id="org.eclipse.y.logging" url="features/org.eclipse.y.logging_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.emf.ecore.sdo.doc" url="features/org.eclipse.emf.ecore.sdo.doc_2.0.0/" version="2.0.0"/>
-<feature id="org.eclipse.foo.logging" url="features/org.eclipse.foo.logging_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barupdate.welcome.feature.nl1" url="features/org.eclipse.barupdate.welcome.feature.nl1/" version="6.0.0"/>
-<feature application="org.eclipse.ui.ide.workbench" id="org.eclipse.platform" primary="true" url="features/org.eclipse.platform_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.barcommon.doc.feature" url="features/org.eclipse.barcommon.doc.feature/" version="6.0.0"/>
-<feature id="org.eclipse.jdt" url="features/org.eclipse.jdt_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.barsupport.core.doc" url="features/org.eclipse.barsupport.core.doc/" version="1.0.0"/>
-<feature id="org.eclipse.xyz.clearcase" url="features/org.eclipse.xyz.clearcase_6.0.11/" version="6.0.11"/>
-<feature id="org.eclipse.bartutorialgallery-feature" url="features/org.eclipse.bartutorialgallery-feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barupdate.welcome.feature" url="features/org.eclipse.barupdate.welcome.feature/" version="6.0.0"/>
-<feature id="org.eclipse.emf" url="features/org.eclipse.emf_2.0.1/" version="2.0.1"/>
-<feature id="org.eclipse.platform.source" url="features/org.eclipse.platform.source_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.barupdate.common.activities.feature" url="features/org.eclipse.barupdate.common.activities.feature_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barupdate.cdi.itlm" url="features/org.eclipse.barupdate.cdi.itlm_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.pde" url="features/org.eclipse.pde_3.0.1/" version="3.0.1"/>
-<feature id="org.eclipse.emf.doc" url="features/org.eclipse.emf.doc_2.0.1/" version="2.0.1"/>
-<feature id="org.eclipse.emf.ecore.sdo" url="features/org.eclipse.emf.ecore.sdo_2.0.1/" version="2.0.1"/>
-<feature id="org.eclipse.barsupport.core.doc.nl1" url="features/org.eclipse.barsupport.core.doc.nl1/" version="1.0.0"/>
-<feature id="org.eclipse.barxtools.comparemerge" url="features/org.eclipse.barxtools.comparemerge_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.barxtools.common.ui.properties" url="features/org.eclipse.barxtools.common.ui.properties_6.0.0/" version="6.0.0"/>
-<feature id="org.eclipse.xsd" url="features/org.eclipse.xsd_2.0.1/" version="2.0.1"/>
-<feature id="org.eclipse.gef" url="features/org.eclipse.gef_3.0.0/" version="3.0.0"/>
-</site>
-</config>
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar
deleted file mode 100644
index 0c995d5..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar
deleted file mode 100644
index 0c995d5..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar
deleted file mode 100644
index 78f193d..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
deleted file mode 100644
index 2275ade..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
deleted file mode 100644
index ea958c7..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index 7f05d82..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/install/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/install/features/feature3/feature.xml
deleted file mode 100644
index 3141af8..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/install/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="1.1.1" ws="WS_WIN32"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index e01846c..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/install/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/install/features/feature3/feature.xml
deleted file mode 100644
index 68a7de8..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/install/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.core" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="2.1.0" ws="WS_WIN32"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/plugin.xml b/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/plugin.xml
deleted file mode 100644
index e01846c..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/src.jar b/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/resources.properties b/update/org.eclipse.update.tests.core/data/resources.properties
deleted file mode 100644
index 1a3ab90..0000000
--- a/update/org.eclipse.update.tests.core/data/resources.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-HTTP_PATH_1=/org.eclipse.update.tests.core.updatetests/UpdateManager2/
-HTTP_PATH_2=/org.eclipse.update.tests.core.updatetests/UpdateManager/
-HTTP_PATH_3=/org.eclipse.update.tests.core.updatetests/Site with space/
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/site.xml b/update/org.eclipse.update.tests.core/data/site.xml
deleted file mode 100644
index 3fc60c7..0000000
--- a/update/org.eclipse.update.tests.core/data/site.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="testAPI/features/feature3">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="http://www.eclipse.org/feature2">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <feature url="http://www.eclipse.org/feature1">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <archive path="plugins/org.eclipse.update.plugin1_1.1.1.jar" url="plugins/org.eclipse.update.plugin1_1.1.1"/>    
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>
-  <category-def label="Eclipse Tools" name="eclipse"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/site2/site.xml b/update/org.eclipse.update.tests.core/data/site2/site.xml
deleted file mode 100644
index 39d1c11..0000000
--- a/update/org.eclipse.update.tests.core/data/site2/site.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site url="Info.html" type="org.eclipse.update.core.file">
-  <feature url="features/feature1"/>
-  <archive path="org.eclipse.update.plugin1" url="plugins/plugin1"/>
-  <archive path="org.eclipse.update.archive2" url="plugins/plugin2"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/bundleAndPluginManifests_1.0.3/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/bundleAndPluginManifests_1.0.3/META-INF/MANIFEST.MF
deleted file mode 100644
index c223e4f..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/bundleAndPluginManifests_1.0.3/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Generated-from: 1077062603708
-Bundle-Name: Test
-Bundle-Version: 1.0.3
-Bundle-SymbolicName: org.eclipse.update.core.tests.bundleAndPluginManifestsBUNDLEPARSED
-Bundle-Vendor: Eclipse.org
-Bundle-ClassPath: plugin.jar
-Legacy: true
-Bundle-Activator: org.eclipse.update.core.tests.bundleAndPluginManifests.Activator
-Require-Bundle: 
- org.eclipse.core.runtime,
- org.eclipse.ui
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/bundleAndPluginManifests_1.0.3/plugin.xml b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/bundleAndPluginManifests_1.0.3/plugin.xml
deleted file mode 100644
index 6b59ddb..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/bundleAndPluginManifests_1.0.3/plugin.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.bundleAndPluginManifests" version="1.0.3" vendor-name="Eclipse.org">
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/bundleManifest_1.0.1/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/bundleManifest_1.0.1/META-INF/MANIFEST.MF
deleted file mode 100644
index 656e680..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/bundleManifest_1.0.1/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Generated-from: 1077062603708
-Bundle-Name: Test
-Bundle-Version: 1.0.1
-Bundle-SymbolicName: org.eclipse.update.core.tests.bundleManifest; singleton=true
-Bundle-Vendor: Eclipse.org
-Bundle-ClassPath: plugin.jar
-Legacy: true
-Bundle-Activator: org.eclipse.update.core.tests.bundleManifest.Activator
-Require-Bundle: 
- org.eclipse.core.runtime,
- org.eclipse.ui
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/plugin.xml b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/plugin.xml
deleted file mode 100644
index 7f81c46..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin2" version="5.0.0" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/src.jar b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/plugin.xml b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/plugin.xml
deleted file mode 100644
index efb3c26..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin2" version="5.0.1" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/src.jar b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/notBundleManifest_1.0.2/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/notBundleManifest_1.0.2/META-INF/MANIFEST.MF
deleted file mode 100644
index 866fb0f..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/notBundleManifest_1.0.2/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Generated-from: 1077062603708
-Bundle-Name: Not Valid Bundle Manifest
-Bundle-Version: 1.0.2
-Bundle-Vendor: Eclipse.org
-Bundle-ClassPath: plugin.jar
-Require-Bundle: 
- org.eclipse.core.runtime,
- org.eclipse.ui
diff --git a/update/org.eclipse.update.tests.core/data/testAPI/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/testAPI/features/feature3/feature.xml
deleted file mode 100644
index f878d60..0000000
--- a/update/org.eclipse.update.tests.core/data/testAPI/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" nl="us" os="WIN32,LINUX" version="1.1.1"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/testAPI/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/testAPI/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index e01846c..0000000
--- a/update/org.eclipse.update.tests.core/data/testAPI/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/testAPI/plugins/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/testAPI/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/testAPI/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/testAPI/site.xml b/update/org.eclipse.update.tests.core/data/testAPI/site.xml
deleted file mode 100644
index 4c15d43..0000000
--- a/update/org.eclipse.update.tests.core/data/testAPI/site.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="features/feature3">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="http://www.eclipse.org/feature2">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <feature url="http://www.eclipse.org/feature1">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <archive path="plugins/org.eclipse.update.plugin1_1.1.1.jar" url="plugins/org.eclipse.update.plugin1_1.1.1"/>    
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>
-  <category-def label="Eclipse Tools" name="eclipse"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/validation/site2/.eclipseproduct b/update/org.eclipse.update.tests.core/data/validation/site2/.eclipseproduct
deleted file mode 100644
index 8b829aa..0000000
--- a/update/org.eclipse.update.tests.core/data/validation/site2/.eclipseproduct
+++ /dev/null
@@ -1,3 +0,0 @@
-id=another.product.id
-name=Name of the product
-ver=1.2.4
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/validation/site3/.eclipseextension b/update/org.eclipse.update.tests.core/data/validation/site3/.eclipseextension
deleted file mode 100644
index 6d72df7..0000000
--- a/update/org.eclipse.update.tests.core/data/validation/site3/.eclipseextension
+++ /dev/null
@@ -1 +0,0 @@
-id=id.of.extended.product
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/validation/site4/eclipse/.eclipseextension b/update/org.eclipse.update.tests.core/data/validation/site4/eclipse/.eclipseextension
deleted file mode 100644
index acc84e9..0000000
--- a/update/org.eclipse.update.tests.core/data/validation/site4/eclipse/.eclipseextension
+++ /dev/null
@@ -1 +0,0 @@
-id=different.product.id
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/validation/site5/.eclipseUM b/update/org.eclipse.update.tests.core/data/validation/site5/.eclipseUM
deleted file mode 100644
index 196c522..0000000
--- a/update/org.eclipse.update.tests.core/data/validation/site5/.eclipseUM
+++ /dev/null
@@ -1,3 +0,0 @@
-id=org.eclipse.platform
-name=a Product 
-version=3.5.6
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/validation/site5/eclipse/.eclipseextension b/update/org.eclipse.update.tests.core/data/validation/site5/eclipse/.eclipseextension
deleted file mode 100644
index fff40a3..0000000
--- a/update/org.eclipse.update.tests.core/data/validation/site5/eclipse/.eclipseextension
+++ /dev/null
@@ -1,3 +0,0 @@
-id=org.eclipse.platform
-name=Eclipse Platform
-version=3.1.0
diff --git a/update/org.eclipse.update.tests.core/data/validation/site6/.eclipseUM b/update/org.eclipse.update.tests.core/data/validation/site6/.eclipseUM
deleted file mode 100644
index 597f9f8..0000000
--- a/update/org.eclipse.update.tests.core/data/validation/site6/.eclipseUM
+++ /dev/null
@@ -1 +0,0 @@
-id=org.eclipse.sdk
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/validation/site6/children/children/eclipse/.eclipseextension b/update/org.eclipse.update.tests.core/data/validation/site6/children/children/eclipse/.eclipseextension
deleted file mode 100644
index 597f9f8..0000000
--- a/update/org.eclipse.update.tests.core/data/validation/site6/children/children/eclipse/.eclipseextension
+++ /dev/null
@@ -1 +0,0 @@
-id=org.eclipse.sdk
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse.test.feature_1.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse.test.feature_1.0.0/feature.xml
deleted file mode 100644
index 1511800..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse.test.feature_1.0.0/feature.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.test1.ident1" label="Feature One" nl="en_us,fr,de" os="OS_WIN32,OS_LINUX" provider-name="Object Technology International" version="1.0.0" ws="WS_WIN32,WS_MOTIF,WS_GTK">
-  <description>Test feature for testIdentifier test</description>
-  <copyright>Copyright (c) the company</copyright>
-  <license>Do you accept the license ?</license>
-  <url>
-    <update label="URL to update teh feature" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.core.tests.feature1.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="3.5.6" ws="WS_WIN32"/>
-  <plugin download-size="1200" id="org.eclipse.update.core.tests.feature1.plugin2" install-size="978" fragment="false" version="5.0.0"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse_test_feature/feature.xml b/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse_test_feature/feature.xml
deleted file mode 100644
index 9f05cda..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse_test_feature/feature.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.test1.ident2" label="Feature One" nl="en_us,fr,de" os="OS_WIN32,OS_LINUX" provider-name="Object Technology International" version="1.0.0" ws="WS_WIN32,WS_MOTIF,WS_GTK">
-  <description>Test feature for testIdentifier test</description>
-  <copyright>Copyright (c) the company</copyright>
-  <license>Do you accept the license ?</license>
-  <url>
-    <update label="URL to update teh feature" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" url="org.eclipse.update.core.tests.feature1.plugin1" id="org.eclipse.update.core.tests.feature1.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="3.5.6" ws="WS_WIN32"/>
-  <plugin download-size="1200" id="org.eclipse.update.core.tests.feature1.plugin2" install-size="978" fragment="false" version="5.0.0"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature.xml
deleted file mode 100644
index c4ee139..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature1" image="feature1.gif" label="Feature One" nl="en,fr,de" os="OS_WIN32,OS_LINUX" provider-name="Object Technology International" version="1.0.4" ws="WS_WIN32,WS_MOTIF,WS_GTK">
-  <description>I believe this is the description of feature 1, well, feature 1 is an exceptional feature that you should install right NOW on your machine... try it.</description>
-  <copyright>Ok, now, this is a very very complex Copyright  not prepared by a lawyer Copyright (c) the company</copyright>
-  <license>#1 Do you accept it #2 you do nto accept it ...Do you accpt it ?</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.core.tests.feature1.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="3.5.6" ws="WS_WIN32"/>
-  <plugin download-size="1200" id="org.eclipse.update.core.tests.feature1.plugin2" install-size="978" fragment="false" version="5.0.0"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature1.gif b/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature1.gif
deleted file mode 100644
index 03e30a2..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature1.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/xmls/site1/site.xml b/update/org.eclipse.update.tests.core/data/xmls/site1/site.xml
deleted file mode 100644
index 44823c0..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/site1/site.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site url="info" type="org.eclipse.update.core.file">
-  <feature id="org.isv.feature3" url="www.eclipse.org/feature3" version="3.4.5">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature id="org.eclipse.update.core.tests.feature2" url="www.eclipse.org/feature2" version="3.4.6">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <feature id="org.eclipse.update.core.tests.fature1" url="www.eclipse.org/feature1" version="2.3.5">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <archive path="org.eclipse.update.plugin1" url="www.eclipse.org/pluign1"/>
-  <archive path="org.eclipse.update.archive2" url="www.eclipse.org/plugin2"/>
-  <archive path="org.eclipse.update.plugin3" url="www.eclipse.org/plugin3"/>
-  <archive path="org.eclipse.unknown.plugin" url="www.eclipse.org/plugins/plugin4"/>
-  <archive path="org.eclipse.update.core.tests.feature1.foo1" url="www.eclipse.org/plugin1"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>
-  <category-def label="Eclipse tools" name="eclipse"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/plugin.properties b/update/org.eclipse.update.tests.core/plugin.properties
deleted file mode 100644
index 1caa664..0000000
--- a/update/org.eclipse.update.tests.core/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-name = Install/Update Core Tests
-provider-name = Eclipse.org
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/plugin.xml b/update/org.eclipse.update.tests.core/plugin.xml
deleted file mode 100644
index 083a090..0000000
--- a/update/org.eclipse.update.tests.core/plugin.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.update.tests.core"
-   name="%name"
-   version="3.0.0"
-   provider-name="%provider-name"
-   class="org.eclipse.update.tests.UpdateTestsPlugin">
-
-   <runtime>
-      <library name="updatetests.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.junit"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.update.core"/>
-      <import plugin="org.eclipse.tomcat"/>
-      <import plugin="org.eclipse.help.appserver"/>
-      <import plugin="org.eclipse.update.configurator"/>
-      <import plugin="org.eclipse.test.performance"/>
-   </requires>
-
-
-   <extension
-         id="feature1"
-         point="org.eclipse.update.core.featureTypes">
-      <feature-factory
-            class="org.eclipse.update.internal.core.FeatureExecutableFactory">
-      </feature-factory>
-   </extension>
-   <extension
-         id="ftp"
-         point="org.eclipse.update.core.siteTypes">
-      <site-factory
-            class="org.eclipse.update.tests.implementation.SiteFTPFactory">
-      </site-factory>
-   </extension>
-
-</plugin>
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/AllTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/AllTests.java
deleted file mode 100644
index d215b5d..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/AllTests.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.eclipse.update.tests.api.AllAPITests;
-import org.eclipse.update.tests.branding.*;
-//import org.eclipse.update.tests.configurations.AllConfigurationsTests;
-import org.eclipse.update.tests.core.boot.AllPlatformConfigurationTests;
-import org.eclipse.update.tests.mirror.*;
-import org.eclipse.update.tests.model.AllModelTests;
-import org.eclipse.update.tests.nestedfeatures.AllNestedTests;
-import org.eclipse.update.tests.parser.AllParserTests;
-//import org.eclipse.update.tests.perfms.*;
-import org.eclipse.update.tests.reconciliation.AllReconciliationTests;
-import org.eclipse.update.tests.regularInstall.AllRegularInstallTests;
-//import org.eclipse.update.tests.regularRemove.AllRegularRemoveTests;
-import org.eclipse.update.tests.sitevalidation.AllSiteValidationTests;
-//import org.eclipse.update.tests.standalone.*;
-import org.eclipse.update.tests.types.AllTypesTests;
-import org.eclipse.update.tests.uivalues.AllCoreUITests;
-
-public class AllTests extends TestSuite {
-	public AllTests(String name) {
-		super(name);
-	}
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("All Update Manager Tests");
-		suite.addTest(AllMirrorTests.suite());	
-		suite.addTest(AllSiteValidationTests.suite());
-		suite.addTest(AllPlatformConfigurationTests.suite());
-		suite.addTest(AllRegularInstallTests.suite());
-		suite.addTest(AllAPITests.suite());
-		suite.addTest(AllParserTests.suite());
-		suite.addTest(AllCoreUITests.suite());
-//		suite.addTest(AllConfigurationsTests.suite());
-		suite.addTest(AllTypesTests.suite());
-//		suite.addTest(AllRegularRemoveTests.suite());
-		suite.addTest(AllNestedTests.suite());	
-		suite.addTest(AllReconciliationTests.suite());					
-		suite.addTest(AllModelTests.suite());
-		suite.addTest(AllBrandingTests.suite());
-		//suite.addTest(AllStandaloneTests.suite());
-		//suite.addTest(AllPerformanceTests.suite());
-		return suite;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateManagerTestCase.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateManagerTestCase.java
deleted file mode 100644
index a388b2d..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateManagerTestCase.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests;
-
-
-import java.io.File;
-import java.io.IOException;
-import java.net.*;
-import java.util.*;
-
-import junit.framework.TestCase;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.update.configuration.IConfiguredSite;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.IFeature;
-import org.eclipse.update.core.IPluginEntry;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-/**
- * All Help System Test cases must subclass this base Testcase.
- * See SampleTestCase.java for a template.
- */
-
-public abstract class UpdateManagerTestCase extends TestCase {
-
-	protected static ResourceBundle bundle;
-	protected static String dataPath;
-
-	protected static URL SOURCE_FILE_SITE;
-	protected static URL SOURCE_FILE_SITE_INSTALLED;
-	protected static URL SOURCE_HTTP_SITE;
-	protected static URL TARGET_FILE_SITE;
-
-	private static final String DATA_PATH = "data/";
-
-	/**
-	 * Default Constructor
-	 */
-	public UpdateManagerTestCase(String name) {
-		super(name);
-		try {
-			init();
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-	}
-
-	protected static void init() throws MissingResourceException, IOException, MalformedURLException {
-
-		IPluginDescriptor dataDesc = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.update.tests.core");
-		URL resolvedURL = Platform.asLocalURL(Platform.resolve(dataDesc.getInstallURL()));
-		URL dataURL = new URL(resolvedURL, DATA_PATH);
-		dataPath = dataURL.getFile();
-		String homePath = (System.getProperty("java.io.tmpdir")).replace(File.separatorChar, '/');
-
-		if (bundle == null) {
-			ClassLoader l = new URLClassLoader(new URL[] { dataURL }, null);
-			bundle = ResourceBundle.getBundle("resources", Locale.getDefault(), l);
-		}
-
-		try {
-			SOURCE_FILE_SITE = new File(dataPath).toURL();
-			SOURCE_FILE_SITE_INSTALLED = new File(dataPath + "testAPI/").toURL();
-			SOURCE_HTTP_SITE = new URL("http", getHttpHost(), getHttpPort(), bundle.getString("HTTP_PATH_1"));
-			TARGET_FILE_SITE = new URL("file", null, homePath + "/target/");
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-
-		//cleanup target 
-		File target = new File(homePath + "/target/");
-		UpdateManagerUtils.removeFromFileSystem(target);
-		// cleanup info about just installed plugins
-		InstallRegistry.cleanup();
-		
-		// setup cache site to false. 
-		// Note: the standalone tests will set it back to true
-		InternalSiteManager.globalUseCache = false;
-	}
-
-	/**
-	 * Simple implementation of setUp. Subclasses are prevented 
-	 * from overriding this method to maintain logging consistency.
-	 * umSetUp() should be overriden instead.
-	 */
-	protected final void setUp() throws Exception {
-		System.out.println("----- " + this.getName());
-		System.out.println(this.getName() + ": setUp...");
-		umSetUp();
-	}
-
-	/**
-	 * Sets up the fixture, for example, open a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected void umSetUp() throws Exception {
-		// do nothing.
-	}
-
-	/**
-	 * Simple implementation of tearDown.  Subclasses are prevented 
-	 * from overriding this method to maintain logging consistency.
-	 * umTearDown() should be overriden instead.
-	 */
-	protected final void tearDown() throws Exception {
-		System.out.println(this.getName() + ": tearDown...\n");
-		umTearDown();
-	}
-
-	/**
-	 * Tears down the fixture, for example, close a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected void umTearDown() throws Exception {
-		// do nothing.
-	}
-
-	protected static String getHttpHost() {
-		return UpdateTestsPlugin.getWebAppServerHost();
-	}
-
-	protected static int getHttpPort() {
-		return UpdateTestsPlugin.getWebAppServerPort();
-	}
-
-	protected void remove(IFeature feature, IConfiguredSite configSite) throws CoreException {
-		ISite site = configSite.getSite();
-		remove(feature, site);
-	}
-
-	protected void remove(IFeature feature, ISite site) throws CoreException {
-		site.getFeatureReference(feature);
-		// remove the plugins and features dir
-		String sitePath = site.getURL().getFile();
-		File file = null;
-
-		String featureName = feature.getVersionedIdentifier().getIdentifier().toString() + "_" + feature.getVersionedIdentifier().getVersion().toString();
-		file = new File(sitePath, "features" + File.separator + featureName);
-		System.out.println("****************************************Removing :" + file);
-		UpdateManagerUtils.removeFromFileSystem(file);
-
-		IPluginEntry[] entries = feature.getPluginEntries();
-		for (int i = 0; i < entries.length; i++) {
-			String name = entries[i].getVersionedIdentifier().getIdentifier().toString() + "_" + entries[i].getVersionedIdentifier().getVersion().toString() + File.separator;
-			file = new File(sitePath, "plugins" + File.separator + name);
-			System.out.println("****************************************Removing :" + file);
-			UpdateManagerUtils.removeFromFileSystem(file);
-			InstallRegistry.unregisterPlugin(entries[i]);
-		}
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateTestsPlugin.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateTestsPlugin.java
deleted file mode 100644
index 1843ffd..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateTestsPlugin.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests;
-import org.eclipse.core.runtime.*;
-import org.eclipse.help.internal.appserver.WebappManager;
-import org.eclipse.update.internal.core.UpdateCore;
-import org.osgi.framework.*;
-
-/**
- * manages the startuo and shutown of the 
- * web server
- */
-public class UpdateTestsPlugin extends Plugin {
-
-	private static String appServerHost = null;
-	private static int appServerPort = 0;
-	private static UpdateTestsPlugin plugin;
-	private static BundleContext bundleContext;
-	private static boolean initialized=false;
-
-	public static UpdateTestsPlugin getPlugin() {
-		return plugin;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-		bundleContext = context;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		WebappManager.stop("org.eclipse.update.tests.core.updatetests");
-		plugin = null;
-		bundleContext = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the host identifier for the web app server
-	 */
-	public static String getWebAppServerHost() {
-		if (!initialized) initialize();
-		return appServerHost;
-	}
-
-	/**
-	 * Returns the port identifier for the web app server
-	 */
-	public static int getWebAppServerPort() {
-		if (!initialized) initialize();		
-		return appServerPort;
-	}
-	/**
-	 * Method initialize.
-	 */
-	private static void initialize() {
-		String text = null;
-		try {
-			WebappManager.start("org.eclipse.update.tests.core.updatetests", "org.eclipse.update.tests.core", new Path("webserver"));
-			appServerHost = WebappManager.getHost();
-			appServerPort = WebappManager.getPort();
-
-			text = "The webServer did start ip:" + appServerHost + ":" + appServerPort;
-		} catch (CoreException e) {
-			text = "The webServer didn't start ";
-			IStatus status = new Status(IStatus.ERROR, "org.eclipse.update.tests.core", IStatus.OK, "WebServer not started. Update Tests results are invalid", null);
-			UpdateCore.warn("",new CoreException(status));
-		}finally {
-			System.out.println(text);
-			initialized = true;
-		}
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/AllAPITests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/AllAPITests.java
deleted file mode 100644
index ab96b39..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/AllAPITests.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-/**
- * Manages the API tests
- */
-public class AllAPITests extends UpdateManagerTestCase {
-	/**
-	 * Constructor
-	 */
-	public AllAPITests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * List of API tests
-	 */
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("API Tests");
-
-		suite.addTest(new TestSuite(TestSiteAPI.class));
-		suite.addTest(new TestSuite(TestLocalSiteAPI.class));		
-		suite.addTest(new TestSuite(TestUpdateManagerUtilsAPI.class));		
-		suite.addTest(new TestSuite(TestDefaultExecutableFeatureAPI.class));
-		suite.addTest(new TestSuite(TestDefaultPackageFeatureAPI.class));
-		suite.addTest(new TestSuite(TestPluginContainerAPI.class));
-		suite.addTest(new TestSuite(TestSiteManagerAPI.class));		
-		suite.addTest(new TestSuite(TestNestedFeatureAPI.class));
-		suite.addTest(new TestSuite(TestFeatureContentProvider_FileFilterAPI.class));
-		return suite;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/DefaultFeature.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/DefaultFeature.java
deleted file mode 100644
index 3456bb3..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/DefaultFeature.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.internal.core.FeatureExecutableContentProvider;
-/**
- * Abstract Class that implements most of the behavior of a feature
- * A feature ALWAYS belongs to an ISite
- */
-public class DefaultFeature extends Feature {
-
-
-	/**
-	 * Copy constructor
-	 */
-	public DefaultFeature(IFeature sourceFeature, ISite targetSite) throws CoreException {
-		this(targetSite);
-		this.setFeatureContentProvider(sourceFeature.getFeatureContentProvider());
-		this.setIdentifier(sourceFeature.getVersionedIdentifier());
-		this.setLabel(sourceFeature.getLabel());
-		this.setUpdateSiteEntry(sourceFeature.getUpdateSiteEntry());
-		this.setDiscoverySiteEntries(sourceFeature.getDiscoverySiteEntries());
-		this.setProvider(sourceFeature.getProvider());
-		this.setDescription(sourceFeature.getDescription());
-		this.setCopyright(sourceFeature.getCopyright());
-		this.setLicense(sourceFeature.getLicense());
-		this.setPluginEntries(sourceFeature.getPluginEntries());
-		this.setImage(sourceFeature.getImage());
-	}
-	
-	/**
-	 * Constructor
-	 */
-	public DefaultFeature(ISite targetSite) throws CoreException {
-		super();
-		this.setSite(targetSite);		
-	}	
-	
-	
-	/**
-	 * Sets the identifier
-	 * @param identifier The identifier to set
-	 */
-	public void setIdentifier(VersionedIdentifier identifier) {
-		setFeatureIdentifier(identifier.getIdentifier());
-		setFeatureVersion(identifier.getVersion().toString());
-	}
-
-	/**
-	 * Sets the discoverySiteEntries
-	 * @param discoveryInfos The discoveryInfos to set
-	 */
-	public void setDiscoverySiteEntries(IURLEntry[] discoveryInfos) {
-		setDiscoverySiteEntryModels((URLEntryModel[]) discoveryInfos);
-	}
-
-	/**
-	 * Sets the updateSiteEntry
-	 * @param updateInfo The updateInfo to set
-	 */
-	public void setUpdateSiteEntry(IURLEntry updateInfo) {
-		setUpdateSiteEntryModel((URLEntryModel) updateInfo);
-	}
-
-	/**
-	 * Adds a discoveryInfo
-	 * @param discoveryInfo The discoveryInfo to add
-	 */
-	public void addDiscoverySiteEntry(IURLEntry discoveryInfo) {
-		addDiscoverySiteEntryModel((URLEntryModel) discoveryInfo);
-	}
-
-	/**
-	 * Sets the description
-	 * @param description The description to set
-	 */
-	public void setDescription(IURLEntry description) {
-		setDescriptionModel((URLEntryModel) description);
-	}
-
-	/**
-	 * Sets the copyright
-	 * @param copyright The copyright to set
-	 */
-	public void setCopyright(IURLEntry copyright) {
-		setCopyrightModel((URLEntryModel) copyright);
-	}
-
-	/**
-	 * Sets the license
-	 * @param license The license to set
-	 */
-	public void setLicense(IURLEntry license) {
-		setLicenseModel((URLEntryModel) license);
-	}
-
-	/**
-	 * Sets the image
-	 * @param image The image to set
-	 */
-	public void setImage(URL image) {
-		if (image==null) return;
-		setImageURLString(image.toExternalForm());
-	}
-
-	/**
-	 * Adds an import
-	 * @param anImport The import to add
-	 */
-	public void addImport(IImport anImport) {
-		if (anImport != null) {
-			addImportModel((ImportModel) anImport);
-		}
-	}
-
-
-	/**
-	 * Sets the pluginEntries
-	 * @param pluginEntries The pluginEntries to set
-	 */
-	public void setPluginEntries(IPluginEntry[] pluginEntries) {
-		if (pluginEntries != null) {
-			for (int i = 0; i < pluginEntries.length; i++) {
-				addPluginEntry(pluginEntries[i]);
-			}
-		}
-	}
-
-
-	/**
-	 * sets teh URL isf not already present
-	 */
-	public void setURL(URL url) throws CoreException{
-		//if (getFeatureContentProvider()==null){
-			FeatureContentProvider contentProvider = new FeatureExecutableContentProvider(url);
-			this.setFeatureContentProvider(contentProvider);
-			contentProvider.setFeature(this);
-		//}
-	}
-	
-	
-	/*
-	 * @see IPluginContainer#addPluginEntry(IPluginEntry)
-	 */
-	public void addPluginEntry(IPluginEntry pluginEntry) {
-		if (pluginEntry != null) {
-			addPluginEntryModel((PluginEntryModel) pluginEntry);
-		}
-	}
-
-	/*
-	 * @see IFeature#addNonPluginEntry(INonPluginEntry)
-	 */
-	public void addNonPluginEntry(INonPluginEntry dataEntry) {
-		if (dataEntry != null) {
-			addNonPluginEntryModel((NonPluginEntryModel) dataEntry);
-		}
-	}	
-
-	}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/MyURLEntry.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/MyURLEntry.java
deleted file mode 100644
index 5944db4..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/MyURLEntry.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.update.core.URLEntry;
-
-/**
- * Wrapper around URLEntry
- */
-public class MyURLEntry extends URLEntry {
-	
-	public MyURLEntry(String annotation, URL url) throws MalformedURLException {
-		super();
-		setAnnotation(annotation);
-		if (url!=null) {
-			setURLString(url.toExternalForm());
-			resolve(null,null);
-		}
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultExecutableFeatureAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultExecutableFeatureAPI.java
deleted file mode 100644
index 7886db4..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultExecutableFeatureAPI.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-
-public class TestDefaultExecutableFeatureAPI extends UpdateManagerTestCase {
-	
-	private DefaultFeature remoteFeature=null;
-	
-	/**
-	 * Test the testFeatures()
-	 */
-	public TestDefaultExecutableFeatureAPI(String arg0) {
-		super(arg0);
-	}
-	
-	/**
-	 * the feature to test
-	 */
-	private DefaultFeature getFeature() throws MalformedURLException, CoreException {
-		if (remoteFeature == null){
-
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE, null);
-		URL url = UpdateManagerUtils.getURL(site.getURL(),"testAPI/"+Site.DEFAULT_INSTALLED_FEATURE_PATH+"feature3/",null);
-		SiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(site);
-		ref.setURL(url);
-		IFeature feature = ref.getFeature(null);
-		remoteFeature = new DefaultFeature(feature,site);
-
-		}
-		return remoteFeature;
-	}
-
-	public void testIdentifier() throws CoreException, MalformedURLException {
-		String id1 = "xmls/apitests/org.eclipse.test.feature_1.0.0/";
-		String id2 = "xmls/apitests/org.eclipse_test_feature";
-		VersionedIdentifier ident1 = new VersionedIdentifier("org.test1.ident1","1.0.0");
-		VersionedIdentifier ident2 = new VersionedIdentifier("org.test1.ident2","1.0.0");		
-		
-
-			ISite site = SiteManager.getSite(SOURCE_FILE_SITE,null);
-			
-			URL url1 = UpdateManagerUtils.getURL(site.getURL(),id1,null);			
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(url1);
-			remoteFeature.setIdentifier(ident1);
-			assertEquals(ident1.toString(),remoteFeature.getVersionedIdentifier().toString());
-	 	
-			 URL url2 = UpdateManagerUtils.getURL(site.getURL(),id2,null);		
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(url2);
-			remoteFeature.setIdentifier(ident2);
-			assertEquals(ident2.toString(),remoteFeature.getVersionedIdentifier().toString());
-		
-
-	}
-
-
-
-	public void testSite() throws MalformedURLException, CoreException{
-		String ident1 = Site.DEFAULT_INSTALLED_FEATURE_PATH+"feature3/";		
-
-			ISite site = SiteManager.getSite(SOURCE_FILE_SITE,null);
-			
-			URL id = UpdateManagerUtils.getURL(site.getURL(),ident1,null);			
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(id);
-			assertEquals(site,remoteFeature.getSite());
-
-	}
-
-
-	public void testLabel() throws CoreException,MalformedURLException {
-		String label = "dummy label";
-		Feature feature = getFeature();
-		feature.setLabel(label);
-		assertEquals(label,feature.getLabel());
-	}
-
-
-	public void testUpdateURL() throws CoreException,MalformedURLException {
-		URL url = null;
-		String label = "OTI Site";
-		try {
-			url = new URL("http://www.oti.com/");
-			
-		} catch (java.net.MalformedURLException e){} // impossible eh !
-		DefaultFeature feature = getFeature();
-		feature.setUpdateSiteEntry(new MyURLEntry(label, url));
-		assertEquals(url,feature.getUpdateSiteEntry().getURL());
-		assertEquals(label,feature.getUpdateSiteEntry().getAnnotation());
-
-	} 
-
-
-	
-	public void testDiscoveryURLs() throws CoreException,MalformedURLException {
-		IURLEntry[] urlInfo = new MyURLEntry[2];
-		URL[] url = new URL[2];
-		String[] label = new String[2];
-		try {
-			url[0] = new URL("http://www.oti.com/");
-			url[1] = new URL("http://eclipse.org/");
-			label[0] = "OTI Site";
-			label[1] = "Eclipse Site";
-		} catch (java.net.MalformedURLException e){} // impossible eh !
-		DefaultFeature feature = getFeature();
-		for (int i=0;i<2;i++){
-				urlInfo[i] = new MyURLEntry(label[i],url[i]);
-		}
-		feature.setDiscoverySiteEntries(urlInfo);
-		for (int i=0; i<feature.getDiscoverySiteEntries().length;i++){
-			assertEquals(urlInfo[i],feature.getDiscoverySiteEntries()[i]);
-		}
-
-	}
-
-
-	public void testProvider() throws CoreException,MalformedURLException {
-		String provider = "not so dummy provider";
-		IFeature feature = getFeature();
-		((Feature)feature).setProvider(provider);
-		assertEquals(provider,feature.getProvider());
-	}
-
-
-
-	public void testDescription() throws CoreException,MalformedURLException {
-		String desc = "pretty long description as a string with \r\n and \t and \n";
-		IURLEntry info = new MyURLEntry(desc,null);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(desc,feature.getDescription().getAnnotation());
-	}
-	
-
-	public void testDescription1() throws CoreException, MalformedURLException {
-		URL url = null;
-		try {
-			url = new URL("http://www.oti.com");
-		} catch (MalformedURLException e){/*pretty impossible*/}
-		IURLEntry info = new MyURLEntry(null,url);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(url,feature.getDescription().getURL());
-	}	
-	
-
-	public void testDescription2() throws CoreException, MalformedURLException {
-		
- 	 URL url = null;
-		try {
-			url = new URL("http://www.oti.com");
-		} catch (MalformedURLException e){/*pretty impossible*/}
-		String desc = "pretty long description as a string with \r\n and \t and \n";
-		IURLEntry info = new MyURLEntry(desc,url);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		String result = feature.getDescription().getAnnotation();
-		assertEquals(desc,result);
-		assertEquals(url,feature.getDescription().getURL());
-	}	
-
-
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultPackageFeatureAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultPackageFeatureAPI.java
deleted file mode 100644
index f1f757d..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultPackageFeatureAPI.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-
-public class TestDefaultPackageFeatureAPI extends UpdateManagerTestCase {
-	
-	private	DefaultFeature remoteFeature=null;
-	
-	/**
-	 * Test the testFeatures()
-	 */
-	public TestDefaultPackageFeatureAPI(String arg0) {
-		super(arg0);
-	}
-	
-	/**
-	 * the feature to test
-	 */
-	private DefaultFeature getFeature() throws MalformedURLException, CoreException {
-		if (remoteFeature == null){
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE, null);
-		URL id = UpdateManagerUtils.getURL(site.getURL(),"org.eclipse.update.core.feature1_1.0.0.jar",null);	
-		remoteFeature = new DefaultFeature(site);
-		remoteFeature.setURL(id);
-		}
-		return remoteFeature;
-	}
-
-	public void testIdentifier() throws CoreException, MalformedURLException {
-		
-		String id1 = "features/org.eclipse.test.feature_1.0.0.jar";
-		String id2 = "features/org.eclipse_test_feature.jar";
-		VersionedIdentifier ident1 = new VersionedIdentifier("org.test1.ident1","1.0.0");
-		VersionedIdentifier ident2 = new VersionedIdentifier("org.test1.ident2","1.0.0");		
-		
-
-			ISite site = SiteManager.getSite(SOURCE_FILE_SITE, null);
-			
-			URL url1 = UpdateManagerUtils.getURL(site.getURL(),id1,null);			
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(url1);
-			remoteFeature.setIdentifier(ident1);
-			assertEquals(ident1.toString(),remoteFeature.getVersionedIdentifier().toString());
-		
-			 URL url2 = UpdateManagerUtils.getURL(site.getURL(),id2,null);		
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(url2);
-			remoteFeature.setIdentifier(ident2);			
-			assertEquals(ident2.toString(),remoteFeature.getVersionedIdentifier().toString());
-	}
-
-
-	public void testSite() throws MalformedURLException, CoreException {
-		String ident1 = "org.eclipse.test.feature_1.0.0.jar";		
-
-			ISite site = SiteManager.getSite(SOURCE_FILE_SITE, null);
-			
-			URL id = UpdateManagerUtils.getURL(site.getURL(),ident1,null);		
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(id);	
-			assertEquals(site,remoteFeature.getSite());
-
-	}
-
-
-	public void testLabel() throws CoreException, MalformedURLException {
-		String label = "dummy label";
-		Feature feature = getFeature();
-		feature.setLabel(label);
-		assertEquals(label,feature.getLabel());
-	}
-
-	public void testUpdateURL() throws CoreException, MalformedURLException {
-		URL url = null;
-		String label = "OTI Site";
-		try {
-			url = new URL("http://www.oti.com/");
-			
-		} catch (java.net.MalformedURLException e){} // impossible eh !
-		DefaultFeature feature = getFeature();
-		feature.setUpdateSiteEntry(new MyURLEntry(label, url));
-		assertEquals(url,feature.getUpdateSiteEntry().getURL());
-		assertEquals(label,feature.getUpdateSiteEntry().getAnnotation());
-
-	} 
-
-
-	
-	public void testDiscoveryURLs() throws CoreException, MalformedURLException {
-		IURLEntry[] urlInfo = new URLEntry[2];
-		URL[] url = new URL[2];
-		String[] label = new String[2];
-		try {
-			url[0] = new URL("http://www.oti.com/");
-			url[1] = new URL("http://eclipse.org/");
-			label[0] = "OTI Site";
-			label[1] = "Eclipse Site";
-		} catch (java.net.MalformedURLException e){} // impossible eh !
-		DefaultFeature feature = getFeature();
-		for (int i=0;i<2;i++){
-				urlInfo[i] = new MyURLEntry(label[i],url[i]);
-		}
-		feature.setDiscoverySiteEntries(urlInfo);
-		for (int i=0; i<feature.getDiscoverySiteEntries().length;i++){
-			assertEquals(urlInfo[i],feature.getDiscoverySiteEntries()[i]);
-		}
-
-
-	}
-
-
-	public void testProvider() throws CoreException, MalformedURLException {
-		String provider = "not so dummy provider";
-		Feature feature = getFeature();
-		feature.setProvider(provider);
-		assertEquals(provider,feature.getProvider());
-	}
-
-
-
-	public void testDescription() throws CoreException, MalformedURLException {
-		String desc = "pretty long description as a string with \r\n and \t and \n";
-		IURLEntry info = new MyURLEntry(desc,null);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(desc,feature.getDescription().getAnnotation());
-	}
-	
-
-	public void testDescription1() throws CoreException, MalformedURLException {
-		URL url = null;
-		try {
-			url = new URL("http://www.oti.com");
-		} catch (MalformedURLException e){/*pretty impossible*/}
-		IURLEntry info = new MyURLEntry(null,url);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(url,feature.getDescription().getURL());
-	}	
-	
-	public void testDescription2() throws CoreException, MalformedURLException {
-		
-		URL url = null;
-		try {
-			url = new URL("http://www.oti.com");
-		} catch (MalformedURLException e){/*pretty impossible*/}
-		String desc = "pretty long description as a string with \r\n and \t and \n";
-		IURLEntry info = new MyURLEntry(desc,url);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(desc,feature.getDescription().getAnnotation());
-		assertEquals(url,feature.getDescription().getURL());
-	}
-
-
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestFeatureContentProvider_FileFilterAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestFeatureContentProvider_FileFilterAPI.java
deleted file mode 100644
index 55deb03..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestFeatureContentProvider_FileFilterAPI.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import org.eclipse.update.core.FeatureContentProvider;
-import org.eclipse.update.internal.core.FeatureExecutableContentProvider;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-
-public class TestFeatureContentProvider_FileFilterAPI extends UpdateManagerTestCase {
-	
-	
-	/**
-	 * Test the testFeatures()
-	 */
-	public TestFeatureContentProvider_FileFilterAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testFileFilter(){
-		
-		String p1 = "/p1/p2/a.*";
-		String p2 = "p1/p2/b.*";
-		String p3 = "/p1/p2/a.txt";
-		String p4 = "/p1/p2/*.txt";
-		
-		String name1 = "/p1/p2/a.txt";
-		String name2 = "/p1/p2/b.txt";
-		String name3 = "/p3/p2/a.txt";
-		String name4 = "p1/p2/a.txt";
-		String name5 = "/p1/p2/b.txt";
-		String name6 = "/p1/p2/c.txt";
-		String name7 = "/p1/p2/p3/a.txt";
-		
-		
-		FeatureContentProvider cp = new FeatureExecutableContentProvider(null);
-		
-		FeatureContentProvider.FileFilter filter1 = cp.new FileFilter(p1);
-		FeatureContentProvider.FileFilter filter2 = cp.new FileFilter(p2);
-		FeatureContentProvider.FileFilter filter3 = cp.new FileFilter(p3);
-		FeatureContentProvider.FileFilter filter4 = cp.new FileFilter(p4);
-
-		assertTrue("1.1",filter1.accept(name1));		
-		assertTrue("1.2",!filter1.accept(name2));		
-		assertTrue("1.3",!filter1.accept(name3));	
-		assertTrue("1.4",!filter1.accept(name4));		
-		assertTrue("1.5",!filter1.accept(name5));		
-		assertTrue("1.6",!filter1.accept(name6));		
-		assertTrue("1.7",!filter1.accept(name7));
-	
-		assertTrue("2.1",!filter2.accept(name1));		
-		assertTrue("2.2",!filter2.accept(name2));		
-		assertTrue("2.3",!filter2.accept(name3));	
-		assertTrue("2.4",!filter2.accept(name4));		
-		assertTrue("2.5",!filter2.accept(name5));		
-		assertTrue("2.6",!filter2.accept(name6));		
-		assertTrue("2.7",!filter2.accept(name7));
-
-		assertTrue("3.1",filter3.accept(name1));		
-		assertTrue("3.2",!filter3.accept(name2));		
-		assertTrue("3.3",!filter3.accept(name3));	
-		assertTrue("3.4",!filter3.accept(name4));		
-		assertTrue("3.5",!filter3.accept(name5));		
-		assertTrue("3.6",!filter3.accept(name6));		
-		assertTrue("3.7",!filter3.accept(name7));
-		
-		assertTrue("4.1",filter4.accept(name1));		
-		assertTrue("4.2",filter4.accept(name2));		
-		assertTrue("4.3",!filter4.accept(name3));	
-		assertTrue("4.4",!filter4.accept(name4));		
-		assertTrue("4.5",filter4.accept(name5));		
-		assertTrue("4.6",filter4.accept(name6));		
-		assertTrue("4.7",!filter4.accept(name7));								
-					
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestLocalSiteAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestLocalSiteAPI.java
deleted file mode 100644
index ab49a5f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestLocalSiteAPI.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.CategoryModel;
-import org.eclipse.update.core.model.SiteModel;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestLocalSiteAPI extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestLocalSiteAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testFileParsing() throws Exception {
-
-		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE,"siteTestLocalSite/"), null);
-		IArchiveReference[] info = site.getArchives();
-		
-		if (info.length<=0){
-			fail("no plugins in site: "+site.getURL().toExternalForm());
-		}
-		 
-		boolean found1 = false;
-		boolean found2 = false;
-		String name1= "plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar";
-		String name2 = "plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar";
-		
-		for (int i =0; i<info.length; i++){
-			if (info[i].getPath().equals(name1)) found1 = true;
-			if (info[i].getPath().equals(name2)) found2 = true;
-		}
-		
-		if (!found1 || !found2){
-			fail("Cannot find plugin : org.eclipse.update.core.tests.feature1.plugin2 version 5.0.0 and 5.0.1 on the site, by parsing file system");
-		}
-		
-
-	}
-	
-	public void testBundleManifestParsing() throws Exception {
-
-		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE,"siteTestLocalSite/"),null);
-		IArchiveReference[] info = site.getArchives();
-		
-		if (info.length<=0){
-			fail("no plugins in site: "+site.getURL().toExternalForm());
-		}
-		 
-		boolean found1 = false;
-		boolean found2 = false;
-		boolean found3 = false;
-		String name1= "plugins/org.eclipse.update.core.tests.bundleManifest_1.0.1.jar";
-		String name2 = "plugins/org.eclipse.update.core.tests.bundleAndPluginManifestsBUNDLEPARSED_1.0.3.jar";
-		String name3 = "plugins/org.eclipse.update.core.tests.bundleAndPluginManifests_1.0.3.jar";
-		
-		for (int i =0; i<info.length; i++){
-			if (info[i].getPath().equals(name1)) found1 = true;
-			if (info[i].getPath().equals(name2)) found2 = true;
-			if (info[i].getPath().equals(name3)) found3 = true;
-		}
-		
-		if (!found1 || !found2){
-			fail("Cannot find plugin : org.eclipse.update.core.tests.feature1.plugin2 version 5.0.0 and 5.0.1 on the site, by parsing file system");
-		}
-		if (found3){
-			fail("Plugin manifest parsed instead of bundle manifest.");
-		}
-		
-
-	}
-	
-	
-	public void testCategories() throws Exception {
-
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE, null);
-		
-		ICategory category = new Category("category","Label of category");
-		
-		((SiteModel)site).addCategoryModel((CategoryModel)category);
-		
-		ICategory[] categories = site.getCategories();
-		boolean found = false;
-		for (int index = 0; index < categories.length; index++) {
-			ICategory element = categories[index];
-			if (element.getName().equals("category")) found = true;
-		}
-		if (!found) fail("cannot find category 'category' in site");
-
-		ISiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(site);
-		ref.addCategory(category);		
-		categories = ref.getCategories();
-		found = false;
-		for (int index = 0; index < categories.length; index++) {
-			ICategory element = categories[index];
-			if (element.getName().equals("category")) found = true;
-		}
-		if (!found) fail("cannot find category 'category' in feature");
-		
-			}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestNestedFeatureAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestNestedFeatureAPI.java
deleted file mode 100644
index 5cf3585..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestNestedFeatureAPI.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestNestedFeatureAPI extends UpdateManagerTestCase {
-
-	/**
-	 * Test the testFeatures()
-	 */
-	public TestNestedFeatureAPI(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 * the feature to test
-	 */
-	private IFeature getRootFeature() throws MalformedURLException, CoreException {
-		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE, "nestedFeatureSiteTest/site.xml"),null);
-		URL url = UpdateManagerUtils.getURL(site.getURL(), Site.DEFAULT_INSTALLED_FEATURE_PATH + "rootfeature.jar", null);
-		SiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(site);
-		ref.setURL(url);
-		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-		IFeature feature = ref.getFeature(null);
-		return feature;
-	}
-
-	/**
-	 * the feature to test
-	 */
-	private IFeature getChildFeature() throws MalformedURLException, CoreException {
-
-		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE, "nestedFeatureSiteTest/"), null);
-		URL url = UpdateManagerUtils.getURL(site.getURL(), Site.DEFAULT_INSTALLED_FEATURE_PATH + "org.eclipse.update.core.tests.childrenfeature_2.0.0.jar", null);
-		SiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(site);
-		ref.setURL(url);
-		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-		IFeature feature = ref.getFeature(null);
-		return feature;
-	}
-
-	/*
-	 * 
-	 */
-	public void testNested() throws Exception {
-
-		IFeature rootFeature = getRootFeature();
-		IFeatureReference[] ref = rootFeature.getIncludedFeatureReferences();
-		IFeature childFeature = getChildFeature();
-		assertEquals("Children feature are not equal", childFeature, ref[0].getFeature(null));
-	}
-
-	/**
-	 * the feature to test
-	 */
-	private IFeature getRootFeature2() throws MalformedURLException, CoreException {
-		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE, "nestedFeatureSiteTest2/site.xml"),null);
-		URL url = UpdateManagerUtils.getURL(site.getURL(), Site.DEFAULT_INSTALLED_FEATURE_PATH + "rootfeature.jar", null);
-		SiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(site);
-		ref.setURL(url);
-		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-		IFeature feature = ref.getFeature(null);
-		return feature;
-	}
-
-	/**
-	 * the feature to test
-	 */
-	private IFeature getChildFeature2() throws MalformedURLException, CoreException {
-
-		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE, "nestedFeatureSiteTest2/site.xml"),null);
-		URL url = UpdateManagerUtils.getURL(site.getURL(), Site.DEFAULT_INSTALLED_FEATURE_PATH + "childrenfeature.jar", null);
-		SiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(site);
-		ref.setURL(url);
-		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-		IFeature feature = ref.getFeature(null);
-		return feature;
-	}
-
-	/*
-	 * 
-	 */
-	public void testNested2() throws Exception {
-
-		IFeature rootFeature = getRootFeature2();
-		IFeatureReference[] ref = rootFeature.getIncludedFeatureReferences();
-		IFeature childFeature = getChildFeature2();
-		assertEquals("Children feature are not equal", childFeature, ref[0].getFeature(null));
-	}
-
-//	/**
-//	 * the feature to test
-//	 */
-//	private IFeature getRootFeature3() throws MalformedURLException, CoreException {
-//		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE, "nestedFeatureSiteTest3/site.xml"), null);
-//		URL url = UpdateManagerUtils.getURL(site.getURL(), Site.DEFAULT_INSTALLED_FEATURE_PATH + "rootfeature.jar", null);
-//		SiteFeatureReference ref = new SiteFeatureReference();
-//		ref.setSite(site);
-//		ref.setURL(url);
-//		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-//		IFeature feature = ref.getFeature(null);
-//		return feature;
-//	}
-
-//	/**
-//	 * the feature to test
-//	 */
-//	private IFeature getChildFeature3() throws MalformedURLException, CoreException {
-//
-//		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE, "nestedFeatureSiteTest3/site.xml"));
-//		URL url = UpdateManagerUtils.getURL(site.getURL(), Site.DEFAULT_INSTALLED_FEATURE_PATH + "childrenfeature.jar", null);
-//		SiteFeatureReference ref = new SiteFeatureReference();
-//		ref.setSite(site);
-//		ref.setURL(url);
-//		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-//		IFeature feature = ref.getFeature(null);
-//		return feature;
-//	}
-
-	/*
-	 * 
-	 */
-	/*	public void testNested3() throws Exception {
-	
-			IFeature rootFeature = getRootFeature3();
-			IFeatureReference[] ref = rootFeature.getIncludedFeatureReferences();
-			IFeature childFeature = getChildFeature3();
-			assertEquals(
-				"Children feature are not equal",
-				childFeature,
-				ref[0].getFeature());
-		}
-	*/
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestPluginContainerAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestPluginContainerAPI.java
deleted file mode 100644
index 37e56f3..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestPluginContainerAPI.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestPluginContainerAPI extends UpdateManagerTestCase {
-
-	private Site site;
-	private DefaultFeature feature;
-
-	/**
-	 * the Site to test
-	 */
-	private Site getSite() throws CoreException, MalformedURLException {
-		if (site == null) {
-
-			site = (Site)SiteManager.getSite(new URL(SOURCE_FILE_SITE,"testAPI/"), null);
-
-		}
-		return site;
-	}
-
-	/**
-	 * the feature to test
-	 */
-	private DefaultFeature getFeature() throws MalformedURLException, CoreException {
-		if (feature == null) {
-			ISite site = getSite();
-			URL id = UpdateManagerUtils.getURL(site.getURL(),"org.eclipse.update.core.feature1_1.0.0.jar",null);						
-			feature = new DefaultFeature(site);
-			feature.setURL(id);	
-		}
-		return feature;
-	}
-
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestPluginContainerAPI(String arg0) throws CoreException {
-		super(arg0);
-	}
-
-	public void testAbstractFeature() throws CoreException, MalformedURLException {
-		PluginEntry pluginEntry = new PluginEntry();
-		pluginEntry.setVersionedIdentifier(new VersionedIdentifier("id", "6"));
-		Feature _feature = getFeature();
-		((DefaultFeature)_feature).addPluginEntry(pluginEntry);
-		assertEquals(_feature.getPluginEntryCount(), 1);
-		assertEquals(_feature.getPluginEntries()[0], pluginEntry);
-
-	}
-
-	public void testAbstactSite() throws CoreException, MalformedURLException {
-		PluginEntry pluginEntry = new PluginEntry();
-		pluginEntry.setVersionedIdentifier(new VersionedIdentifier("id", "6"));
-		Site _site = getSite();
-		_site.addPluginEntry(pluginEntry);
-		assertEquals(_site.getPluginEntryCount(), 1);
-		assertEquals(_site.getPluginEntries()[0], pluginEntry);
-
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteAPI.java
deleted file mode 100644
index c2362d4..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteAPI.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.update.core.ISite;
-import org.eclipse.update.core.SiteManager;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestSiteAPI extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestSiteAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testURL() throws Exception {
-
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE, null);
-		assertEquals(new File(site.getURL().getFile()),new File(SOURCE_FILE_SITE.getFile()));
-		
-		ISite site2 = SiteManager.getSite(SOURCE_HTTP_SITE, null);
-		assertEquals(site2.getURL(),new URL("http", getHttpHost(),getHttpPort(), bundle.getString("HTTP_PATH_1")+"site.xml"));
-
-	}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteManagerAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteManagerAPI.java
deleted file mode 100644
index 428c465..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteManagerAPI.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestSiteManagerAPI extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestSiteManagerAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testFile() throws Exception {
-		ISite fileSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		String site = fileSite.getURL().toExternalForm();		
-		assertEquals(TARGET_FILE_SITE.toExternalForm(), site);
-	}
-	
-	public void testUnknown() throws Exception {
-		URL url = new URL("ftp://255.255.255.255/");
-		try {
-		SiteManager.getSite(url,null);
-		fail("Connected to ftp://255.255.255.255/, should not happen");
-		} catch (CoreException e){
-			// expected
-		} catch (IllegalArgumentException e){
-			// expected as the version of the WebDav HTTP Connection returns so
-		}
-	}
-	
-	public void testLocalSite() throws Exception {
-		
-		ILocalSite site = SiteManager.getLocalSite();
-		IConfiguredSite[] instSites = site.getCurrentConfiguration().getConfiguredSites();
-		assertTrue(instSites.length>0);
-		System.out.println("Local Site:"+instSites[0].getSite().getURL().toExternalForm());
-		
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE_INSTALLED,null);
-		IFeature remoteFeature = remoteSite.getFeatureReferences()[0].getFeature(null);
-		remove(remoteFeature,instSites[0].getSite());		
-		instSites[0].getSite().install(remoteFeature,null,null);
-		
-		IFeatureReference[] features = site.getCurrentConfiguration().getConfiguredSites()[0].getSite().getFeatureReferences();
-		assertTrue(features.length>0);
-
-		//cleanup
-		assertNotNull(remoteFeature);		
-		File file = new File(instSites[0].getSite().getURL().getFile()+File.separator+Site.DEFAULT_INSTALLED_FEATURE_PATH+remoteFeature.getVersionedIdentifier());
-		UpdateManagerUtils.removeFromFileSystem(file);
-		file = new File(instSites[0].getSite().getURL().getFile()+File.separator+Site.DEFAULT_PLUGIN_PATH+"org.eclipse.update.plugin1_1.1.1");
-		UpdateManagerUtils.removeFromFileSystem(file);		
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-
-	}
-	
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestUpdateManagerUtilsAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestUpdateManagerUtilsAPI.java
deleted file mode 100644
index d82488e..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestUpdateManagerUtilsAPI.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.api;
-import java.net.URL;
-
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestUpdateManagerUtilsAPI extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestUpdateManagerUtilsAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testgetURL() throws Exception {
-		URL url1 = new URL("http://www.eclipse.org");
-		URL url2 = new URL("file://c:/hello");
-		URL url3 = new URL("file:/home/eclipse/");
-		URL url4 = new URL("ftp:/host:8080/path/");
-		URL url5 = new URL("jar:file:/tmp/100100!/");
-		
-		String default1 = "default1/default";
-		String default2 = "/default2/";
-		
-		String str1 = "http://dev.eclipse.org";
-		String str2 = "relative1/path/";
-		String str3 = "/relative2/path";
-		
-		String result1=null;
-		String result2=null;
-		
-		//****************************************************************************************
-		// 1.0
-		result1 = UpdateManagerUtils.getURL(url1,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("1.0",result2,result1);
-		
-		// 1.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("1.1",result2,result1);
-		
-		// 1.2
-		 result1 = UpdateManagerUtils.getURL(url1,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("1.2",result2,result1);
-		
-		// 1.3
-		 result1 = UpdateManagerUtils.getURL(url1,str2,default1).toExternalForm();
-		 result2 = "http://www.eclipse.org/relative1/path/";
-		assertEquals("1.3",result2,result1);
-		
-		// 1.4
-		 result1 = UpdateManagerUtils.getURL(url1,str3,default1).toExternalForm();
-		 result2 = "http://www.eclipse.org/relative2/path";
-		assertEquals("1.4",result2,result1);
-		
-		// 1.5
-		 result1 = UpdateManagerUtils.getURL(url1,null,default1).toExternalForm();
-		 result2 = "http://www.eclipse.org/default1/default";
-		assertEquals("1.5",result2,result1);
-		
-		// 1.6
-		 result1 = UpdateManagerUtils.getURL(url1,null,default2).toExternalForm();
-		 result2 = "http://www.eclipse.org/default2/";
-		assertEquals("1.6",result2,result1);
-		
-		//****************************************************************************************
-		// 2.0
-		 result1 = UpdateManagerUtils.getURL(url2,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("2.0",result2,result1);
-		
-		// 2.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("2.1",result2,result1);
-		
-		// 2.2
-		 result1 = UpdateManagerUtils.getURL(url2,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("2.2",result2,result1);
-		
-		// 2.3
-		 result1 = UpdateManagerUtils.getURL(url2,str2,default1).toExternalForm();
-		 result2 = "file://c:/relative1/path/";
-		assertEquals("2.3",result2,result1);
-		
-		// 2.4
-		 result1 = UpdateManagerUtils.getURL(url2,str3,default1).toExternalForm();
-		 result2 = "file://c:/relative2/path";
-		assertEquals("2.4",result2,result1);
-		
-		// 2.5
-		 result1 = UpdateManagerUtils.getURL(url2,null,default1).toExternalForm();
-		 result2 = "file://c:/default1/default";
-		assertEquals("2.5",result2,result1);
-		
-		// 2.6
-		 result1 = UpdateManagerUtils.getURL(url2,null,default2).toExternalForm();
-		 result2 = "file://c:/default2/";
-		assertEquals("2.6",result2,result1);
-		
-
-		//****************************************************************************************
-		// 3.0
-		 result1 = UpdateManagerUtils.getURL(url3,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("3.0",result2,result1);
-		
-		// 3.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("3.1",result2,result1);
-		
-		// 3.2
-		 result1 = UpdateManagerUtils.getURL(url3,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("3.2",result2,result1);
-		
-		// 3.3
-		 result1 = UpdateManagerUtils.getURL(url3,str2,default1).toExternalForm();
-		 result2 = "file:/home/eclipse/relative1/path/";
-		assertEquals("3.3",result2,result1);
-		
-		// 3.4
-		 result1 = UpdateManagerUtils.getURL(url3,str3,default1).toExternalForm();
-		 result2 = "file:/home/eclipse/relative2/path";
-		assertEquals("3.4",result2,result1);
-		
-		// 3.5
-		 result1 = UpdateManagerUtils.getURL(url3,null,default1).toExternalForm();
-		 result2 = "file:/home/eclipse/default1/default";
-		assertEquals("3.5",result2,result1);
-		
-		// 3.6
-		 result1 = UpdateManagerUtils.getURL(url3,null,default2).toExternalForm();
-		 result2 = "file:/home/eclipse/default2/";
-		assertEquals("3.6",result2,result1);
-				
-		//****************************************************************************************
-		// 4.0
-		 result1 = UpdateManagerUtils.getURL(url4,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("4.0",result2,result1);
-		
-		// 4.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("4.1",result2,result1);
-		
-		// 4.2
-		 result1 = UpdateManagerUtils.getURL(url4,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("4.2",result2,result1);
-		
-		// 4.3
-		 result1 = UpdateManagerUtils.getURL(url4,str2,default1).toExternalForm();
-		 result2 = "ftp:/host:8080/path/relative1/path/";
-		assertEquals("4.3",result2,result1);
-		
-		// 4.4
-		 result1 = UpdateManagerUtils.getURL(url4,str3,default1).toExternalForm();
-		 result2 = "ftp:/host:8080/path/relative2/path";
-		assertEquals("4.4",result2,result1);
-		
-		// 4.5
-		 result1 = UpdateManagerUtils.getURL(url4,null,default1).toExternalForm();
-		 result2 = "ftp:/host:8080/path/default1/default";
-		assertEquals("4.5",result2,result1);
-		
-		// 4.6
-		 result1 = UpdateManagerUtils.getURL(url4,null,default2).toExternalForm();
-		 result2 = "ftp:/host:8080/path/default2/";
-		assertEquals("4.6",result2,result1);
-		
-		//****************************************************************************************
-		// 5.0
-		 result1 = UpdateManagerUtils.getURL(url5,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("5.0",result2,result1);
-		
-		// 5.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("5.1",result2,result1);
-		
-		// 5.2
-		 result1 = UpdateManagerUtils.getURL(url5,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("5.2",result2,result1);
-		
-		// 5.3
-		 result1 = UpdateManagerUtils.getURL(url5,str2,default1).toExternalForm();
-		 result2 = "jar:file:/tmp/100100!/relative1/path/";
-		assertEquals("5.3",result2,result1);
-		
-		// 5.4
-		 result1 = UpdateManagerUtils.getURL(url5,str3,default1).toExternalForm();
-		 result2 = "jar:file:/tmp/100100!/relative2/path";
-		assertEquals("5.4",result2,result1);
-		
-		// 5.5
-		 result1 = UpdateManagerUtils.getURL(url5,null,default1).toExternalForm();
-		 result2 = "jar:file:/tmp/100100!/default1/default";
-		assertEquals("5.5",result2,result1);
-		
-		// 5.6
-		 result1 = UpdateManagerUtils.getURL(url5,null,default2).toExternalForm();
-		 result2 = "jar:file:/tmp/100100!/default2/";
-		assertEquals("5.6",result2,result1);				
-
-	}
-	
-	
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/branding/AllBrandingTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/branding/AllBrandingTests.java
deleted file mode 100644
index 197f60b..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/branding/AllBrandingTests.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.branding;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-/**
- * Manages the API tests
- */
-public class AllBrandingTests extends UpdateManagerTestCase {
-	/**
-	 * Constructor
-	 */
-	public AllBrandingTests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * List of API tests
-	 */
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("Branding Tests");
-
-		suite.addTest(new TestSuite(BundleProviderTest.class));	
-		suite.addTest(new TestSuite(ProductTest.class));	
-
-		return suite;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/branding/BundleProviderTest.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/branding/BundleProviderTest.java
deleted file mode 100644
index f9b2765..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/branding/BundleProviderTest.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.branding;
-
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.internal.configurator.branding.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import org.osgi.framework.*;
-
-public class BundleProviderTest extends UpdateManagerTestCase {
-
-	public BundleProviderTest(String testcase){
-		super(testcase);
-	}
-
-	public void testMain() throws Exception {
-		
-		IBundleGroupProvider[] bundleGroupProviders = Platform.getBundleGroupProviders();
-		for (int i=0; i<bundleGroupProviders.length; i++) {
-			System.out.println("BundleGroupProvider:"+bundleGroupProviders[i].getName());
-			IBundleGroup[] bundleGroups = bundleGroupProviders[i].getBundleGroups();
-			for (int j=0; j<bundleGroups.length; j++) {
-				System.out.println("BundleGroup name:"+bundleGroups[j].getName() +"\n" +
-						"description:" + bundleGroups[j].getDescription() + "\n"+
-						"id:" + bundleGroups[j].getIdentifier() + "\n" +
-						"provider:" + bundleGroups[j].getProviderName() + "\n" +
-						"version:" + bundleGroups[j].getVersion() + "\n" +
-						"license:" + bundleGroups[j].getProperty(IBundleGroupConstants.LICENSE_HREF) + "\n" +
-						"featureImage:" + bundleGroups[j].getProperty(IBundleGroupConstants.FEATURE_IMAGE) + "\n" +
-						"tips and tricks:" + bundleGroups[j].getProperty(IBundleGroupConstants.TIPS_AND_TRICKS_HREF) + "\n" +
-						"welcomePage:" + bundleGroups[j].getProperty(IBundleGroupConstants.WELCOME_PAGE) + "\n" +
-						"welcomePerspective:" + bundleGroups[j].getProperty(IBundleGroupConstants.WELCOME_PERSPECTIVE));
-				System.out.println("bundles:");
-				Bundle[] bundles = bundleGroups[j].getBundles();
-				for (int b=0; b<bundles.length; b++)
-					System.out.println(bundles[b].getSymbolicName());
-				System.out.println();
-			}
-		}
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/branding/ProductTest.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/branding/ProductTest.java
deleted file mode 100644
index 9b068c1..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/branding/ProductTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.branding;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.internal.configurator.branding.*;
-import org.eclipse.update.tests.*;
-
-public class ProductTest extends UpdateManagerTestCase {
-
-	public ProductTest(String testcase){
-		super(testcase);
-	}
-
-	public void testMain() throws Exception {
-		
-		IProduct product = Platform.getProduct();
-		if (product == null)
-			System.out.println("No product defined");
-		else
-			System.out.println("Product is: \n" +
-					"name=" + product.getName() + "\n" +
-					"application=" + product.getApplication() + "\n" +
-					"description=" + product.getDescription() + "\n" +
-					"id="+ product.getId() + "\n" +
-					"about_text:"+product.getProperty(IProductConstants.ABOUT_TEXT) +"\n" +
-					"about_image:"+product.getProperty(IProductConstants.ABOUT_IMAGE) +"\n" +
-					"app_name:"+product.getProperty(IProductConstants.APP_NAME) +"\n" +
-					"window_image:"+product.getProperty(IProductConstants.WINDOW_IMAGE) +"\n" +
-					"window_images:"+product.getProperty(IProductConstants.WINDOW_IMAGES) );
-				
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/AllConfigurationsTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/AllConfigurationsTests.java
deleted file mode 100644
index bd8748e..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/AllConfigurationsTests.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.configurations;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-
-public class AllConfigurationsTests extends UpdateManagerTestCase {
-public AllConfigurationsTests(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Regular Install Tests");
-	
-//	suite.addTest(new TestSuite(TestRevert.class));
-	suite.addTest(new TestSuite(TestBackward.class));
-		
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestBackward.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestBackward.java
deleted file mode 100644
index 052d474..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestBackward.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.configurations;
-import java.io.File;
-
-
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestBackward extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestBackward(String arg0) {
-		super(arg0);
-	}
-	
-	public void testSimpleBackward() throws Exception {
-
-		// cleanup
-		SiteLocal siteLocal = ((SiteLocal)SiteManager.getLocalSite());
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE,null);
-		IFeatureReference featureRef = remoteSite.getFeatureReferences()[0];
-		
-		IInstallConfiguration oldInstallConfig = site.getCurrentConfiguration();
-		IConfiguredSite oldConfigSite = oldInstallConfig.getConfiguredSites()[0];
-		
-		((ConfiguredSite)oldConfigSite).setUpdatable(true);	
-		assertNotNull("Reference is null",featureRef);
-		remove(featureRef.getFeature(null),oldConfigSite);	
-		oldConfigSite.install(featureRef.getFeature(null),null,null);
-		site.save();
-	
-		
-		// Activity -> InstallConfig
-		IInstallConfiguration current = site.getCurrentConfiguration();
-//		IActivity activity = current.getActivities()[0];	
-//		assertTrue(activity.getInstallConfiguration().equals(current));
-		
-		// ConfigSite->InstallConfig
-		IConfiguredSite newConfigSite = current.getConfiguredSites()[0];
-		assertTrue(newConfigSite.getInstallConfiguration().equals(current));
-		
-		// cleanup
-		localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);			
-	}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestRevert.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestRevert.java
deleted file mode 100644
index 88b855a..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestRevert.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.configurations;
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.model.ConfigurationPolicyModel;
-import org.eclipse.update.internal.model.ConfiguredSiteModel;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestRevert extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestRevert(String arg0) {
-		super(arg0);
-	}
-	
-	public void testSimpleRevertInstall() throws Exception {
-
-		// cleanup
-		SiteLocal siteLocal = ((SiteLocal)SiteManager.getLocalSite());
-		File localFile = new File(siteLocal.getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE,null);
-		IFeatureReference featureRef = remoteSite.getFeatureReferences()[0];
-		IFeatureReference featureRef2 = remoteSite.getFeatureReferences()[1];
-		IFeature feature = featureRef.getFeature(null);
-		
-		// old config, no features installed
-		IInstallConfiguration old = site.getCurrentConfiguration();
-		ConfigurationPolicy excludepolicy = new ConfigurationPolicy();
-		excludepolicy.setPolicy(IPlatformConfiguration.ISitePolicy.USER_EXCLUDE);
-		IConfiguredSite oldConfigSite = old.getConfiguredSites()[0];
-		excludepolicy.setConfiguredSiteModel((ConfiguredSiteModel)oldConfigSite);		
-		((ConfiguredSiteModel)oldConfigSite).setConfigurationPolicyModel((ConfigurationPolicyModel)excludepolicy);
-		
-		// install one feature
-		IInstallConfiguration newConfig = site.cloneCurrentConfiguration();
-		IConfiguredSite configSite = newConfig.getConfiguredSites()[0];
-		if (!configSite.getSite().equals(oldConfigSite.getSite())) fail("Config sites are not equals");
-		site.addConfiguration(newConfig);	
-		
-		((ConfiguredSite)configSite).setUpdatable(true);			
-		IFeatureReference installedFeature = configSite.install(feature,null,null);
-		site.save();
-
-		// unconfigure it
-		configSite.unconfigure(installedFeature.getFeature(null));
-
-		// install another feature
-		IFeature feature2 = featureRef2.getFeature(null);
-		IInstallConfiguration newConfig2 = site.cloneCurrentConfiguration();
-		IConfiguredSite anotherConfigSite = newConfig2.getConfiguredSites()[0];
-		if (!anotherConfigSite.getSite().equals(oldConfigSite.getSite())) fail("Config sites are not equals");		
-		site.addConfiguration(newConfig2);		
-		anotherConfigSite.install(feature2,null,null);
-		site.save();
-
-		// revert to old state where no feature where configured
-		site.revertTo(old,null,null);
-		site.save();
-		
-		// check
-		String time = ""+site.getCurrentConfiguration().getCreationDate().getTime();
-		File file = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		assertTrue("new configuration does not exist", file.exists());
-		
-		
-		//find configured site
-		IConfiguredSite newConfigSite = null;
-		IConfiguredSite[] sites = site.getCurrentConfiguration().getConfiguredSites();
-		for (int i = 0; i < sites.length; i++) {
-			if (sites[i].getSite().equals(oldConfigSite.getSite())){
-				 newConfigSite = sites[i];
-				 break;
-			}
-		}
-		if (newConfigSite==null) fail("Cannot find configuration site");
-
-		int oldNumber = oldConfigSite.getConfiguredFeatures().length;
-		int newNumber = newConfigSite.getConfiguredFeatures().length;
-		
-		//
-		IFeatureReference[] configFeatures = newConfigSite.getConfiguredFeatures();
-		for (int i = 0; i < configFeatures.length; i++) {
-			System.out.println(configFeatures[i]);
-		}		
-		assertTrue("Wrong number of configured features old:"+oldNumber+" new:"+newNumber,oldNumber==newNumber);
-		
-		// test only 2 install config in local site
-		int newNumberUnconfiguredFeatures = ((ConfiguredSite)newConfigSite).getConfigurationPolicy().getUnconfiguredFeatures().length;
-		int oldNumberUnconfiguredFeatures = ((ConfiguredSite)oldConfigSite).getConfigurationPolicy().getUnconfiguredFeatures().length;		
-		assertEquals("wrong number of unconfigured features",oldNumberUnconfiguredFeatures+2,newNumberUnconfiguredFeatures);
-		
-		// cleanup
-		localFile = new File(siteLocal.getLocationURL().getFile());;
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);				
-		UpdateManagerUtils.removeFromFileSystem(file);	
-		time = ""+newConfig.getCreationDate().getTime();
-		file = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),"DefaultConfig"+time+".xml").getFile());	
-		UpdateManagerUtils.removeFromFileSystem(file);	
-		time = ""+newConfig2.getCreationDate().getTime();
-		file = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),"DefaultConfig"+time+".xml").getFile());	
-		UpdateManagerUtils.removeFromFileSystem(file);	
-	}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/AllPlatformConfigurationTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/AllPlatformConfigurationTests.java
deleted file mode 100644
index fc1fef9..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/AllPlatformConfigurationTests.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.core.boot;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllPlatformConfigurationTests
-	extends PlatformConfigurationTestCase {
-	/**
-	 * Constructor
-	 */
-	public AllPlatformConfigurationTests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * List of API tests
-	 */
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("PlatformConfiguration Tests");
-
-		suite.addTest(new TestSuite(TestPlatCfgAPI.class));
-
-		return suite;
-	}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/PlatformConfigurationTestCase.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/PlatformConfigurationTestCase.java
deleted file mode 100644
index c9fa01e..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/PlatformConfigurationTestCase.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.core.boot;
-
-import java.io.File;
-import java.util.Date;
-
-import junit.framework.TestCase;
-
-public class PlatformConfigurationTestCase extends TestCase {
-	
-	protected String tempDir;
-	
-	public PlatformConfigurationTestCase(String name) {
-		super(name);
-		try {
-			init();
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-	}
-	
-	protected void init() {
-	}
-	
-	protected void setUp() {
-		// get new temp directory for testcase
-		String root = getTempDirectoryName();
-		setupDirectory(root);
-		tempDir = root;
-	}
-	
-	protected void tearDown() {
-		// cleanup testcase temp directory
-		if (tempDir != null)
-			cleanupDirectory(tempDir);
-	}
-	
-	protected String getTempDirectoryName() {
-		String tmp = System.getProperty("java.io.tmpdir");
-		if (!tmp.endsWith(File.separator))
-			tmp += File.separator;
-		return tmp+"eclipse"+File.separator+(new Date().getTime()+File.separator);
-	}
-	
-	protected void setupDirectory(String name) {
-		File dir = new File(name);
-		dir.mkdirs();
-	}
-	
-	protected void cleanupDirectory(String name) {
-		File dir = new File(name);
-		deleteDirectory(dir);
-	}
-	
-	private void deleteDirectory(File dir) {
-		File[] list = dir.listFiles();
-		if (list == null)
-			return;
-			
-		for (int i=0; i<list.length; i++) {
-			if (list[i].isDirectory()) 
-				deleteDirectory(list[i]);
-			if (!list[i].delete())
-				System.out.println("Unable to delete "+list[i].toString());
-		}
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgAPI.java
deleted file mode 100644
index d7b8d1f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgAPI.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.core.boot;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import junit.framework.Assert;
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.configurator.IPlatformConfiguration.*;
-
-public class TestPlatCfgAPI extends PlatformConfigurationTestCase {
-			
-	public TestPlatCfgAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testBasic() throws Exception {
-		
-		// get new config object
-		IPlatformConfiguration cfig = null;
-		try {
-			cfig = ConfiguratorUtils.getPlatformConfiguration(null);
-		} catch (IOException e) {
-			Assert.fail("0.0.0 "+e.toString());
-		}
-		ISiteEntry[] dflt = cfig.getConfiguredSites();
-		Assert.assertEquals("0.0.1",dflt.length,0);
-		
-		// policy tests
-		ISitePolicy p1 = cfig.createSitePolicy(ISitePolicy.USER_INCLUDE, null);
-		Assert.assertEquals("1.0.0",p1.getType(),ISitePolicy.USER_INCLUDE);
-		Assert.assertEquals("1.0.1",p1.getList().length,0);
-		p1.setList(new String[] {"first"});
-		Assert.assertEquals("1.0.2",p1.getList().length,1);
-		Assert.assertEquals("1.0.3",p1.getList()[0],"first");
-		
-		ISitePolicy p2 = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[0]);
-		Assert.assertEquals("1.1.0",p2.getType(),ISitePolicy.USER_EXCLUDE);
-		Assert.assertEquals("1.1.1",p2.getList().length,0);
-		p2.setList(new String[] {"first", "second"});
-		Assert.assertEquals("1.1.2",p2.getList().length,2);
-		Assert.assertEquals("1.1.3",p2.getList()[1],"second");
-		
-		// create some urls
-		URL u1 = null;
-		URL u2 = null;
-
-		URL u4 = null;
-		try {
-			u1 = new URL("file:/d:/temp_test_dummy");
-//			u2 = new URL("file://localhost/temp");
-			new URL("http://some.server/temp/");
-			u4 = new URL("http://bad.url");
-		} catch (MalformedURLException e) {
-			Assert.fail("2.0.0 unable to create URL "+e);
-		}
-				
-		// site creation tests
-		ISiteEntry s1 = cfig.createSiteEntry(u1,p2);
-		Assert.assertEquals("3.0.0",s1.getURL(),u1);
-		Assert.assertEquals("3.0.1",s1.getSitePolicy(),p2);
-		s1.setSitePolicy(p1);
-		Assert.assertEquals("3.0.2",s1.getSitePolicy(),p1);
-		
-//		ISiteEntry s2 = cfig.createSiteEntry(u2,p1);
-//		Assert.assertEquals("3.1.0",s2.getURL(),u2);
-//		Assert.assertEquals("3.1.1",s2.getSitePolicy(),p1);
-//		s2.setSitePolicy(p2);
-//		Assert.assertEquals("3.1.2",s2.getSitePolicy(),p2);
-		
-		// configure site tests
-		Assert.assertEquals("3.3.0",cfig.getConfiguredSites().length,0);
-		cfig.configureSite(s1);
-		Assert.assertEquals("3.3.1",cfig.getConfiguredSites().length,1);
-//		cfig.configureSite(s2);
-//		Assert.assertEquals("3.3.2",cfig.getConfiguredSites().length,2);
-//		
-		// lookup site tests
-		Assert.assertEquals("3.4.0",cfig.findConfiguredSite(u1),s1);
-//		Assert.assertEquals("3.4.1",cfig.findConfiguredSite(u2),s2);
-		Assert.assertNull("3.4.3",cfig.findConfiguredSite(u4));
-		
-		// unconfigure site tests
-		cfig.unconfigureSite(s1);
-		Assert.assertEquals("3.5.0",cfig.getConfiguredSites().length,0);
-		Assert.assertNull("3.5.1",cfig.findConfiguredSite(u1));		
-//		cfig.unconfigureSite(s2);
-//		Assert.assertEquals("3.5.2",cfig.getConfiguredSites().length,0);
-//		Assert.assertNull("3.5.3",cfig.findConfiguredSite(u2));	
-	}
-	
-	public void testSaveRestore() throws Exception {
-				
-		Assert.assertNotNull("0.0 Unable to obtain temp directory",tempDir);
-		
-		// get new config object
-		IPlatformConfiguration cfig = null;
-		try {
-			cfig = ConfiguratorUtils.getPlatformConfiguration(null);
-		} catch (IOException e) {
-			Assert.fail("0.0.0 "+e.toString());
-		}
-		ISiteEntry[] sites = cfig.getConfiguredSites();
-		Assert.assertEquals("0.0.1",sites.length,0);
-				
-		// create policies
-		ISitePolicy p1 = cfig.createSitePolicy(ISitePolicy.USER_INCLUDE, null);
-		ISitePolicy p2 = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[0]);		
-		ISitePolicy p3 = cfig.createSitePolicy(ISitePolicy.USER_INCLUDE, new String[] {"first"});
-		ISitePolicy p4 = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[] {"first", "second"});
-						
-		// create some urls
-		URL u1 = null;
-		URL u2 = null;
-		URL u3 = null;
-		URL u4 = null;
-
-		try {
-			u1 = new URL("file:d:/temp/");
-			u2 = new URL("file://localhost/temp/");
-			u3 = new URL("http://some.server/temp/");
-			u4 = new URL("http://another.server/temp/");
-			new URL("http://one.more.server/temp/");
-		} catch (MalformedURLException e) {
-			Assert.fail("1.0 unable to create URL "+e);
-		}
-		
-		// create and configure sites
-		ISiteEntry s1 = cfig.createSiteEntry(u1,p1);
-		cfig.configureSite(s1);
-		ISiteEntry s2 = cfig.createSiteEntry(u2,p2);
-		cfig.configureSite(s2);
-		ISiteEntry s3 = cfig.createSiteEntry(u3,p3);
-		cfig.configureSite(s3);
-		ISiteEntry s4 = cfig.createSiteEntry(u4,p4);
-		cfig.configureSite(s4);
-		sites = cfig.getConfiguredSites();
-		Assert.assertEquals("1.1",sites.length,4);
-		
-		// do save
-		try {
-			cfig.save();
-			Assert.fail("2.0 was expecting IOException");
-		} catch (IOException e) {
-		}
-		
-		URL cfigURL = null;
-		try {
-			cfigURL = new URL("file:"+tempDir+ "platform.xml");
-		} catch(MalformedURLException e) {
-			Assert.fail("2.1 unable to create URL "+e);
-		}
-		
-		try {
-			cfig.save(cfigURL);
-		} catch (IOException e) {
-			Assert.fail("2.2 "+e);
-		}
-		
-		// reload configuration	
-		try {
-			ConfiguratorUtils.getPlatformConfiguration(cfigURL);
-		} catch (IOException e) {
-			Assert.fail("2.3 "+e.toString());
-		}
-		ISiteEntry[] newSites = cfig.getConfiguredSites();
-		Assert.assertEquals("2.4",newSites.length,4);
-		
-		// check what we've got
-		Assert.assertEquals("3.0.1",sites[0].getURL(),newSites[0].getURL());
-		Assert.assertEquals("3.0.2",sites[0].getSitePolicy().getType(),newSites[0].getSitePolicy().getType());
-		Assert.assertEquals("3.0.3",sites[0].getSitePolicy().getList(),newSites[0].getSitePolicy().getList());
-		
-		Assert.assertEquals("3.1.1",sites[1].getURL(),newSites[1].getURL());
-		Assert.assertEquals("3.1.2",sites[1].getSitePolicy().getType(),newSites[1].getSitePolicy().getType());
-		Assert.assertEquals("3.1.3",sites[1].getSitePolicy().getList(),newSites[1].getSitePolicy().getList());
-		
-		Assert.assertEquals("3.2.1",sites[2].getURL(),newSites[2].getURL());
-		Assert.assertEquals("3.2.2",sites[2].getSitePolicy().getType(),newSites[2].getSitePolicy().getType());
-		Assert.assertEquals("3.2.3",sites[2].getSitePolicy().getList(),newSites[2].getSitePolicy().getList());
-		
-		Assert.assertEquals("3.3.1",sites[3].getURL(),newSites[3].getURL());
-		Assert.assertEquals("3.3.2",sites[3].getSitePolicy().getType(),newSites[3].getSitePolicy().getType());
-		Assert.assertEquals("3.3.3",sites[3].getSitePolicy().getList(),newSites[3].getSitePolicy().getList());
-		
-	}
-	
-	public void testCurrentConfiguration() throws Exception {
-				
-		Assert.assertNotNull("0.0 Unable to obtain temp directory",tempDir);
-		
-		// get new config object
-		IPlatformConfiguration cfig = null;
-		cfig = ConfiguratorUtils.getCurrentPlatformConfiguration();
-		cfig.getPluginPath();
-		cfig.save();
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgDefault.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgDefault.java
deleted file mode 100644
index 0a3710a..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgDefault.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.core.boot;
-
-import org.eclipse.update.configurator.*;
-
-
-public class TestPlatCfgDefault
-	extends PlatformConfigurationTestCase {
-		
-	public TestPlatCfgDefault(String arg0) {
-		super(arg0);
-	}
-	
-	public void testInitial() throws Exception {
-		IPlatformConfiguration cfig = null;
-		cfig = ConfiguratorUtils.getCurrentPlatformConfiguration();
-		IPlatformConfiguration.ISiteEntry se = cfig.getConfiguredSites()[0];
-		IPlatformConfiguration.ISitePolicy sp = cfig.createSitePolicy(IPlatformConfiguration.ISitePolicy.USER_EXCLUDE, new String[] {"1", "2","3","4","5","6","7","8","9","10","11","12"});
-		se.setSitePolicy(sp);
-		cfig.save();
-		System.out.println("done ...");
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTP.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTP.java
deleted file mode 100644
index a49d320..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTP.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.implementation;
-
-import java.io.InputStream;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.IFeature;
-import org.eclipse.update.core.IFeatureReference;
-import org.eclipse.update.core.IPluginEntry;
-import org.eclipse.update.core.IURLEntry;
-import org.eclipse.update.core.model.InstallAbortedException;
-import org.eclipse.update.internal.core.*;
-
-public class SiteFTP implements ISite {
-
-	private URL url;
-	public SiteFTP(URL url){
-		this.url = url;
-	}
-
-	/*
-	 * @see ISite#getFeatureReferences()
-	 */
-	public ISiteFeatureReference[] getFeatureReferences() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#install(IFeature, FeatureVerification verifier,IProgressMonitor)
-	 */
-	public IFeatureReference install(IFeature feature,IVerificationListener verificationListener, IProgressMonitor monitor) throws CoreException {
-		return null;
-	}
-
-	/*
-	 * @see ISite#remove(IFeature, IProgressMonitor)
-	 */
-	public void remove(IFeature feature, IProgressMonitor monitor) throws CoreException {
-	}
-
-	/*
-	 * @see ISite#addSiteChangedListener(IConfiguredSiteChangedListener)
-	 */
-	public void addSiteChangedListener(IConfiguredSiteChangedListener listener) {
-	}
-
-	/*
-	 * @see ISite#removeSiteChangedListener(IConfiguredSiteChangedListener)
-	 */
-	public void removeSiteChangedListener(IConfiguredSiteChangedListener listener) {
-	}
-
-	/*
-	 * @see ISite#getURL()
-	 */
-	public URL getURL() {
-		return url;
-	}
-
-	/*
-	 * @see ISite#getType()
-	 */
-	public String getType() {
-		return "org.eclipse.update.tests.ftp";
-	}
-
-	/*
-	 * @see ISite#getCategories()
-	 */
-	public ICategory[] getCategories() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getArchives()
-	 */
-	public IArchiveReference[] getArchives() {
-		return null;
-	}
- 
-	/*
-	 * @see ISite#addCategory(ICategory)
-	 */
-	public void addCategory(ICategory category) {
-	}
-
-	/*
-	 * @see ISite#save()
-	 */
-	public void save() throws CoreException {
-	}
-
-	/*
-	 * @see IPluginContainer#getPluginEntries()
-	 */
-	public IPluginEntry[] getPluginEntries() {
-		return null;
-	}
-
-	/*
-	 * @see IPluginContainer#getPluginEntryCount()
-	 */
-	public int getPluginEntryCount() {
-		return 0;
-	}
-
-	/*
-	 * @see ISite#getDownloadSizeFor(IFeature)
-	 */
-	public long getDownloadSizeFor(IFeature feature) {
-		return 0;
-	}
-
-	/*
-	 * @see ISite#getInstallSizeFor(IFeature)
-	 */
-	public long getInstallSizeFor(IFeature feature) {
-		return 0;
-	}
-
-
-	/*
-	 * @see IPluginContainer#store(IPluginEntry, String, InputStream)
-	 */
-	public void store(IPluginEntry entry, String name, InputStream inStream) throws CoreException {
-	}
-
-	/*
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/*
-	 * @see IPluginContainer#remove(IPluginEntry)
-	 */
-	public void remove(IPluginEntry entry) throws CoreException {
-	}
-
-	/*
-	 * @see ISite#setSiteContentConsumer(ISiteContentConsumer)
-	 */
-	public void setSiteContentConsumer(ISiteContentConsumer contentConsumer) {
-	}
-
-	/*
-	 * @see ISite#setSiteContentProvider(ISiteContentProvider)
-	 */
-	public void setSiteContentProvider(ISiteContentProvider siteContentProvider) {
-	}
-
-	/*
-	 * @see ISite#getSiteContentProvider()
-	 */
-	public ISiteContentProvider getSiteContentProvider() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getDefaultPackagedFeatureType()
-	 */
-	public String getDefaultPackagedFeatureType() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#store(IFeature, String, InputStream, IProgressMonitor)
-	 */
-	public void store(IFeature feature, String name, InputStream inStream, IProgressMonitor monitor) throws CoreException {
-	}
-
-
-	/*
-	 * @see IPluginContainer#remove(IPluginEntry, IProgressMonitor)
-	 */
-	public void remove(IPluginEntry entry, IProgressMonitor monitor) throws CoreException {
-	}
-
-	/*
-	 * @see ISite#getCategory(String)
-	 */
-	public ICategory getCategory(String key) {
-		return null;
-	}
-
-	/*
-	 * @see ISite#createSiteContentConsumer(IFeature)
-	 */
-	public ISiteContentConsumer createSiteContentConsumer(IFeature feature) throws CoreException {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getFeatureReference(IFeature)
-	 */
-	public ISiteFeatureReference getFeatureReference(IFeature feature) {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getDescription()
-	 */
-	public IURLEntry getDescription() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getPluginEntriesOnlyReferencedBy(IFeature)
-	 */
-	public IPluginEntry[] getPluginEntriesOnlyReferencedBy(IFeature feature) throws CoreException {
-		return null;
-	}
-
-	/**
-	 * @see ISite#addPluginEntry(IPluginEntry)
-	 */
-	public void addPluginEntry(IPluginEntry pluginEntry) {
-	}
-
-	/**
-	 * @see org.eclipse.update.core.ISite#install(IFeature, IFeatureReference[], IVerificationListener, IProgressMonitor)
-	 */
-	public IFeatureReference install(IFeature feature, IFeatureReference[] optionalfeatures, IVerificationListener verificationListener, IProgressMonitor monitor) throws InstallAbortedException, CoreException {
-		return null;
-	}
-
-
-	public IConfiguredSite getCurrentConfiguredSite() {
-		return null;
-	}
-
-	public IFeature createFeature(String type, URL url) throws CoreException {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.update.core.ISite#createFeature(java.lang.String, java.net.URL, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IFeature createFeature(String type, URL url, IProgressMonitor monitor) throws CoreException {
-		return null;
-	}
-
-
-	/**
-	 * @see org.eclipse.update.core.ISite#getRawFeatureReferences()
-	 */
-	public ISiteFeatureReference[] getRawFeatureReferences() {
-		return null;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.update.core.ISite#getMirrorSiteEntries()
-	 */
-	public IURLEntry[] getMirrorSiteEntries() throws CoreException {
-		return null;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTPFactory.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTPFactory.java
deleted file mode 100644
index 0d4fd25..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTPFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.implementation;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.internal.core.URLEncoder;
-
-public class SiteFTPFactory extends SiteModelFactory implements ISiteFactory {
-
-	public static final String FILE = "a/b/c/";
-
-	/*
-	 * @see ISiteFactory#createSite(URL, boolean)
-	 */
-	public ISite createSite(URL url)
-		throws CoreException, InvalidSiteTypeException {
-		ISite site = null;
-		InputStream siteStream = null;
-
-		try {
-			URL resolvedURL = URLEncoder.encode(url);
-			siteStream = resolvedURL.openStream();
-
-			SiteModelFactory factory = (SiteModelFactory) this;
-			factory.parseSite(siteStream);
-
-			site = new SiteFTP(new URL("http://eclipse.org/" + FILE));
-			
-		} catch (MalformedURLException e) {
-			throw Utilities.newCoreException("Unable to create URL", e);
-		} catch (IOException e) {
-			throw Utilities.newCoreException("Unable to access URL",ISite.SITE_ACCESS_EXCEPTION, e);
-		} finally {
-			try {
-				if (siteStream != null)
-					siteStream.close();
-			} catch (Exception e) {
-			}
-		}
-		return site;
-	}
-
-	/*
-	 * @see SiteModelFactory#canParseSiteType(String)
-	 */
-	public boolean canParseSiteType(String type) {
-		return "org.eclipse.update.tests.core.ftp".equalsIgnoreCase(type);
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/AllMirrorTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/AllMirrorTests.java
deleted file mode 100644
index d699186..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/AllMirrorTests.java
+++ /dev/null
@@ -1,40 +0,0 @@
-
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.mirror;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class AllMirrorTests extends UpdateManagerTestCase {
-	
-	public AllMirrorTests(String name){
-		super(name);
-	}
-	
-	public static Test suite(){
-		TestSuite suite = new TestSuite();
-		suite.setName("Mirror Tests");
-		
-		// the following will take all the test methods in the class that starts with "test"
-		
-		suite.addTest(new TestSuite(TestRemoteFeatureVersionMirror.class));
-		suite.addTest(new TestSuite(TestRemoteEmbeddedFeatureMirror.class));
-		suite.addTest(new TestSuite(TestRemoteDoubleEmbeddedFeatureMirror.class));
-		
-		// or you can specify the method
-		//suite.addTest(new TestGetFeature("methodThatDoesNotStartWithtest"));
-		return suite;	
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/MirrorManagerTestCase.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/MirrorManagerTestCase.java
deleted file mode 100644
index d70e4d8..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/MirrorManagerTestCase.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.mirror;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.internal.core.UpdateCore;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-public class MirrorManagerTestCase extends UpdateManagerTestCase{
-	public static int exitValue=-1;
-	public static StringBuffer errOutput;
-	
-	public MirrorManagerTestCase(String arg0){
-		super(arg0);
-	}
-	
-	//WatchDog thread to kill mirroring process if it hangs (or takes too long)
-	public static class Timer extends Thread{
-		private Process proc;
-		
-		public Timer(Process proc){
-			super();
-			this.setDaemon(true);
-			this.proc = proc;
-		}
-		
-		public void run(){
-			try {
-				// Note: normal test on 2.2Ghz P4 is 2.9s 
-				//:. giving 100x leeway to complete process before killing it
-				sleep(300000); 
-				proc.destroy();
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-	}
-	
-	// structure to hold category definition names and descriptions
-	class CategoryDefinition {
-		private String name;
-		private String desc;
-		public void setName(String name) {
-			this.name = name;
-		}
-		public void setDesc(String desc) {
-			this.desc = desc;
-		}
-		public String getName() {
-			return name;
-		}
-		public String getDesc() {
-			return desc;
-		}
-	}
-	
-	// structure to hold feature IDs and their category names
-	public class FeatureCategory{
-		private String featureId;
-		private ArrayList category;
-		
-		public FeatureCategory(){
-			category = new ArrayList();
-		}
-		
-		public void setFeatureID(String fid){
-			featureId = fid;
-		}
-		
-		public void addCategory(String cat){
-			category.add(cat);
-		}
-		
-		public String getFeatureID(){
-			return featureId;
-		}
-		
-		public String[] getCategories(){
-			return (String[])category.toArray(new String[category.size()]);
-		}
-	}
-	
-	// StreamConsumer to display output to output files or console
-	public static class StreamConsumer extends Thread {
-		private BufferedReader bReader;
-
-		public StreamConsumer(InputStream inputStream) {
-			super();
-			setDaemon(true);
-			bReader = new BufferedReader(new InputStreamReader(inputStream));
-		}
-
-		public void run() {
-			try {
-				String line;
-				while (null != (line = bReader.readLine())) {
-					System.out.println(line);
-					errOutput.append(line);
-					errOutput.append("\n");
-				}
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-	
-	/**
-	 * Returns a string array consisting of commands and their arguments to
-	 * be run.
-	 * @param remoteLoc - path of remote site (site being mirrored)
-	 * @param toLocalSiteUrl - path of local site (new mirror site)
-	 * @param fid - feature id of featuring being mirror (optional - can be null)
-	 * @param ver - version of feature to be mirrored (optional - can be null)
-	 * @param mirUrl - directory location of policy.xml (optional - can be mull)
-	 * @return
-	 */
-	public String[] getCommand(
-		String remoteLoc,
-		String toLocalSiteUrl,
-		String fid,
-		String ver,
-		String mirUrl) {
-		final String classpath = "startup.jar";
-		final String launcher = "org.eclipse.core.launcher.Main";
-		final String command = "mirror";
-		final String application = "org.eclipse.update.core.standaloneUpdate";
-		final String FLAG_CP = "-cp";
-		final String FLAG_APP = "-application";
-		final String FLAG_CMD = "-command";
-		final String FLAG_FID = "-featureId";
-		final String FLAG_DATA = "-data";
-		final String FLAG_VERSION = "-version";
-		final String FLAG_FROM = "-from";
-		final String FLAG_TO = "-to";
-		final String FLAG_URL = "-mirrorURL";
-		final String FLAG_SPLASH = "-nosplash";
-		final String FLAG_CONSOLELOG = "-consolelog";
-		final String data =
-			UpdateCore.getPlugin().getStateLocation().toOSString();
-		String[] cmd =
-			new String[] {
-				getJavaVMPath(),
-				FLAG_CP,
-				classpath,
-				launcher,
-				FLAG_APP,
-				application,
-				FLAG_CMD,
-				command,
-				FLAG_FROM,
-				(remoteLoc !=null ? remoteLoc : ""),
-				FLAG_TO,
-				toLocalSiteUrl,
-				(fid != null ? FLAG_FID : ""),
-				(fid != null ? fid : ""),
-				(ver != null ? FLAG_VERSION : ""),
-				(ver != null ? ver : ""),
-				(mirUrl != null ? FLAG_URL : ""),
-				(mirUrl != null ? mirUrl : ""),
-				FLAG_SPLASH,
-				FLAG_DATA,
-				data,
-				FLAG_CONSOLELOG};
-		return cmd;
-	}
-	
-	public boolean checkFeatureInSiteXMLExists(String url, String fid, String ver){
-		File site = new File(url + "/site.xml");
-		assertTrue(site.exists());
-		BufferedReader breader;
-		FileReader freader;
-		String text = new String();
-		String jarName = fid + "_" + ver + ".jar";
-		String feature = "<feature url=\"" +
-			"features/" + jarName + 
-			"\" id=\"" + fid + 
-			"\" version=\"" + ver+"\">";
-		try {
-			freader = new FileReader(site);
-			breader = new BufferedReader(freader);
-		} catch (FileNotFoundException e) {
-			// would have been caught by assert above
-			return false;
-		}
-		try {
-			while ((text = breader.readLine()) != null) {
-				text = text.trim();
-				if (text.equals(feature)){
-					breader.close();
-					freader.close();
-					return true;
-				}
-			}
-
-			breader.close();
-			freader.close();
-			return false;
-		} catch (IOException e) {
-			e.printStackTrace();
-			return false;
-		}
-	}
-
-	public void checkSiteXML(String url) throws Exception {
-		File mirror = new File(url);
-		File site = new File(url + "/site.xml");
-		assertTrue(mirror.isDirectory());
-		assertTrue(mirror.exists());
-		assertTrue(site.exists());
-	}
-
-	public void checkPolicyXML(String url) throws Exception {
-		File mirror = new File(url);
-		File site = new File(url + "/policy.xml");
-		assertTrue(mirror.isDirectory());
-		assertTrue(mirror.exists());
-		assertTrue(site.exists());
-	}
-	public boolean checkPolicyURL(String url, String mirrorUrl){
-		File site = new File(url + "/policy.xml");
-		assertTrue(site.exists());
-		BufferedReader breader;
-		FileReader freader;
-		String text = new String();
-
-		try {
-			freader = new FileReader(site);
-			breader = new BufferedReader(freader);
-		} catch (FileNotFoundException e) {
-			// would have been caught by assert above
-			return false;
-		}
-
-		try {
-			while ((text = breader.readLine()) != null) {
-				if (text.indexOf(mirrorUrl)!=-1){
-					breader.close();
-					freader.close();	
-					return true;
-				}
-			}
-
-			breader.close();
-			freader.close();
-			return false;
-		} catch (IOException e) {
-			e.printStackTrace();
-			return false;
-		}
-	}
-
-	public boolean doesCategoryDefinitionExist(String url) {
-		File site = new File(url + "/site.xml");
-		assertTrue(site.exists());
-		BufferedReader breader;
-		FileReader freader;
-		String text = new String();
-
-		try {
-			freader = new FileReader(site);
-			breader = new BufferedReader(freader);
-		} catch (FileNotFoundException e) {
-			// would have been caught by assert above
-			return false;
-		}
-
-		try {
-			while ((text = breader.readLine()) != null) {
-				if (text.indexOf("category-def")!=-1)
-					return true;
-			}
-
-			breader.close();
-			freader.close();
-			return false;
-		} catch (IOException e) {
-			e.printStackTrace();
-			return false;
-		}
-
-	}
-	
-	public String getEclipseRoot() {
-		return ConfiguratorUtils.getInstallURL().toExternalForm().replaceFirst(
-			"file:",
-			"");
-	}
-	
-	public FeatureCategory[] getFeatureCategories(String url){
-		File site = new File(url + "/site.xml");
-		assertTrue(site.exists());
-		BufferedReader breader;
-		FileReader freader;
-		String text = new String();
-		ArrayList featureCategories = new ArrayList();
-		
-		try {
-			freader = new FileReader(site);
-			breader = new BufferedReader(freader);
-		} catch (FileNotFoundException e) {
-			// would have been caught by assert above
-			return new FeatureCategory[0];
-		}
-
-		try {
-			FeatureCategory currTok = new FeatureCategory();
-			boolean add = false;
-			while((text =breader.readLine())!=null){
-				StringTokenizer strTok = new StringTokenizer(text);
-				while (strTok.hasMoreTokens()){
-					String temp = strTok.nextToken();
-					if (temp.equals("</feature>")){
-						add = true;
-					} else if (temp.startsWith("id")){
-						currTok.setFeatureID(temp.split("\"")[1]);
-					} else if (temp.startsWith("name")){
-						currTok.addCategory(temp.split("\"")[1]);
-					}
-				}
-				if (add){
-					featureCategories.add(currTok);
-					currTok = new FeatureCategory();
-					add = false;
-				}
-			}
-
-			breader.close();
-			freader.close();
-			return (FeatureCategory[])featureCategories.toArray(new FeatureCategory[featureCategories.size()]);
-		} catch (IOException e) {
-			System.err.println(e);
-			return new FeatureCategory[0];
-		}
-	}
-	
-	public String getJavaVMPath() {
-		// Create command string for launching the process
-		String vm = System.getProperty("java.vm.name");
-		String executable = "J9".equals(vm) ? "j9" : "java";
-		if (org.eclipse.osgi.service.environment.Constants.OS_WIN32.equals(Platform.getOS()))
-			executable += "w.exe";
-
-		String javaInstallDir =
-			System.getProperty("java.home") + File.separator + "bin";
-		return javaInstallDir + File.separator + executable;
-	}
-	
-	public CategoryDefinition[] getCategoryDefinitions(String url) {
-		File site = new File(url + "/site.xml");
-		assertTrue(site.exists());
-		BufferedReader breader;
-		FileReader freader;
-		String text = new String();
-		ArrayList catDef = new ArrayList();
-
-		try {
-			freader = new FileReader(site);
-			breader = new BufferedReader(freader);
-		} catch (FileNotFoundException e) {
-			// would have been caught by assert above
-			return new CategoryDefinition[0];
-		}
-
-		try {
-			boolean add = false;
-			boolean isDesc = false;
-			CategoryDefinition temp = new CategoryDefinition();
-			while ((text = breader.readLine()) != null) {
-				if (text.trim().startsWith("<category-def")
-					&& text.indexOf("name") != -1) {
-					temp.setName(text.split("\"")[1]);
-					add = false;
-				} else if (text.trim().equals("<description>")) {
-					isDesc = true;
-				} else if (text.trim().equals("</description>")) {
-					isDesc = false;
-				} else if (isDesc) {
-					temp.setDesc(text.trim());
-				} else if (text.trim().equals("</category-def>")) {
-					add = true;
-				}
-				if (add) {
-					catDef.add(temp);
-					add = false;
-					temp = new CategoryDefinition();
-				}
-			}
-
-			breader.close();
-			freader.close();
-			return (CategoryDefinition[])catDef.toArray(new CategoryDefinition[catDef.size()]);
-		} catch (IOException e) {
-			System.err.println(e);
-			return new CategoryDefinition[0];
-		}
-
-	}
-	
-	public int performMirror(String[] cmd_mirror) {
-		File file = new File(getEclipseRoot());
-		try {
-			System.out.println("Launching:");
-			for(int i=0; i<cmd_mirror.length; i++){
-				System.out.print(cmd_mirror[i]+" ");
-			}
-			System.out.println();
-			Process proc =
-				Runtime.getRuntime().exec(cmd_mirror, (String[]) null, file);
-
-			StreamConsumer outputs = new StreamConsumer(proc.getInputStream());
-			outputs.start();
-			StreamConsumer errors = new StreamConsumer(proc.getErrorStream());
-			errors.start();
-			Timer timer = new Timer(proc);
-			timer.start();
-
-			return proc.waitFor();
-		} catch (IOException e) {
-			System.err.println(e);
-		} catch (InterruptedException e) {
-			System.err.println(e);
-		} catch (Exception e) {
-			System.err.println(e);
-		}
-		return -1;
-	}
-
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		assertEquals(exitValue, 0);
-	}
-	
-	// ensure output string buffer ends with "Mirror command completed
-	// successfully."
-	// note: output may instead by "Command completed successfully."
-	public void testMirrorSuccess() throws Exception {
-		StringTokenizer tokenizer =
-			new StringTokenizer(
-				errOutput.toString(),
-				"\n");
-		String lastLine = new String();
-		while (tokenizer.hasMoreTokens()){
-			lastLine = tokenizer.nextToken();
-		}
-		assertTrue(
-			lastLine.equals("Mirror command completed successfully.")
-				|| lastLine.equals("Command completed successfully."));
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/TestRemoteDoubleEmbeddedFeatureMirror.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/TestRemoteDoubleEmbeddedFeatureMirror.java
deleted file mode 100644
index e4cad27..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/TestRemoteDoubleEmbeddedFeatureMirror.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.mirror;
-
-import java.io.File;
-import java.util.ArrayList;
-
-import org.eclipse.update.tests.UpdateTestsPlugin;
-
-public class TestRemoteDoubleEmbeddedFeatureMirror extends MirrorManagerTestCase {
-	private static boolean isMirrored;
-
-	public TestRemoteDoubleEmbeddedFeatureMirror(String arg0) {
-		super(arg0);
-		errOutput = new StringBuffer();
-		isMirrored = false;
-	}
-
-	public void umSetUp() {
-		String featureId = "update.feature1c";
-		String version = "3.0.0";
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteDoubleEmbeddedFeatureMirror";
-		String mirrorURL = "http://update.eclipse.org/my-mirror-url";
-		// first mirror
-		String fromRemoteSiteUrl =
-			"file:"
-				+ dataPath
-				+ "mirrors/update-site1";
-		if (!isMirrored) {
-			exitValue =
-				performMirror(
-					getCommand(fromRemoteSiteUrl,toLocalSiteUrl, null, null, mirrorURL));
-		
-		// end of first mirror
-		fromRemoteSiteUrl =
-			"file:"
-			+ dataPath
-			+ "mirrors/update-site5";
-			exitValue =
-				performMirror(
-					getCommand(fromRemoteSiteUrl,toLocalSiteUrl, featureId, version, mirrorURL));
-			isMirrored = true;
-		}
-	}
-
-	// make sure each feature is under its correct category names
-	public void testFeatureCategories() throws Exception{
-		String fromRemoteSiteUrl =
-		        dataPath
-				+ "mirrors/update-site5";
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteDoubleEmbeddedFeatureMirror";
-		FeatureCategory[] mirrorFeatures = getFeatureCategories(toLocalSiteUrl);
-		FeatureCategory[] required = new FeatureCategory[1];
-		required[0] = new FeatureCategory();
-		required[0].setFeatureID("update.feature1c");
-		required[0].addCategory("Site5-Category1");
-		assertTrue(checkFeatureCategoriesContained(required, mirrorFeatures));
-	}
-	
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		super.testExitValue();
-	}
-	
-	// ensure category definitions exist
-	public void testCategoryDefinitionsExist() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteDoubleEmbeddedFeatureMirror";
-		assertTrue(doesCategoryDefinitionExist(toLocalSiteUrl));
-	}
-
-	// ensure feature exists per site.xml
-	public void testFeatureInSiteXMLExists() {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteDoubleEmbeddedFeatureMirror";
-		String featureId = "update.feature1c";
-		String version = "3.0.0";
-		assertTrue(
-			checkFeatureInSiteXMLExists(toLocalSiteUrl, featureId, version));
-	}
-
-	// ensure site.xml is generated
-	public void testSiteXMLExists() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteDoubleEmbeddedFeatureMirror";
-		checkSiteXML(toLocalSiteUrl);
-	}
-
-	// ensure policy.xml is generated
-	public void testPolicyXMLExists() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteDoubleEmbeddedFeatureMirror";
-		checkPolicyXML(toLocalSiteUrl);
-	}
-
-	// ensure policy.xml references the correct mirrorURL
-	public void testPolicyURL() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteDoubleEmbeddedFeatureMirror";
-		String mirrorURL = "http://update.eclipse.org/my-mirror-url";
-		assertTrue(checkPolicyURL(toLocalSiteUrl, mirrorURL));
-	}
-
-	// ensure all jars in features directory mirrored
-	public void testAllFeatureJarsExist() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteDoubleEmbeddedFeatureMirror";
-		String[] featureJars = { "update.feature1b_2.0.0.jar" };
-		assertTrue(checkAllFeatureJars(toLocalSiteUrl, featureJars));
-	}
-
-	// ensure all jars in plugins directory mirrored
-	public void testAllPluginJarsExist() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteDoubleEmbeddedFeatureMirror";
-		String[] pluginJars =
-			{ "com.plugin1_1.0.0.jar", "com.plugin1a_1.0.1.jar" };
-		assertTrue(checkAllPluginJars(toLocalSiteUrl, pluginJars));
-	}
-
-	// ensure output string buffer ends with "Mirror command completed
-	// successfully."
-	// note: output may instead by "Command completed successfully."
-	public void testMirrorSuccess() throws Exception {
-		super.testMirrorSuccess();
-	}
-	
-	public boolean checkAllFeatureJars(String url, String[] jarNames) {
-		File featuresDir = new File(url + "/features");
-		assertTrue(featuresDir.exists());
-		assertTrue(featuresDir.isDirectory());
-		String[] list = featuresDir.list();
-
-		ArrayList ls = new ArrayList();
-		for (int i = 0; i < list.length; i++) {
-			ls.add(list[i]);
-		}
-
-		for (int j = 0; j < jarNames.length; j++) {
-			assertTrue(ls.contains(jarNames[j]));
-		}
-		return true;
-	}
-
-	public boolean checkAllPluginJars(String url, String[] jarNames) {
-		File pluginsDir = new File(url + "/plugins");
-		assertTrue(pluginsDir.exists());
-		assertTrue(pluginsDir.isDirectory());
-		String[] list = pluginsDir.list();
-
-		ArrayList ls = new ArrayList();
-		for (int i = 0; i < list.length; i++) {
-			ls.add(list[i]);
-		}
-
-		for (int j = 0; j < jarNames.length; j++) {
-			assertTrue(ls.contains(jarNames[j]));
-		}
-		return true;
-	}
-
-	public boolean checkFeatureCategoriesContained(FeatureCategory[] required,FeatureCategory[] localDefs){
-		boolean hasMatch;
-		for (int i = 0 ; i<required.length; i++){
-			hasMatch = false;
-			for (int j = 0; j<localDefs.length; j++){
-				if (localDefs[j].getFeatureID().equals(required[i].getFeatureID()) &&
-					checkCategoriesMatch(localDefs[j].getCategories(), required[i].getCategories())){
-						hasMatch = true;
-						j=localDefs.length;
-				}
-			}
-			if (!hasMatch)
-				return false;
-		}
-		return true;
-	}
-	
-	public boolean checkCategoriesMatch(String[] localCat, String[] remoteCat){
-		boolean hasMatch;
-		for (int i = 0; i<localCat.length; i++){
-			hasMatch = false;
-			for (int j = 0; j<remoteCat.length; i++){
-				if (localCat[i].equals(remoteCat[j])){
-					hasMatch = true;
-					j=remoteCat.length;
-				}
-			}
-			if(!hasMatch)
-				return false;
-		}
-		return true;
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/TestRemoteEmbeddedFeatureMirror.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/TestRemoteEmbeddedFeatureMirror.java
deleted file mode 100644
index 86ea260..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/TestRemoteEmbeddedFeatureMirror.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.mirror;
-
-import java.io.File;
-import java.util.ArrayList;
-
-import org.eclipse.update.tests.UpdateTestsPlugin;
-
-public class TestRemoteEmbeddedFeatureMirror extends MirrorManagerTestCase {
-	private static boolean isMirrored;
-
-	public TestRemoteEmbeddedFeatureMirror(String arg0) {
-		super(arg0);
-		errOutput = new StringBuffer();
-		isMirrored = false;
-	}
-
-	public void umSetUp() {
-		String featureId = "update.feature1c";
-		String version = "3.0.0";
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteEmbeddedFeatureMirror";
-		String mirrorURL = "http://update.eclipse.org/my-mirror-url";
-		String fromRemoteSiteUrl =
-				"file:"
-				+ dataPath
-				+ "mirrors/update-site4";
-		if (!isMirrored) {
-			exitValue =
-				performMirror(
-					getCommand(fromRemoteSiteUrl,toLocalSiteUrl, featureId, version, mirrorURL));
-			isMirrored = true;
-		}
-	}
-
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		super.testExitValue();
-	}
-
-	// ensure all category definitions exist
-	public void testCategoryDefinitionsExist() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteEmbeddedFeatureMirror";
-		assertTrue(doesCategoryDefinitionExist(toLocalSiteUrl));
-	}
-
-	public void testFeatureInSiteXMLExists() {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteEmbeddedFeatureMirror";
-		String featureId = "update.feature1c";
-		String version = "3.0.0";
-		assertTrue(
-			checkFeatureInSiteXMLExists(toLocalSiteUrl, featureId, version));
-	}
-
-	// ensure site.xml is generated
-	public void testSiteXMLExists() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteEmbeddedFeatureMirror";
-		checkSiteXML(toLocalSiteUrl);
-	}
-
-	// ensure policy.xml is generated
-	public void testPolicyXMLExists() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteEmbeddedFeatureMirror";
-		checkPolicyXML(toLocalSiteUrl);
-	}
-
-	// ensure policy.xml uses the correct mirrorURL
-	public void testPolicyURL() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteEmbeddedFeatureMirror";
-		String mirrorURL = "http://update.eclipse.org/my-mirror-url";
-		assertTrue(checkPolicyURL(toLocalSiteUrl, mirrorURL));
-	}
-
-	// ensure all jars in features directory mirrored
-	public void testAllFeatureJarsExist() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteEmbeddedFeatureMirror";
-		String[] featureJars = { "update.feature1_1.0.0.jar", "update.feature1_1.0.1.jar", "update.feature1b_2.0.0.jar", "update.feature1c_3.0.0.jar" };
-		assertTrue(checkAllFeatureJars(toLocalSiteUrl, featureJars));
-	}
-
-	// ensure all jars in plugins directory mirrored
-	public void testAllPluginJarsExist() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteEmbeddedFeatureMirror";
-		String[] pluginJars =
-			{ "com.plugin1_1.0.0.jar", "com.plugin1a_1.0.1.jar" };
-		assertTrue(checkAllPluginJars(toLocalSiteUrl, pluginJars));
-	}
-
-	// ensure output string buffer ends with "Mirror command completed
-	// successfully."
-	// note: output may instead by "Command completed successfully."
-	public void testMirrorSuccess() throws Exception {
-		super.testMirrorSuccess();
-	}
-
-	public boolean checkAllFeatureJars(String url, String[] jarNames) {
-		File featuresDir = new File(url + "/features");
-		assertTrue(featuresDir.exists());
-		assertTrue(featuresDir.isDirectory());
-		String[] list = featuresDir.list();
-
-		ArrayList ls = new ArrayList();
-		for (int i = 0; i < list.length; i++) {
-			ls.add(list[i]);
-		}
-
-		assertEquals(list.length, jarNames.length);
-		for (int j = 0; j < jarNames.length; j++) {
-			assertTrue(ls.contains(jarNames[j]));
-		}
-		return true;
-	}
-
-	public boolean checkAllPluginJars(String url, String[] jarNames) {
-		File pluginsDir = new File(url + "/plugins");
-		assertTrue(pluginsDir.exists());
-		assertTrue(pluginsDir.isDirectory());
-		String[] list = pluginsDir.list();
-
-		ArrayList ls = new ArrayList();
-		for (int i = 0; i < list.length; i++) {
-			ls.add(list[i]);
-		}
-
-		assertEquals(list.length, jarNames.length);
-		for (int j = 0; j < jarNames.length; j++) {
-			assertTrue(ls.contains(jarNames[j]));
-		}
-		return true;
-	}
-
-	public boolean checkCategoryDefinitionsContained(CategoryDefinition[] localDefs, CategoryDefinition[] remoteDefs){
-		boolean hasMatch;
-		for (int i = 0 ; i<localDefs.length; i++){
-			hasMatch = false;
-			for (int j = 0; j<remoteDefs.length; j++){
-				if (localDefs[i].getName().equals(remoteDefs[j].getName())
-						&& localDefs[i].getDesc().equals(remoteDefs[j].getDesc()))
-					hasMatch = true;
-			}
-			if (!hasMatch)
-				return false;
-		}
-		return true;
-	}
-	
-
-
-	// start testing category definitions
-	public void testCategoryDefinitions() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteEmbeddedFeatureMirror";
-		String fromRemoteSiteUrl =
-		        dataPath
-				+ "mirrors/update-site4";
-		CategoryDefinition[] localDefs = getCategoryDefinitions(toLocalSiteUrl);
-		CategoryDefinition[] remoteDefs = getCategoryDefinitions(fromRemoteSiteUrl);
-		assertTrue(checkCategoryDefinitionsContained(localDefs, remoteDefs));
-	}
-
-
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/TestRemoteFeatureVersionMirror.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/TestRemoteFeatureVersionMirror.java
deleted file mode 100644
index f3a0b25..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/mirror/TestRemoteFeatureVersionMirror.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.mirror;
-
-import java.io.File;
-
-import org.eclipse.update.tests.UpdateTestsPlugin;
-
-public class TestRemoteFeatureVersionMirror extends MirrorManagerTestCase {
-	private static boolean isMirrored;
-	
-	public TestRemoteFeatureVersionMirror(String arg0) {
-		super(arg0);
-		errOutput = new StringBuffer();
-		isMirrored = false;
-	}
-
-	public void umSetUp() {
-		String featureId = "update.feature1";
-		String version = "1.0.0";
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteFeatureVersionMirror";
-		String mirrorURL = "http://update.eclipse.org/my-mirror-url";
-		String fromRemoteSiteUrl = "file:" + dataPath + "mirrors/update-site1";
-		if (!isMirrored) {
-			exitValue =
-				performMirror(
-					getCommand(fromRemoteSiteUrl,toLocalSiteUrl, featureId, version, mirrorURL));
-			isMirrored = true;
-		}
-	}
-
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		super.testExitValue();
-	}
-
-	// ensure all category definitions exist
-	public void testCategoryDefinitionsExist() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteFeatureVersionMirror";
-		assertTrue(doesCategoryDefinitionExist(toLocalSiteUrl));
-	}
-
-	// ensure feature exists per site.xml
-	public void testFeatureInSiteXMLExists(){
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteFeatureVersionMirror";
-		String featureId = "update.feature1";
-		String version = "1.0.0";
-		assertTrue(checkFeatureInSiteXMLExists(toLocalSiteUrl, featureId, version));
-	}
-	
-	// ensure site.xml is generated
-	public void testSiteXMLExists() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteFeatureVersionMirror";
-		checkSiteXML(toLocalSiteUrl);
-	}
-
-	// ensure policy.xml is generated
-	public void testPolicyXMLExists() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteFeatureVersionMirror";
-		checkPolicyXML(toLocalSiteUrl);
-	}
-	
-	// ensure policy.xml uses the correct mirrorURL
-	public void testPolicyURL() throws Exception{
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteFeatureVersionMirror";
-		String mirrorURL = "http://update.eclipse.org/my-mirror-url";
-		assertTrue(checkPolicyURL(toLocalSiteUrl, mirrorURL));
-	}
-
-	// ensure all jars for features and plugins mirrored
-	public void testAllJarsExist() throws Exception {
-		String toLocalSiteUrl =
-			UpdateTestsPlugin.getPlugin().getStateLocation()
-				+ "/temp/testRemoteFeatureVersionMirror";
-		String featureId = "update.feature1";
-		String version = "1.0.0";
-		String jarName = featureId + "_" + version + ".jar";
-		File file = new File(toLocalSiteUrl + "/features/" + jarName);
-		assertTrue(file.exists());
-	}
-
-	// ensure output string buffer ends with "Mirror command completed
-	// successfully."
-	// note: output may instead by "Command completed successfully."
-	public void testMirrorSuccess() throws Exception {
-		super.testMirrorSuccess();
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/AllModelTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/AllModelTests.java
deleted file mode 100644
index dad8de5..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/AllModelTests.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.model;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-/**
- * Manages the API tests
- */
-public class AllModelTests extends UpdateManagerTestCase {
-	/**
-	 * Constructor
-	 */
-	public AllModelTests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * List of API tests
-	 */
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("Model Tests");
-
-		suite.addTest(new TestSuite(FeatureMain.class));
-		suite.addTest(new TestSuite(SiteMain.class));		
-
-		return suite;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/FeatureMain.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/FeatureMain.java
deleted file mode 100644
index 803b5bb..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/FeatureMain.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.model;
-
-import java.io.*;
-import java.net.URL;
-import java.util.ResourceBundle;
-
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class FeatureMain extends UpdateManagerTestCase {
-
-	public FeatureMain(String testcase){
-		super(testcase);
-	}
-
-	public void testMain() throws Exception {
-		
-		FeatureModelFactory factory = new FeatureModelFactory();
-		InputStream is = null;
-		FeatureModel feature = null;
-		
-		System.out.println("Parsing feature ...");
-		try {
-			is = FeatureMain.class.getResourceAsStream("feature.xml");		
-			feature = factory.parseFeature(is);
-		} finally {
-			if (is != null) {
-				try { is.close();} catch(IOException e) {}
-			}
-		}
-		
-		String base = "http://another.server/feature.xml";
-		System.out.println("Resolving feature using "+base+" ...");
-		ResourceBundle bundle = null;
-		bundle = ResourceBundle.getBundle("org/eclipse/update/tests/model/test");
-		feature.resolve(new URL(base), new URL(base));
-	}
-	
-//	private static void writeFeature(PrintWriter w, int level, FeatureModel feature) {
-//		if (feature == null) return;
-//		
-//		String in = getIndent(level);
-//		w.println(in+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-//		
-//		w.println(in+"<feature");
-//		w.println(in+"   "+"id=\""+feature.getFeatureIdentifier()+"\"");
-//		w.println(in+"   "+"version=\""+feature.getFeatureVersion()+"\"");
-//		w.println(in+"   "+"label=\""+feature.getLabel()+"\"");
-//		w.println(in+"   "+"provider-name=\""+feature.getProvider()+"\"");
-//		w.println(in+"   "+"image=\""+feature.getImageURLString()+"\" -> "+feature.getImageURL());
-//		w.println(in+"   "+"os=\""+feature.getOS()+"\"");
-//		w.println(in+"   "+"ws=\""+feature.getWS()+"\"");
-//		w.println(in+"   "+"nl=\""+feature.getNL()+"\"");
-//		w.println(in+"   "+"application=\""+feature.getApplication()+"\"");
-//		w.println(in+"   "+">");
-//		
-//		writeDescription(w, level+1, feature.getDescriptionModel());
-//		writeCopyright(w, level+1, feature.getCopyrightModel());
-//		writeLicense(w, level+1, feature.getLicenseModel());
-//		writeURLs(w, level+1, feature);
-//		writePrereqs(w, level+1, feature);
-//		writePluginEntries(w, level+1, feature);
-//		writeNonPluginEntries(w, level+1, feature);
-//		         
-//        w.println(in+"</feature>");
-//	}
-//	
-//	private static void writeDescription(PrintWriter w, int level, URLEntryModel ue) {
-//		String in = getIndent(level);
-//		w.println("");
-//		w.println(in+"<description url=\""+ue.getURLString()+"\" -> "+ue.getURL()+">");
-//		w.println(in+ue.getAnnotation());
-//		w.println(in+"</description>");
-//	}
-//	
-//	private static void writeCopyright(PrintWriter w, int level, URLEntryModel ue) {
-//		String in = getIndent(level);
-//		w.println("");
-//		w.println(in+"<copyright url=\""+ue.getURLString()+"\" -> "+ue.getURL()+">");
-//		w.println(in+ue.getAnnotation());
-//		w.println(in+"</copyright>");
-//	}
-//	
-//	private static void writeLicense(PrintWriter w, int level, URLEntryModel ue) {
-//		String in = getIndent(level);
-//		w.println("");
-//		w.println(in+"<license url=\""+ue.getURLString()+"\" -> "+ue.getURL()+">");
-//		w.println(in+ue.getAnnotation());
-//		w.println(in+"</license>");
-//	}
-//	
-//	private static void writeURLs(PrintWriter w, int level, FeatureModel feature) {
-//		String in = getIndent(level);
-//		String in2 = getIndent(level+1);
-//		w.println("");
-//		w.println(in+"<url>");
-//		
-//		URLEntryModel update = feature.getUpdateSiteEntryModel();
-//		w.println(in2+"<update");
-//		w.println(in2+"   "+"url=\""+update.getURLString()+"\" -> "+update.getURL());
-//		w.println(in2+"   "+"label=\""+update.getAnnotation()+"\"");
-//		w.println(in2+"   "+"/>");
-//		
-//		URLEntryModel[] discovery = feature.getDiscoverySiteEntryModels();
-//		for (int i=0; i<discovery.length; i++) {
-//			w.println(in2+"<discovery");
-//			w.println(in2+"   "+"url=\""+discovery[i].getURLString()+"\" -> "+discovery[i].getURL());
-//			w.println(in2+"   "+"label=\""+discovery[i].getAnnotation()+"\"");
-//			w.println(in2+"   "+"/>");
-//		}
-//		
-//		w.println(in+"</url>");
-//	}
-//	
-//	private static void writePrereqs(PrintWriter w, int level, FeatureModel feature) {
-//		String in = getIndent(level);
-//		String in2 = getIndent(level+1);
-//		w.println("");
-//		w.println(in+"<requires>");
-//		
-//		ImportModel[] imp = feature.getImportModels();
-//		for (int i=0; i<imp.length; i++) {
-//			w.println(in2+"<import");
-//			w.println(in2+"   "+"plugin=\""+imp[i].getIdentifier()+"\"");
-//			w.println(in2+"   "+"version=\""+imp[i].getVersion()+"\"");
-//			w.println(in2+"   "+"match=\""+imp[i].getMatchingRuleName()+"\"");
-//			w.println(in2+"   "+"/>");
-//		}
-//		
-//		w.println(in+"</requires>");
-//	}
-//	
-//	private static void writePluginEntries(PrintWriter w, int level, FeatureModel feature) {
-//		String in = getIndent(level);
-//		w.println("");
-//		
-//		PluginEntryModel[] plugin = feature.getPluginEntryModels();
-//		for (int i=0; i<plugin.length; i++) {
-//			w.println(in+"<plugin");
-//			w.println(in+"   "+"id=\""+plugin[i].getPluginIdentifier()+"\"");
-//			w.println(in+"   "+"version=\""+plugin[i].getPluginVersion()+"\"");
-//			w.println(in+"   "+"fragment=\""+plugin[i].isFragment()+"\"");
-//			w.println(in+"   "+"os=\""+plugin[i].getOS()+"\"");
-//			w.println(in+"   "+"ws=\""+plugin[i].getWS()+"\"");
-//			w.println(in+"   "+"nl=\""+plugin[i].getNL()+"\"");
-//			w.println(in+"   "+"download-size=\""+plugin[i].getDownloadSize()+"\"");
-//			w.println(in+"   "+"install-size=\""+plugin[i].getInstallSize()+"\"");
-//			w.println(in+"   "+"/>");
-//		}
-//	}
-//	
-//	private static void writeNonPluginEntries(PrintWriter w, int level, FeatureModel feature) {
-//		String in = getIndent(level);
-//		w.println("");
-//		
-//		NonPluginEntryModel[] data = feature.getNonPluginEntryModels();
-//		for (int i=0; i<data.length; i++) {
-//			w.println(in+"<data");
-//			w.println(in+"   "+"id=\""+data[i].getIdentifier()+"\"");
-//			w.println(in+"   "+"download-size=\""+data[i].getDownloadSize()+"\"");
-//			w.println(in+"   "+"install-size=\""+data[i].getInstallSize()+"\"");
-//			w.println(in+"   "+"/>");
-//		}
-//	}
-//	
-//	
-//	private static String getIndent(int level) {
-//		String indent = "";
-//		for (int i=0; i<level; i++) 
-//			indent += "   ";
-//		return indent;
-//	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/SiteMain.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/SiteMain.java
deleted file mode 100644
index cc49bf2..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/SiteMain.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.model;
-
-import java.io.*;
-import java.net.URL;
-
-import org.eclipse.update.core.SiteFeatureReferenceModel;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class SiteMain extends UpdateManagerTestCase {
-	
-	public SiteMain(String name){
-		super(name);
-	}
-
-	public void testMain() throws Exception {
-		
-		StringWriter strWriter=new StringWriter();
-		PrintWriter w = new PrintWriter(strWriter);
-
-		process("site_old_format.xml",w);
-		process("site.xml",w);
-		try {
-			process("site_with_type.xml",w);
-			fail("InvalidSiteTypeException not thrown");
-		} catch (InvalidSiteTypeException e) {
-			assertEquals(e.getNewType(),"some.other.site.type");
-		} finally {
-			System.out.println(strWriter);
-			w.close();
-		}
-	}
-	
-	private static void process(String xml, PrintWriter w) throws Exception {
-		
-		SiteModelFactory factory = new SiteModelFactory();
-		InputStream is = null;
-		SiteModel site = null;
-		
-		w.println("");
-		w.println("Parsing site map ...");
-		try {
-			is = SiteMain.class.getResourceAsStream(xml);		
-			site = factory.parseSite(is);
-		}  finally {
-			if (is != null) {
-				try { is.close();} catch(IOException e) {}
-			}
-		}
-		
-		if (site == null) return;
-		
-		String base = "http://another.server/site.xml";
-		w.println("Resolving site using "+base+" ...");
-		site.resolve(new URL(base), null);
-		
-		w.println("Writing site ...");
-		writeSite(w,0,site);
-	}
-	
-	private static void writeSite(PrintWriter w, int level, SiteModel site) {
-		if (site == null) return;
-		
-		String in = getIndent(level);
-		w.println(in+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-		
-		w.println(in+"<site");
-		w.println(in+"   "+"type=\""+site.getType()+"\"");
-		w.println(in+"   "+">");
-		
-		writeDescription(w, level+1, site.getDescriptionModel());
-		writeFeatures(w, level+1, site);
-		writeArchives(w, level+1, site);
-		writeCategoryDefs(w, level+1, site);
-         
-        w.println(in+"</feature>");
-	}
-	
-	private static void writeDescription(PrintWriter w, int level, URLEntryModel ue) {
-		if (ue == null) return;
-		String in = getIndent(level);
-		w.println("");
-		w.println(in+"<description url=\""+ue.getURLString()+"\" -> "+ue.getURL()+">");
-		w.println(in+ue.getAnnotation());
-		w.println(in+"</description>");
-	}
-	
-	private static void writeFeatures(PrintWriter w, int level, SiteModel site) {
-		String in = getIndent(level);
-		getIndent(level+1);
-		w.println("");
-		
-		SiteFeatureReferenceModel[] features = site.getFeatureReferenceModels();
-		for (int i=0; i<features.length; i++) {
-			w.println(in+"<feature");
-			w.println(in+"   "+"type=\""+features[i].getType()+"\"");
-			w.println(in+"   "+"url=\""+features[i].getURLString()+"\" -> "+features[i].getURL());
-			w.println(in+"   "+">");
-			writeCategories(w, level+1, features[i]);
-			w.println(in+"</feature>");
-		}
-	}
-	
-	private static void writeArchives(PrintWriter w, int level, SiteModel site) {
-		String in = getIndent(level);
-		w.println("");
-		
-		ArchiveReferenceModel[] archive = site.getArchiveReferenceModels();
-		for (int i=0; i<archive.length; i++) {
-			w.println(in+"<archive");
-			w.println(in+"   "+"path=\""+archive[i].getPath()+"\"");
-			w.println(in+"   "+"url=\""+archive[i].getURLString()+"\" -> "+archive[i].getURL());
-			w.println(in+"   "+"/>");
-		}
-	}
-	
-	private static void writeCategoryDefs(PrintWriter w, int level, SiteModel site) {
-		String in = getIndent(level);
-		getIndent(level+1);
-		w.println("");
-		
-		CategoryModel[] cat = site.getCategoryModels();
-		for (int i=0; i<cat.length; i++) {
-			w.println(in+"<category-def");
-			w.println(in+"   "+"name=\""+cat[i].getName()+"\"");
-			w.println(in+"   "+"label=\""+cat[i].getLabel()+"\"");
-			w.println(in+"   "+">");
-			writeDescription(w, level+1, cat[i].getDescriptionModel());
-			w.println(in+"</category-def>");
-		}
-	}
-	
-	private static void writeCategories(PrintWriter w, int level, SiteFeatureReferenceModel feature) {
-		String in = getIndent(level);
-		String[] cat = feature.getCategoryNames();
-		for (int i=0; i<cat.length; i++) {
-			w.println(in+"<category name=\""+cat[i]+"\"");
-		}
-	}
-	
-	private static String getIndent(int level) {
-		String indent = "";
-		for (int i=0; i<level; i++) 
-			indent += "   ";
-		return indent;
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/feature.xml b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/feature.xml
deleted file mode 100644
index 1db9650..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/feature.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<feature id="my.feature" version="3.7.1" label="%s1" provider-name="VK Inc."
-         image="images/feature.gif" os="Win32" ws="Win32" nl="en_CA,en_US"
-         application="org.eclipse.ui.workbench">
-
-   <install-handler url="install/handler.html" library="custom.jar" class="InstallHandler"/>
-   
-   <description url="http://www.tools.com/features/my.feature">
-      Description of my.feature
-   </description>
-   
-   <copyright url="copyright/my.feature">
-      Copyright for my.feature
-   </copyright>
-   
-   <license url="%url1">
-      License for my.feature
-   </license>
-   
-   <url>
-      <update url="http://www.tools.com/update" label="Update site"/>
-      <discovery url="http://www.tools.com/discovery1" label="%s2"/>
-      <discovery url="%url2" label="%s3 Discovery site 2"/>
-      <discovery url="%url3 http://www.tools.com/discovery3" label="Discovery site 3"/>
-   </url>
-   
-   <requires>
-      <import plugin="plugin.1" version="1.0.0" match="perfect"/>
-      <import plugin="plugin.2" version="3.2.0"/>
-      <import plugin="plugin.3"/>
-   </requires>
-   
-   <plugin id="my.plugin.1" version="1.0.0" fragment="true"
-           os="Win32" ws="Win32" nl="en_US" download-size="23456" install-size="1234567"/>
-   <plugin id="my.plugin.2" version="1.0.1"/>
-   <plugin id="my.plugin.3" version="1.0.2"/>
-   
-   <data id="examples.zip" download-size="23456" install-size="1234567"/>
-   <data id="custom/rt.jar"/>
-
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site.xml b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site.xml
deleted file mode 100644
index 7516f26..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<site>
-
-   <description url="http://www.tools.com/updateSite">
-      Site description
-   </description>
-
-   <feature type="my.feature.type" url="feature1.jar">
-      <category name="tools"/>
-      <category name="utilities"/>
-      <category name="windows.tools"/>
-   </feature>
-   
-   <feature type="" url="file:/feature2.jar">
-      <category name="utilities"/>
-   </feature>
-   
-   
-   <archive path="first/archive" url="archive1.jar"/>
-   <archive path="second/archive" url="archive2.jar"/>
-   
-   <category-def name="tools" label="Development Tools">
-      <description url="http://www.tools.com/tools">
-         This is description for tools
-      </description>
-   </category-def>
-   
-   <category-def name="utilities" label="Utilities">
-      <description url="tools.html"/>/
-   </category-def>
-   
-   <category-def name="windows.tools" label="Windows Development Tools"/>
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_old_format.xml b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_old_format.xml
deleted file mode 100644
index dd10ef7..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_old_format.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<site url="www.tools.com/updateSite">
-
-   <feature type="my.feature.type" url="feature1.jar">
-      <category name="tools"/>
-      <category name="utilities"/>
-      <category name="windows.tools"/>
-   </feature>
-   
-   <feature type="" url="feature2.jar">
-      <category name="utilities"/>
-   </feature>
-  
-   <archive path="first/archive" url="archive1.jar"/>
-   <archive path="second/archive" url="archive2.jar"/>
-   
-   <category-def name="tools" label="Development Tools">
-      <description url="http://www.tools.com/tools">
-         This is description for tools
-      </description>
-   </category-def>
-   
-   <category-def name="utilities" label="Utilities">
-      <description url="utilities.html"/>
-   </category-def>
-   
-   <category-def name="windows.tools" label="Windows Development Tools"/>
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_with_type.xml b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_with_type.xml
deleted file mode 100644
index 2ee3a3f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_with_type.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<site url="http://www.tools.com/updateSite" type="some.other.site.type">
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/test.properties b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/test.properties
deleted file mode 100644
index 4201818..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/test.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-s1 = String 1
-s2 = String 2
-url1 = relative/index.html
-url2 = http://some.server/tools.html
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nativeTests/TestLocalSystemInfo.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nativeTests/TestLocalSystemInfo.java
deleted file mode 100644
index ffcccbd..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nativeTests/TestLocalSystemInfo.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.nativeTests;
-import java.io.File;
-
-import org.eclipse.update.configuration.IVolume;
-import org.eclipse.update.configuration.LocalSystemInfo;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestLocalSystemInfo extends UpdateManagerTestCase {
-
-	/**
-	 * Test the natives
-	 */
-	public TestLocalSystemInfo(String arg0) {
-		super(arg0);
-	}
-
-	public void testNative() throws Exception {
-	
-		// mount point
-       IVolume[] a = LocalSystemInfo.getVolumes();
-        if (a==null) throw new Exception("cannot find native library");
-		System.out.println("Found "+a.length+" mount points.");
-		for (int i =0; i<a.length;i++){
-			System.out.print("#"+i+" - "+a[i]);
-			
-			File root = a[i].getFile();
-			String label = a[i].getLabel();
-			if (label==null) label="NO LABEL";
-			int type = a[i].getType();
-			long size = LocalSystemInfo.getFreeSpace(root);
-			System.out.println(" ->:"+label+":"+getType(type)+":"+getSize(size));
-		}
-	}
-	
-	private String getType(int type){
-		switch (type) {
-			case LocalSystemInfo.VOLUME_FIXED :
-				return "VOLUME FIXED";
-			case LocalSystemInfo.VOLUME_REMOTE :
-				return "VOLUME REMOTE";
-			case LocalSystemInfo.VOLUME_REMOVABLE :
-				return "VOLUME REMOVABLE";
-			case LocalSystemInfo.VOLUME_CDROM :
-				return "VOLUME CDROM";				
-			case LocalSystemInfo.VOLUME_UNKNOWN :
-				return "VOLUME UNKNOWN";
-			default :
-				return "WRONG VOLUME INFO";
-		}
-	}
-	
-	private String getSize(long size){
-		if (size==LocalSystemInfo.SIZE_UNKNOWN) return "UNKNOWN SIZE";
-		
-		long kb = size/(1024*1024);
-		return new String(size+" ("+kb+"MB)");
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nestedfeatures/AllNestedTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nestedfeatures/AllNestedTests.java
deleted file mode 100644
index dc233c0..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nestedfeatures/AllNestedTests.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.nestedfeatures;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-public class AllNestedTests extends UpdateManagerTestCase {
-public AllNestedTests(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Nested Install Tests");
-	
-	// the following will take all teh test methods in teh class that start with 'test'
-
-	suite.addTest(new TestSuite(TestInstall.class));
-
-	// or you can specify the method
-	//suite.addTest(new TestGetFeature("methodThatDoesNotStartWithtest"));	
-	
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nestedfeatures/TestInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nestedfeatures/TestInstall.java
deleted file mode 100644
index b4f5070..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nestedfeatures/TestInstall.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.nestedfeatures;
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestInstall extends UpdateManagerTestCase {
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestInstall(String arg0) {
-		super(arg0);
-	}
-
-	public void testFileSite() throws Exception {
-		
-		//cleanup target 
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);		
-		InstallRegistry.cleanup();
-		
-
-		ISite remoteSite =
-			SiteManager.getSite(new URL(SOURCE_FILE_SITE, "nestedFeatureSiteTest/site.xml"),null);
-		IFeature remoteFeature = remoteSite.getFeatureReferences()[0].getFeature(null);
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		localSite.install(remoteFeature, null, null);
-
-		// verify root Feature
-		String site = localSite.getURL().getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue(
-			"plugin files not installed locally:" + pluginFile,
-			pluginFile.exists());
-		File pluginXMLFile =
-			new File(
-				site,
-				Site.DEFAULT_PLUGIN_PATH + pluginName + File.separator + "plugin.xml");
-		assertTrue("plugin.xml file not installed locally", pluginXMLFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue(
-			"feature info not installed locally:" + featureFile,
-			featureFile.exists());
-
-		// clean plugins & feature
-		for (int i = 0; i < entries.length; i++) {
-			pluginName = entries[i].getVersionedIdentifier().toString();
-			pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			UpdateManagerUtils.removeFromFileSystem(pluginFile);
-			InstallRegistry.unregisterPlugin(entries[i]);
-		}
-		UpdateManagerUtils.removeFromFileSystem(featureFile);
-
-		// verify child Feature
-		IFeature childFeature =
-			remoteFeature.getIncludedFeatureReferences()[0].getFeature(null);
-		entries = childFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-		pluginName = entries[0].getVersionedIdentifier().toString();
-		pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue(
-			"plugin files not installed locally:" + pluginFile,
-			pluginFile.exists());
-		pluginXMLFile =
-			new File(
-				site,
-				Site.DEFAULT_PLUGIN_PATH + pluginName + File.separator + "plugin.xml");
-		assertTrue("plugin.xml file not installed locally", pluginXMLFile.exists());
-
-		featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ childFeature.getVersionedIdentifier().toString());
-		assertTrue(
-			"feature info not installed locally:" + featureFile,
-			featureFile.exists());
-
-		// clean plugins
-		for (int i = 0; i < entries.length; i++) {
-			pluginName = entries[0].getVersionedIdentifier().toString();
-			pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		}
-
-		// clean features
-		UpdateManagerUtils.removeFromFileSystem(featureFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-		InstallRegistry.cleanup();
-	}
-
-	/**
-	 * 
-	 */
-	public void testHTTPSite() throws Exception {
-
-		ISite remoteSite =
-			SiteManager.getSite(new URL(SOURCE_HTTP_SITE, "nestedFeatureSiteTest/"),null);
-		IFeatureReference[] features = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = null;
-
-		if (features == null || features.length == 0)
-			fail("No features on the site");
-
-		for (int i = 0; i < features.length; i++) {
-			if (features[i].getURL().toExternalForm().endsWith("rootfeature.jar")) {
-				remoteFeature = features[i].getFeature(null);
-				break;
-			}
-		}
-
-		assertNotNull("Cannot find rootfeature.jar on site", remoteFeature);
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		localSite.install(remoteFeature, null, null);
-
-		// rootfeature.jar should not be in the local site
-		IFeatureReference[] localFeatures = localSite.getFeatureReferences();
-		if (localFeatures == null || localFeatures.length == 0)
-			fail("No features on the target site");
-
-		boolean found = false;
-		for (int i = 0; i < localFeatures.length; i++) {
-			if (localFeatures[i].getURL().toExternalForm().endsWith("rootfeature.jar")) {
-				found = true;
-				break;
-			}
-		}
-
-		assertTrue(
-			"Found rootfeature.jar on target site. Target site feature ref shouldnot contain JAR file",
-			!found);
-
-		// check root
-		String site = localSite.getURL().getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue(
-			"plugin files not installed locally:" + pluginFile,
-			pluginFile.exists());		
-		File pluginXMLFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName+ File.separator + "plugin.xml");
-		assertTrue(
-			"plugin info not installed locally:" + pluginXMLFile,
-			pluginXMLFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue("feature info not installed locally", featureFile.exists());
-
-		// clean plugins & feature
-		for (int i = 0; i < entries.length; i++) {
-			pluginName = entries[i].getVersionedIdentifier().toString();
-			pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			UpdateManagerUtils.removeFromFileSystem(pluginFile);
-			InstallRegistry.unregisterPlugin(entries[i]);
-		}
-		UpdateManagerUtils.removeFromFileSystem(featureFile);
-
-		// verify child Feature
-		IFeature childFeature =
-			remoteFeature.getIncludedFeatureReferences()[0].getFeature(null);
-		entries = childFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-		pluginName = entries[0].getVersionedIdentifier().toString();
-		pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue(
-			"plugin files not installed locally:" + pluginFile,
-			pluginFile.exists());
-		pluginXMLFile =
-			new File(
-				site,
-				Site.DEFAULT_PLUGIN_PATH + pluginName + File.separator + "plugin.xml");
-		assertTrue("plugin.xml file not installed locally", pluginXMLFile.exists());
-
-		featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ childFeature.getVersionedIdentifier().toString());
-		assertTrue(
-			"feature info not installed locally:" + featureFile,
-			featureFile.exists());
-
-		// clean plugins
-		for (int i = 0; i < entries.length; i++) {
-			pluginName = entries[0].getVersionedIdentifier().toString();
-			pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		}
-
-		// clean features
-		UpdateManagerUtils.removeFromFileSystem(featureFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-	}
-
-//	public void testInstall() throws Exception {
-//
-//		// cleanup local files...
-//		URL localURL = ((SiteLocal) SiteManager.getLocalSite()).getLocationURL();
-//		File localFile = new File(localURL.getFile());
-//		UpdateManagerUtils.removeFromFileSystem(localFile);
-//		InstallRegistry.cleanup();
-//
-//		URL INSTALL_SITE = null;
-//		try {
-//			INSTALL_SITE = new URL(SOURCE_FILE_SITE, "nestedFeatureSiteTest/site.xml");
-//		} catch (Exception e) {
-//			fail(e.toString());
-//			e.printStackTrace();
-//		}
-//
-//		ISite remoteSite = SiteManager.getSite(INSTALL_SITE,null);
-//		IFeatureReference[] features = remoteSite.getFeatureReferences();
-//		IFeature remoteFeature = null;
-//
-//		if (features == null || features.length == 0)
-//			fail("No features on the site");
-//
-//		for (int i = 0; i < features.length; i++) {
-//			if (features[i].getURL().toExternalForm().endsWith("rootfeature.jar")) {
-//				remoteFeature = features[i].getFeature(null);
-//				break;
-//			}
-//		}
-//
-//		assertNotNull("Cannot find rootfeature.jar on site", remoteFeature);
-//		ILocalSite localSite = SiteManager.getLocalSite();
-//		IConfiguredSite site =
-//			localSite.getCurrentConfiguration().getConfiguredSites()[0];
-//
-//		((ConfiguredSite)site).setUpdatable(true);
-//		site.install(remoteFeature, null, null);
-//
-//		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-//		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-//
-//		String sitePath = site.getSite().getURL().getFile();
-//		String pluginName = entries[0].getVersionedIdentifier().toString();
-//		File pluginFile = new File(sitePath, Site.DEFAULT_PLUGIN_PATH + pluginName);
-//		assertTrue("plugin info not installed locally"+pluginFile, pluginFile.exists());
-//
-//		File featureFile =
-//			new File(
-//				sitePath,
-//				Site.DEFAULT_INSTALLED_FEATURE_PATH
-//					+ remoteFeature.getVersionedIdentifier().toString());
-//		assertTrue("feature info not installed locally", featureFile.exists());
-//
-//		//cleanup
-//		File file =
-//			new File(
-//				site.getSite().getURL().getFile()
-//					+ File.separator
-//					+ Site.DEFAULT_INSTALLED_FEATURE_PATH
-//					+ remoteFeature.getVersionedIdentifier());
-//		// clean plugins
-//		for (int i = 0; i < entries.length; i++) {
-//			pluginName = entries[0].getVersionedIdentifier().toString();
-//			pluginFile =
-//				new File(
-//					site.getSite().getURL().getFile(),
-//					Site.DEFAULT_PLUGIN_PATH + pluginName);
-//			UpdateManagerUtils.removeFromFileSystem(pluginFile);
-//		}
-//
-//		UpdateManagerUtils.removeFromFileSystem(file);
-//		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-//		UpdateManagerUtils.removeFromFileSystem(localFile);
-//		UpdateManagerUtils.removeFromFileSystem(
-//			new File(
-//				((InstallConfiguration) localSite.getCurrentConfiguration())
-//					.getURL()
-//					.getFile()));
-//	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/AllParserTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/AllParserTests.java
deleted file mode 100644
index 4cc01a9..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/AllParserTests.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.parser;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-
-public class AllParserTests extends UpdateManagerTestCase {
-public AllParserTests(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Parsing Tests");
-	
-	// the following will take all teh test methods in teh class that start with 'test'
-	suite.addTest(new TestSuite(TestFeatureParse.class));
-	suite.addTest(new TestSuite(TestSiteParse.class));	
-	suite.addTest(new TestSuite(TestCategories.class));		
-	
-	// or you can specify the method
-	//suite.addTest(new TestGetFeature("methodThatDoesNotStartWithtest"));	
-	
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestCategories.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestCategories.java
deleted file mode 100644
index 8a2566c..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestCategories.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.parser;
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestCategories extends UpdateManagerTestCase {
-	/**
-	 * Constructor for Test1
-	 */
-	public TestCategories(String arg0) {
-		super(arg0);
-	}
-
-	public void testCategories() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "xmls/site1/");
-		ISite remoteSite = SiteManager.getSite(remoteUrl,null);
-
-		ISiteFeatureReference[] feature = remoteSite.getFeatureReferences();
-		//ICategory[] categories = remoteSite.getCategories();
-
-		ICategory featureCategory = feature[0].getCategories()[0];
-
-		assertEquals("UML tools", featureCategory.getLabel());
-
-	}
-
-	public void testOrderedCategories() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "xmls/site1/");
-		ISite remoteSite = SiteManager.getSite(remoteUrl,null);
-
-		ICategory[] categories = remoteSite.getCategories();
-		for (int i = 0; i < categories.length; i++) {
-			System.out.println("Cat ordered->" + categories[i].getName());
-		}
-
-		assertEquals("Eclipse tools", categories[1].getLabel());
-
-	}
-
-	public void testTranslatedCategories() throws Exception {
-
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE,null);
-
-		ICategory[] categories = remoteSite.getCategories();
-
-		assertEquals("Required Drivers", categories[0].getLabel());
-
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestFeatureParse.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestFeatureParse.java
deleted file mode 100644
index 665980f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestFeatureParse.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.parser;
-
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.DefaultFeatureParser;
-import org.eclipse.update.core.model.FeatureModel;
-import org.eclipse.update.core.model.URLEntryModel;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import org.xml.sax.SAXParseException;
-
-public class TestFeatureParse extends UpdateManagerTestCase {
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestFeatureParse(String arg0) {
-		super(arg0);
-	}
-
-	public void testParse() throws Exception {
-
-		String xmlFile = "xmls/feature_1.0.0/";
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE, null);
-		URL url = UpdateManagerUtils.getURL(remoteSite.getURL(), xmlFile, null);
-
-		SiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(remoteSite);
-		ref.setURL(url);
-		IFeature feature = ref.getFeature(null);
-
-		String prov = feature.getProvider();
-		assertEquals("Object Technology International", prov);
-
-	}
-
-	public void testParseValid1() throws Exception {
-
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/feature1.xml");
-			DefaultFeatureParser parser = new DefaultFeatureParser();
-			parser.init(new FeatureExecutableFactory());
-			URL resolvedURL = URLEncoder.encode(remoteURL);
-			FeatureModel remoteFeature = parser.parse(resolvedURL.openStream());
-			remoteFeature.resolve(remoteURL, null);
-
-		} catch (SAXParseException e) {
-			fail("Exception should NOT be thrown");
-		}
-	}
-
-	public void testParseValid1bis() throws Exception {
-
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/feature1bis.xml");
-			DefaultFeatureParser parser = new DefaultFeatureParser();
-			parser.init(new FeatureExecutableFactory());
-			URL resolvedURL = URLEncoder.encode(remoteURL);
-			FeatureModel remoteFeature = parser.parse(resolvedURL.openStream());
-			remoteFeature.resolve(remoteURL, null);
-
-		} catch (SAXParseException e) {
-			fail("Exception should NOT be thrown");
-		}
-	}
-
-	public void testParseValid2() throws Exception {
-
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/feature2.xml");
-			DefaultFeatureParser parser = new DefaultFeatureParser();
-			parser.init(new FeatureExecutableFactory());
-			URL resolvedURL = URLEncoder.encode(remoteURL);
-			FeatureModel remoteFeature = parser.parse(resolvedURL.openStream());
-			remoteFeature.resolve(remoteURL, null);
-
-		} catch (SAXParseException e) {
-			fail("Exception should not be thrown" + e.getMessage());
-		}
-	}
-
-	public void testParseValid3() throws Exception {
-
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/feature3.xml");
-			DefaultFeatureParser parser = new DefaultFeatureParser();
-			parser.init(new FeatureExecutableFactory());
-			URL resolvedURL = URLEncoder.encode(remoteURL);
-			FeatureModel remoteFeature = parser.parse(resolvedURL.openStream());
-			remoteFeature.resolve(remoteURL, null);
-
-			String copyrightString = remoteFeature.getCopyrightModel().getURL().getFile();
-			boolean resolved = copyrightString.indexOf(SiteManager.getOS()) != -1;
-			assertTrue("Copyright URL not resolved:" + copyrightString, resolved);
-		} catch (SAXParseException e) {
-			fail("Exception should not be thrown" + e.getMessage());
-		}
-	}
-
-	// parse type
-	public void testParseValid4() throws Exception {
-
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/feature4.xml");
-			DefaultFeatureParser parser = new DefaultFeatureParser();
-			parser.init(new FeatureExecutableFactory());
-			URL resolvedURL = URLEncoder.encode(remoteURL);
-			FeatureModel remoteFeature = parser.parse(resolvedURL.openStream());
-			remoteFeature.resolve(remoteURL, null);
-
-			URLEntryModel[] models = remoteFeature.getDiscoverySiteEntryModels();
-			assertTrue("Discovery model is not a Web Model", models[0].getType()==IURLEntry.WEB_SITE);
-			URLEntryModel copyright = remoteFeature.getCopyrightModel();
-			assertTrue("Copyright model is not an Update Model", copyright.getType()==IURLEntry.UPDATE_SITE);
-			
-		} catch (SAXParseException e) {
-			fail("Exception should not be thrown" + e.getMessage());
-		}
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestSiteParse.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestSiteParse.java
deleted file mode 100644
index 1a970a0..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestSiteParse.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.parser;
-
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.internal.core.SiteFileFactory;
-import org.eclipse.update.internal.core.URLEncoder;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import org.xml.sax.SAXParseException;
-
-public class TestSiteParse extends UpdateManagerTestCase {
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestSiteParse(String arg0) {
-		super(arg0);
-	}
-
-	public void testParse() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "xmls/site1/");
-		ISite remoteSite = SiteManager.getSite(remoteUrl,null);
-
-		//IFeatureReference[] feature = remoteSite.getFeatureReferences();
-		//ICategory[] categories = remoteSite.getCategories();
-
-		String path = remoteUrl.getFile();
-		String path2 = remoteSite.getDescription().getURL().getFile();
-		assertEquals(new File(path + "index.html"), new File(path2));
-
-	}
-
-	public void testNumberOfFeatures() throws Exception {
-
-		URL remoteURL = new URL("http", getHttpHost(), getHttpPort(), bundle.getString("HTTP_PATH_2"));
-		ISite remoteSite = SiteManager.getSite(remoteURL,null);
-
-		IFeatureReference[] feature = remoteSite.getFeatureReferences();
-		assertEquals(feature.length, 2);
-
-	}
-
-	public void testParseValid1() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site.xml");
-		DefaultSiteParser parser = new DefaultSiteParser();
-		parser.init(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] feature = remoteSite.getFeatureReferenceModels();
-		CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", feature.length == 6);
-		assertTrue("Wrong number of categories", categories.length == 3);
-		assertTrue("Wrong number of archives", archives.length == 0);
-
-		String path = new URL(SOURCE_FILE_SITE + "parsertests/").getFile();
-		String path2 = remoteSite.getDescriptionModel().getURL().getFile();
-		assertEquals(path + "index.html", path2);
-
-	}
-
-	public void testParseValid2() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/reddot.xml");
-		DefaultSiteParser parser = new DefaultSiteParser();
-		parser.init(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] feature = remoteSite.getFeatureReferenceModels();
-		CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", feature.length == 2);
-		assertTrue("Wrong number of categories", categories.length == 1);
-		assertTrue("Wrong number of archives", archives.length == 2);
-
-		String valideString = "This category contains all of the <currently> available versions of Red Dot feature. <greeting>Hello, world!</greeting>";
-		assertEquals(valideString, remoteSite.getCategoryModels()[0].getDescriptionModel().getAnnotation());
-
-		String path = new URL(SOURCE_FILE_SITE + "parsertests/").getFile();
-		String path2 = remoteSite.getDescriptionModel().getURL().getFile();
-		assertEquals(path + "index.html", path2);
-
-	}
-
-	public void testParseValid3() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/reddot1.xml");
-		DefaultSiteParser parser = new DefaultSiteParser();
-		parser.init(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] feature = remoteSite.getFeatureReferenceModels();
-		CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", feature.length == 2);
-		assertTrue("Wrong number of categories", categories.length == 1);
-		assertTrue("Wrong number of archives", archives.length == 2);
-
-		String valideString = "This category contains all of the <currently> available versions of Red Dot feature.";
-		assertEquals(valideString, remoteSite.getCategoryModels()[0].getDescriptionModel().getAnnotation());
-
-		String path = new URL(SOURCE_FILE_SITE + "parsertests/").getFile();
-		String path2 = remoteSite.getDescriptionModel().getURL().getFile();
-		assertEquals(path + "index.html", path2);
-
-	}
-
-	public void testParseValid4() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "SiteURLTest/data/site.xml");
-		DefaultSiteParser parser = new DefaultSiteParser();
-		parser.init(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] feature = remoteSite.getFeatureReferenceModels();
-		//CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", feature.length == 2);
-		assertTrue("Wrong number of archives", archives.length == 3);
-
-		URL path1 = new URL(SOURCE_FILE_SITE + "SiteURLTest/data/artifacts/features/helpFeature.jar");
-		URL url1 = feature[0].getURL();
-		assertEquals(path1, url1);
-		URL path2 = new URL(SOURCE_FILE_SITE + "SiteURLTest/data/artifacts/plugins/help.jar");
-		assertEquals(path2, archives[0].getURL());
-
-		String path = new URL(SOURCE_FILE_SITE + "SiteURLTest/data/info/").getFile();
-		String path3 = remoteSite.getDescriptionModel().getURL().getFile();
-		assertEquals(path + "siteInfo.html", path3);
-
-	}
-
-	public void testParseValid5() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site2.xml");
-		DefaultSiteParser parser = new DefaultSiteParser();
-		parser.init(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] featureRef = remoteSite.getFeatureReferenceModels();
-		//CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", featureRef.length == 1);
-		assertTrue("Wrong number of archives", archives.length == 0);
-
-		try {
-			((FeatureReference) featureRef[0]).getFeature(null);
-		} catch (CoreException e) {
-			Throwable e1 = e.getStatus().getException();
-			if (e1.getMessage().indexOf("not-eclipse") == -1) {
-				throw e;
-			}
-		}
-	}
-
-	public void testParseValid6() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site4.xml");
-		DefaultSiteParser parser = new DefaultSiteParser();
-		parser.init(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] featureRef = remoteSite.getFeatureReferenceModels();
-		//CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", featureRef.length == 2);
-		assertTrue("Wrong number of archives", archives.length == 0);
-
-		try {
-			((FeatureReference) featureRef[0]).getFeature(null);
-		} catch (CoreException e) {
-			Throwable e1 = e.getStatus().getException();
-			String msg = e1.getMessage().replace(File.separatorChar, '/');
-			if (msg.indexOf("_1.0.0.jar/feature.xml") == -1) {
-				throw e;
-			}
-		}
-	}
-
-	public void testParseUnknownCategory() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site3.xml");
-		DefaultSiteParser parser = new DefaultSiteParser();
-		parser.init(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] featureRef = remoteSite.getFeatureReferenceModels();
-		ICategory[] categories = ((SiteFeatureReference) featureRef[0]).getCategories();
-		assertTrue(categories.length == 0);
-	}
-
-	public void testParseValid7() throws Exception {
-
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site7.xml");
-			DefaultSiteParser parser = new DefaultSiteParser();
-			parser.init(new SiteFileFactory());
-			URL resolvedURL = URLEncoder.encode(remoteURL);
-			SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-			remoteSite.resolve(remoteURL, null);
-
-		} catch (SAXParseException e) {
-			fail("Exception should not be thrown" + e.getMessage());
-		}
-	}
-
-	public void testParseValid8() throws Exception {
-
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site8.xml");
-			DefaultSiteParser parser = new DefaultSiteParser();
-			parser.init(new SiteFileFactory());
-			URL resolvedURL = URLEncoder.encode(remoteURL);
-			SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-			remoteSite.resolve(remoteURL, null);
-
-		} catch (SAXParseException e) {
-			fail("Exception should not be thrown" + e.getMessage());
-		}
-	}
-
-	public void testParseValid9() throws Exception {
-
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site9.xml");
-			DefaultSiteParser parser = new DefaultSiteParser();
-			parser.init(new SiteFileFactory());
-			URL resolvedURL = URLEncoder.encode(remoteURL);
-			SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-			remoteSite.resolve(remoteURL, null);
-		} catch (SAXParseException e) {
-			fail("Exception should not be thrown" + e.getMessage());
-		}
-	}
-
-	public void testParseValid10() throws Exception {
-
-		SiteModel remoteSite = null;
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site10.xml");
-			DefaultSiteParser parser = new DefaultSiteParser();
-			parser.init(new SiteFileFactory());
-			URL resolvedURL = URLEncoder.encode(remoteURL);
-			remoteSite = parser.parse(resolvedURL.openStream());
-			remoteSite.resolve(remoteURL, null);
-		} catch (SAXParseException e) {
-			fail("Exception should not be thrown" + e.getMessage());
-		}
-		FeatureReferenceModel[] models = remoteSite.getFeatureReferenceModels();
-		assertEquals("Invalid versioned identifier", models[0].getFeatureIdentifier(), "org.eclipse.test.feature");
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/perfms/AllPerformanceTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/perfms/AllPerformanceTests.java
deleted file mode 100644
index e669b7d..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/perfms/AllPerformanceTests.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.perfms;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-
-public class AllPerformanceTests extends UpdateManagerTestCase {
-public AllPerformanceTests(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Update Performance Tests");
-	
-	// the following will take all teh test methods in the class that start with 'test'
-	suite.addTest(new TestSuite(TestStartup.class));
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/perfms/TestStartup.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/perfms/TestStartup.java
deleted file mode 100644
index cf2d9e1..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/perfms/TestStartup.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.perfms;
-//import java.net.*;
-
-import java.io.*;
-import java.net.*;
-
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.internal.configurator.*;
-import org.eclipse.test.performance.*;
-import org.eclipse.update.tests.*;
-
-
-
-public class TestStartup extends UpdateManagerTestCase {
-	public TestStartup(String arg0) {
-		super(arg0);
-	}
-	
-
-	public void testConfigurationCreation() {
-		Performance perf= Performance.getDefault();
-		PerformanceMeter performanceMeter= perf.createPerformanceMeter(perf.getDefaultScenarioId(this));
-		perf.tagAsGlobalSummary(performanceMeter, "Configuration creation", Dimension.ELAPSED_PROCESS);
-		
-		try {
-			for (int i= 0; i < 10; i++) {
-				performanceMeter.start();
-				try {
-					URL platformXml = new URL("file", "",dataPath + "/" + "perf/platform.xml");
-					IPlatformConfiguration config = new PlatformConfigurationFactory().getPlatformConfiguration(platformXml);
-				} catch (IOException e) {
-					System.out.println("Cannot create configuration for performance measurement");
-				}
-				performanceMeter.stop();
-	 		}
-			performanceMeter.commit();
-			perf.assertPerformance(performanceMeter);
-	 	} finally {
-			performanceMeter.dispose();
-	 	}
-	}
-	
-	public void testConfigurationDetection() {
-		Performance perf= Performance.getDefault();
-		PerformanceMeter performanceMeter= perf.createPerformanceMeter(perf.getDefaultScenarioId(this));
-		perf.tagAsGlobalSummary(performanceMeter, "Configuration detection", Dimension.ELAPSED_PROCESS);
-
-		try {
-			for (int i= 0; i < 10; i++) {
-				performanceMeter.start();
-				try {
-					URL siteURL = new URL("file", "",dataPath + "/" + "perf/eclipse");
-					SiteEntry site = new SiteEntry(siteURL);
-					site.loadFromDisk(0);
-				} catch (Exception e) {
-					System.out.println("Cannot create site entry for performance measurement");
-				}
-				performanceMeter.stop();
-	 		}
-			performanceMeter.commit();
-			perf.assertPerformance(performanceMeter);
-	 	} finally {
-			performanceMeter.dispose();
-	 	}
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/AllReconciliationTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/AllReconciliationTests.java
deleted file mode 100644
index 8b9d17a..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/AllReconciliationTests.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.reconciliation;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-/**
- * Manages the API tests
- */
-public class AllReconciliationTests extends UpdateManagerTestCase {
-	/**
-	 * Constructor
-	 */
-	public AllReconciliationTests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * List of API tests
-	 */
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("API Tests");
-
-
-		suite.addTest(new TestSuite(TestSiteReconciliation.class));
-
-		return suite;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/TestSiteReconciliation.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/TestSiteReconciliation.java
deleted file mode 100644
index 8b1b0e1..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/TestSiteReconciliation.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.reconciliation;
-import java.io.*;
-import java.net.*;
-
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.configurator.IPlatformConfiguration;
-import org.eclipse.update.configurator.IPlatformConfiguration.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.*;
-
-public class TestSiteReconciliation extends UpdateManagerTestCase {
-	
-
-	
-
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestSiteReconciliation(String arg0) {
-		super(arg0);
-	}
-
-	private void addConfigSite(int policy, URL url,String[] listOfPlugins) throws Exception {
-		String xmlFile = ((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile();
-		UpdateManagerUtils.removeFromFileSystem(new File(xmlFile));		
-		InternalSiteManager.localSite=null;
-		// get new config object
-		IPlatformConfiguration cfig = ConfiguratorUtils.getCurrentPlatformConfiguration();
-		ISitePolicy p1 = cfig.createSitePolicy(policy, listOfPlugins);	
-		ISiteEntry s1 = cfig.createSiteEntry(url,p1);
-		cfig.configureSite(s1);	
-	}
-	
-	private void removeConfigSite(URL url) throws Exception {
-		// get new config object
-		IPlatformConfiguration cfig = ConfiguratorUtils.getCurrentPlatformConfiguration();
-		ISiteEntry s1 = cfig.findConfiguredSite(url);
-		assertNotNull("Unable to find site entry:"+url,s1);
-		cfig.unconfigureSite(s1);
-		cfig.save();
-	}	
-	/**
-	 * Site 1 contains a feature which needs a plugin taht is not on the path when we start
-	 * it will never be configured
-	 */
-	public void testNewSiteInclude1() throws Exception {
-	
-		int policy  = ISitePolicy.USER_INCLUDE;
-		URL url = new URL("file",null,dataPath+"reconciliationSites/site1/");
-		String[] plugins = new String[]{};
-		addConfigSite(policy,url, plugins);
-
-		ILocalSite local = SiteManager.getLocalSite();
-		((SiteLocal)local).setStamp(0);
-		IConfiguredSite[] newSites = local.getCurrentConfiguration().getConfiguredSites();
-		IConfiguredSite newSite = null;
-		for (int i = 0; i < newSites.length; i++) {
-			if (UpdateManagerUtils.sameURL(newSites[i].getSite().getURL(),url)){
-				newSite = newSites[i];
-			}
-		}
-		
-		if (newSite==null) fail("Site not found in configuration");
-		
-		IFeatureReference[] ref = newSite.getConfiguredFeatures();
-		assertEquals("Wrong number of configured features",0,ref.length);		
-		ref = ((ConfiguredSite)newSite).getConfigurationPolicy().getUnconfiguredFeatures();
-		assertEquals("Wrong number of unconfigured features",0,ref.length);		
-		
-		removeConfigSite(url);
-	}
-
-	public void testNewSiteExclude1() throws Exception {
-		
-		int policy  = ISitePolicy.USER_EXCLUDE;
-		URL url = new URL("file",null,dataPath+"reconciliationSites/site1/");
-		String[] plugins = new String[]{};
-		addConfigSite(policy,url, plugins);
-		
-		ILocalSite local = SiteManager.getLocalSite();
-		((SiteLocal)local).setStamp(0);		
-		IConfiguredSite[] newSites = local.getCurrentConfiguration().getConfiguredSites();
-		IConfiguredSite newSite = null;
-		for (int i = 0; i < newSites.length; i++) {
-			if (UpdateManagerUtils.sameURL(newSites[i].getSite().getURL(),url)){
-				newSite = newSites[i];
-			}
-		}
-		
-		if (newSite==null) fail("Site not found in configuration");
-		
-		IFeatureReference[] ref = newSite.getConfiguredFeatures();
-		assertEquals("Wrong number of configured features",0,ref.length);		
-		ref = ((ConfiguredSite)newSite).getConfigurationPolicy().getUnconfiguredFeatures();
-		assertEquals("Wrong number of unconfigured features",0,ref.length);				
-		removeConfigSite(url);
-	}
-
-	/**
-	 * Site 2 contains a feature which needs a plugin taht is on the path when we start
-	 * it will be configured
-	 */
-	public void testNewSiteInclude2() throws Exception {
-		
-		int policy  = ISitePolicy.USER_INCLUDE;
-		URL url = new URL("file",null,dataPath+"reconciliationSites/site2/");
-		String[] plugins = new String[]{};
-		addConfigSite(policy,url, plugins);
-		ILocalSite local = SiteManager.getLocalSite();
-		((SiteLocal)local).setStamp(0);		
-		IConfiguredSite[] newSites = local.getCurrentConfiguration().getConfiguredSites();
-		IConfiguredSite newSite = null;
-		for (int i = 0; i < newSites.length; i++) {
-			if (UpdateManagerUtils.sameURL(newSites[i].getSite().getURL(),url)){
-				newSite = newSites[i];
-			}
-		}
-		
-		if (newSite==null) fail("Site not found in configuration");
-		
-		IFeatureReference[] ref = newSite.getConfiguredFeatures();
-		assertEquals("Wrong number of configured features",0,ref.length);
-		ref = ((ConfiguredSite)newSite).getConfigurationPolicy().getUnconfiguredFeatures();
-		assertEquals("Wrong number of unconfigured features",0,ref.length);
-		
-		removeConfigSite(url);
-	}
-
-
-
-	public void testNewSiteExclude2() throws Exception {
-		
-		int policy  = ISitePolicy.USER_EXCLUDE;
-		URL url = new URL("file",null,dataPath+"reconciliationSites/site2/");
-		String[] plugins = new String[]{};
-		addConfigSite(policy,url, plugins);
-		ILocalSite local = SiteManager.getLocalSite();
-		((SiteLocal)local).setStamp(0);		
-		IConfiguredSite[] newSites = local.getCurrentConfiguration().getConfiguredSites();
-		IConfiguredSite newSite = null;
-		for (int i = 0; i < newSites.length; i++) {
-			if (UpdateManagerUtils.sameURL(newSites[i].getSite().getURL(),url)){
-				newSite = newSites[i];
-			}
-		}
-		
-		if (newSite==null) fail("Site not found in configuration");
-		
-		IFeatureReference[] ref = newSite.getConfiguredFeatures();
-		assertEquals("Wrong number of configured features",0,ref.length);
-		ref = ((ConfiguredSite)newSite).getConfigurationPolicy().getUnconfiguredFeatures();
-		assertEquals("Wrong number of unconfigured features",0,ref.length);
-
-		removeConfigSite(url);
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/AllRegularInstallTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/AllRegularInstallTests.java
deleted file mode 100644
index d857b55..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/AllRegularInstallTests.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-
-public class AllRegularInstallTests extends UpdateManagerTestCase {
-public AllRegularInstallTests(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Regular Install Tests");
-	
-	// the following will take all teh test methods in teh class that start with 'test'
-
-	suite.addTest(new TestSuite(TestInstall.class));
-	suite.addTest(new TestSuite(TestInstallURLSIteXML.class));	
-	suite.addTest(new TestSuite(TestSpaceInInstall.class));	
-	suite.addTest(new TestSuite(TestGetFeature.class));
-	suite.addTest(new TestSuite(TestExecutableInstall.class));	
-	suite.addTest(new TestSuite(TestExecutablePackagedInstall.class));		
-	suite.addTest(new TestSuite(TestDataEntryInstall.class));
-	suite.addTest(new TestSuite(TestLocalSite.class));		
-	
-	// or you can specify the method
-	//suite.addTest(new TestGetFeature("methodThatDoesNotStartWithtest"));	
-	
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/MultipleTestLocalSite.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/MultipleTestLocalSite.java
deleted file mode 100644
index f0325b2..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/MultipleTestLocalSite.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-
-public class MultipleTestLocalSite extends UpdateManagerTestCase {
-public MultipleTestLocalSite(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Multiple Test Local Site");
-	
-	// the following will take all teh test methods in teh class that start with 'test'
-	
-	for(int i=0; i<50; i++){
-		suite.addTest(new TestSuite(TestLocalSite.class));
-	}
-	
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestDataEntryInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestDataEntryInstall.java
deleted file mode 100644
index c22e94c..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestDataEntryInstall.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestDataEntryInstall extends UpdateManagerTestCase {
-	/**
-	 * Constructor for Test1
-	 */
-	public TestDataEntryInstall(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 * With site.xml
-	 */
-	public void testDataEntrySite() throws Exception {
-
-		//cleanup target 
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL =new File(dataPath + "dataEntrySiteTest/site1/site.xml").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL,null);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		IFeature remoteFeature = null;
-		
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature(null);
-			localSite.install(remoteFeature, null,null);
-
-			// verify
-			String site = localSite.getURL().getFile();
-			INonPluginEntry[] entries = remoteFeature.getNonPluginEntries();
-			assertTrue("no data entry", (entries != null && entries.length != 0));
-			String pluginName = entries[0].getIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString()+File.separator+ pluginName);
-			assertTrue("data files not installed locally:"+pluginFile, pluginFile.exists());
-		} 
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}
-	
-	
-	/**
-	 * With site.xml
-	 */
-	public void testDataEntrySitePackaged() throws Exception {
-
-		//cleanup target 
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL =new File(dataPath + "dataEntrySiteTest/site2/site.xml").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL,null);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		IFeature remoteFeature = null;
-		
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature(null);
-			localSite.install(remoteFeature, null,null);
-
-			// verify
-			String site = localSite.getURL().getFile();
-			INonPluginEntry[] entries = remoteFeature.getNonPluginEntries();
-			assertTrue("no data entry", (entries != null && entries.length != 0));
-			entries[0].getIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString()+File.separator+ "nondata"+File.separator+"file1.zip");
-			assertTrue("Data file inside the jar not installed locally:"+pluginFile, pluginFile.exists());
-			pluginFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString()+File.separator+ "file.zip");
-			assertTrue("Data file outside the jar not installed locally:"+pluginFile, pluginFile.exists());
-			
-		} 
-		
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}	
-	
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutableInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutableInstall.java
deleted file mode 100644
index b99411f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutableInstall.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-
-import java.io.File;
-import java.util.Locale;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-public class TestExecutableInstall extends UpdateManagerTestCase {
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestExecutableInstall(String arg0) {
-		super(arg0);
-	}
-	
-
-
-	public void testFileSite() throws Exception{
-		
-		//cleanup target 
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);		
-		InstallRegistry.cleanup();
-		
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE_INSTALLED,null);
-		IFeatureReference[] remoteFeatureReference = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = remoteFeatureReference[0].getFeature(null);
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		assertNotNull(remoteFeature);
-		remove(remoteFeature,localSite);		
-		localSite.install(remoteFeature,null,null);
-		
-		// verify
-		String site = localSite.getURL().getFile();
-		IPluginEntry[] entries = remoteFeature.getRawPluginEntries();
-		assertTrue("no plugins entry",(entries!=null && entries.length!=0));
-		String pluginName= entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site,Site.DEFAULT_PLUGIN_PATH+pluginName);
-		if (Locale.getDefault().toString().indexOf("us") != -1)
-			assertTrue("plugin files not installed locally",pluginFile.exists());
-
-		File featureFile = new File(site,Site.DEFAULT_INSTALLED_FEATURE_PATH+remoteFeature.getVersionedIdentifier().toString());
-		assertTrue("feature info not installed locally:"+featureFile,featureFile.exists());
-		assertTrue("feature is a file, not a directory:"+featureFile,featureFile.isDirectory());
-
-		
-		File featureFileXML = new File(site,Site.DEFAULT_INSTALLED_FEATURE_PATH+remoteFeature.getVersionedIdentifier().toString()+File.separator+"feature.xml");
-		assertTrue("feature info not installed locally: no feature.xml",featureFileXML.exists());
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-	}
-
-}
-
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutablePackagedInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutablePackagedInstall.java
deleted file mode 100644
index 4385887..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutablePackagedInstall.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestExecutablePackagedInstall extends UpdateManagerTestCase {
-	/**
-	 * Constructor for Test1
-	 */
-	public TestExecutablePackagedInstall(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 * With site.xml
-	 */
-	public void testFilePackageExecutableFeatureSite() throws Exception {
-
-		//cleanup target  
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL = new File(dataPath + "ExecutableFeaturePackagedSite/data2/site.xml").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL,null);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		IFeature remoteFeature = null;
-		
-		// at least one executable feature and on packaged
-		boolean execFeature = false;
-		boolean packFeature = false;
-
-		if (featuresRef.length==0) fail ("no feature found");
-	
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature(null);
-			remove(remoteFeature,localSite);			
-			localSite.install(remoteFeature, null,null);
-			
-			if (remoteFeature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider) packFeature = true;
-			if (remoteFeature.getFeatureContentProvider() instanceof FeatureExecutableContentProvider) execFeature = true;
-
-			// verify
-			String site = localSite.getURL().getFile();
-			IPluginEntry[] entries = remoteFeature.getRawPluginEntries();
-			assertTrue("no plugins entry", (entries != null && entries.length != 0));
-			String pluginName = entries[0].getVersionedIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			assertTrue("plugin files not installed locally:"+pluginFile, pluginFile.exists());
-
-			File featureFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString());
-			assertTrue("feature info not installed locally:"+featureFile, featureFile.exists());
-
-			File featureFileXML = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString() + File.separator + "feature.xml");
-			assertTrue("feature info not installed locally: no feature.xml", featureFileXML.exists());
-		}
-
-		if (!execFeature && !packFeature){
-			fail("cannot find one executable and one package feature on teh site");
-		}
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}
-	
-	
-	/**
-	 * Without site.xml
-	 */
-	public void testFileNoSiteXMLSite() throws Exception {
-
-		//cleanup target 
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL = new File(dataPath + "ExecutableFeaturePackagedSite/data/").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL,null);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		IFeature remoteFeature = null;
-		
-		// at least one executable feature and on packaged
-		boolean execFeature = false;
-		boolean packFeature = false;
-
-		if (featuresRef.length==0) fail ("no feature found");
-	
-		for (int i = 0; i < featuresRef.length; i++) {
-			try {
-				remoteFeature = featuresRef[i].getFeature(null);
-			} catch (CoreException e){
-				Throwable e1 = e.getStatus().getException();
-				String msg = e1.getMessage().replace(File.separatorChar,'/');
-				if (msg.indexOf("CVS/feature.xml")==-1){
-					throw e;
-				}				
-			}
-			if (remoteFeature!=null){
-				remove(remoteFeature,localSite);
-				localSite.install(remoteFeature,null, null);
-				
-				if (remoteFeature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider) packFeature = true;
-				if (remoteFeature.getFeatureContentProvider() instanceof FeatureExecutableContentProvider) execFeature = true;
-	
-				// verify
-				String site = localSite.getURL().getFile();
-				IPluginEntry[] entries = remoteFeature.getRawPluginEntries();
-				assertTrue("no plugins entry", (entries != null && entries.length != 0));
-				String pluginName = entries[0].getVersionedIdentifier().toString();
-				File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-				assertTrue("plugin files not installed locally:"+pluginFile, pluginFile.exists());
-	
-				File featureFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString());
-				assertTrue("feature info not installed locally:"+featureFile, featureFile.exists());
-	
-				File featureFileXML = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString() + File.separator + "feature.xml");
-				assertTrue("feature info not installed locally: no feature.xml", featureFileXML.exists());
-			}
-		}
-
-		if (!execFeature && !packFeature){
-			fail("cannot find one executable and one package feature on teh site");
-		}
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}
-	
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestGetFeature.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestGetFeature.java
deleted file mode 100644
index 518a0eb..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestGetFeature.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-public class TestGetFeature extends UpdateManagerTestCase {
-
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestGetFeature(String arg0) {
-		super(arg0);
-	}
-	
-	
-	public void testFeatureFileSite() throws Exception{
-		
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE,null);
-		IFeatureReference[] remoteFeatures = remoteSite.getFeatureReferences();
-		if (remoteFeatures==null || remoteFeatures.length==0) fail("No feature available for testing");
-		for (int i=0;i<remoteFeatures.length;i++){
-			System.out.println("feature:"+remoteFeatures[i].getURL().toExternalForm());
-		}
-	}
-
-
-	public void testFeatureHTTPSite() throws Exception{ 
-		
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE,null);
-		IFeatureReference[] remoteFeatures = remoteSite.getFeatureReferences();
-		if (remoteFeatures==null || remoteFeatures.length==0) fail("No feature available for testing");		
-		for (int i=0;i<remoteFeatures.length;i++){
-			System.out.println("feature:"+remoteFeatures[i].getURL().toExternalForm());
-		}
-	}
-}
-
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstall.java
deleted file mode 100644
index b999543..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstall.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Locale;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestInstall extends UpdateManagerTestCase {
-
-	/**
-	 * 
-	 */
-	public static final String PACKAGED_FEATURE_TYPE = "packaged"; //$NON-NLS-1$
-
-	public class Listener implements IConfiguredSiteChangedListener {
-
-		public boolean notified = false;
-
-		public void featureInstalled(IFeature feature) {
-			notified = true;
-			System.out.println("Notified DefaultFeature Installed");
-		}
-
-		public void featureRemoved(IFeature feature) {
-		}
-
-		public void featureConfigured(IFeature feature) {
-		};
-		public void featureUnconfigured(IFeature feature) {
-		};
-
-		public boolean isNotified() {
-			return notified;
-		}
-	}
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestInstall(String arg0) {
-		super(arg0);
-	}
-
-	private IFeature getFeature1(ISite site)
-		throws MalformedURLException, CoreException {
-		SiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(site);
-		ref.setURLString("features/org.eclipse.update.core.tests.feature1_1.0.4.jar");
-		ref.setType(getDefaultInstallableFeatureType());
-		ref.resolve(site.getURL(), null);
-		return ref.getFeature(null);
-	}
-
-	public void testFileSite() throws Exception {
-
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE,null);
-		IFeature remoteFeature = getFeature1(remoteSite);
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		localSite.install(remoteFeature, null, null);
-
-		// verify
-		String site = localSite.getURL().getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin files not installed locally:"+pluginFile, pluginFile.exists());
-		File pluginXMLFile =
-			new File(
-				site,
-				Site.DEFAULT_PLUGIN_PATH + pluginName + File.separator + "plugin.xml");
-		assertTrue("plugin.xml file not installed locally", pluginXMLFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue(
-			"feature info not installed locally:" + featureFile,
-			featureFile.exists());
-		//cleanup
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-
-	}
-
-	/**
-	 * 
-	 */
-	public void testHTTPSite() throws Exception {
-
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE,null);
-		IFeatureReference[] features = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = null;
-
-		if (features == null || features.length == 0)
-			fail("No features on the site");
-
-		for (int i = 0; i < features.length; i++) {
-			if (features[i].getURL().toExternalForm().endsWith("features2.jar")) {
-				remoteFeature = features[i].getFeature(null);
-				break;
-			}
-		}
-
-		assertNotNull("Cannot find feature2.jar on site", remoteFeature);
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		localSite.install(remoteFeature, null, null);
-
-		// feature2.jar should not be in the local site
-		IFeatureReference[] localFeatures = localSite.getFeatureReferences();
-		if (localFeatures == null || localFeatures.length == 0)
-			fail("No features on the target site");
-
-		boolean found = false;
-		for (int i = 0; i < localFeatures.length; i++) {
-			if (localFeatures[i].getURL().toExternalForm().endsWith("features2.jar")) {
-				found = true;
-				break;
-			}
-		}
-
-		assertTrue(
-			"Found feature2.jar on target site. Target site feature ref shouldnot contain JAR file",
-			!found);
-
-		// check
-		String site = localSite.getURL().getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin info not installed locally:"+pluginFile, pluginFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue("feature info not installed locally", featureFile.exists());
-
-		//localSite.save();
-
-		//cleanup
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-	}
-
-	public void testInstall() throws Exception {
-
-		// cleanup local files...
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-
-		URL INSTALL_SITE = null;
-		try {
-			INSTALL_SITE =
-				new URL("http", getHttpHost(), getHttpPort(), bundle.getString("HTTP_PATH_2"));
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-
-		ISite remoteSite = SiteManager.getSite(INSTALL_SITE,null);
-		IFeatureReference[] features = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = null;
-
-		if (features == null || features.length == 0)
-			fail("No features on the site");
-
-		for (int i = 0; i < features.length; i++) {
-			if (features[i].getURL().toExternalForm().endsWith("helpFeature.jar")) {
-				remoteFeature = features[i].getFeature(null);
-				break;
-			}
-		}
-
-		assertNotNull("Cannot find help.jar on site", remoteFeature);
-		ILocalSite localSite = SiteManager.getLocalSite();
-		IConfiguredSite site =
-			localSite.getCurrentConfiguration().getConfiguredSites()[0];
-		Listener listener = new Listener();
-		site.addConfiguredSiteChangedListener(listener);
-
-		((ConfiguredSite)site).setUpdatable(true);
-		site.install(remoteFeature, null, null);
-
-		IPluginEntry[] entries = remoteFeature.getRawPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-
-		String sitePath = site.getSite().getURL().getFile();
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(sitePath, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		if (Locale.getDefault().toString().indexOf("fr") != -1)
-			assertTrue("plugin info not installed locally", pluginFile.exists());
-
-		File featureFile =
-			new File(
-				sitePath,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue("feature info not installed locally", featureFile.exists());
-
-		//cleanup
-		File file =
-			new File(
-				site.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier());
-		UpdateManagerUtils.removeFromFileSystem(file);
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		InstallRegistry.unregisterPlugin(entries[0]);
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(
-			new File(
-				((InstallConfiguration) localSite.getCurrentConfiguration())
-					.getURL()
-					.getFile()));
-
-		site.removeConfiguredSiteChangedListener(listener);
-		assertTrue("Listener hasn't received notification", listener.isNotified());
-	}
-
-	public void testFileSiteWithoutSiteXML() throws Exception {
-
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE,null);
-		IFeature remoteFeature = getFeature1(remoteSite);
-		IConfiguredSite localSite =
-			SiteManager.getLocalSite().getCurrentConfiguration().getConfiguredSites()[0];
-		localSite.getSite().install(remoteFeature, null, null);
-
-		IFeatureReference[] features = localSite.getSite().getFeatureReferences();
-		if (features.length == 0)
-			fail("The local site does not contain feature, should not contain an XML file but features should be found anyway by parsing");
-		if (localSite.getSite().getArchives().length == 0)
-			fail("The local site does not contain archives, should not contain an XML file but archives should be found anyway by parsing");
-
-		//cleanup
-		File file =
-			new File(
-				localSite.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier());
-		UpdateManagerUtils.removeFromFileSystem(file);
-		file =
-			new File(
-				localSite.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_PLUGIN_PATH
-					+ "org.eclipse.update.core.tests.feature1.plugin1_3.5.6");
-		UpdateManagerUtils.removeFromFileSystem(file);
-		file =
-			new File(
-				localSite.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_PLUGIN_PATH
-					+ "org.eclipse.update.core.tests.feature1.plugin2_5.0.0");
-		UpdateManagerUtils.removeFromFileSystem(file);
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-
-		try {
-			SiteManager.getSite(new URL("http://www.eclipse.org/"),null);
-			fail("The site contains site.xml... it should be an HTTP site without an XML file");			
-		} catch (CoreException e) {
-			// expected
-		}
-
-	}
-
-//	/**
-//	* 
-//	*/
-//	private Feature createPackagedFeature(URL url, ISite site)
-//		throws CoreException {
-//		String packagedFeatureType = ISite.DEFAULT_PACKAGED_FEATURE_TYPE;
-//		Feature result = null;
-//		if (packagedFeatureType != null) {
-//			IFeatureFactory factory =
-//				FeatureTypeFactory.getInstance().getFactory(packagedFeatureType);
-//			result = (Feature) factory.createFeature(url, site);
-//		}
-//		return result;
-//	}
-	/*
-	 * @see ISite#getDefaultInstallableFeatureType()
-	 */
-	public String getDefaultInstallableFeatureType() {
-		String pluginID =
-			UpdateCore.getPlugin().getDescriptor().getUniqueIdentifier() + ".";
-		return pluginID + PACKAGED_FEATURE_TYPE;
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstallURLSIteXML.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstallURLSIteXML.java
deleted file mode 100644
index 5c2b72b..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstallURLSIteXML.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-import java.io.*;
-import java.net.*;
-import java.util.Locale;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.*;
-
-public class TestInstallURLSIteXML extends UpdateManagerTestCase {
-
-	/**
-	 * 
-	 */
-	public static final String PACKAGED_FEATURE_TYPE = "packaged"; //$NON-NLS-1$	
-
-	public class Listener implements IConfiguredSiteChangedListener {
-
-		public boolean notified = false;
-
-		public void featureInstalled(IFeature feature) {
-			notified = true;
-			System.out.println("Notified DefaultFeature Installed");
-		}
-
-		public void featureRemoved(IFeature feature) {
-		}
-
-		public void featureConfigured(IFeature feature) {
-		}
-		public void featureUnconfigured(IFeature feature) {
-		}
-
-		public boolean isNotified() {
-			return notified;
-		}
-	}
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestInstallURLSIteXML(String arg0) {
-		super(arg0);
-	}
-
-	private IFeature getFeature1(ISite site)
-		throws MalformedURLException, CoreException {
-		SiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(site);
-		ref.setURLString("features/org.eclipse.update.core.tests.feature1_1.0.4.jar");
-		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-		ref.resolve(site.getURL(), null);
-		return ref.getFeature(null);
-	}
-
-	public void testFileSite() throws Exception {
-
-		ISite remoteSite =
-			SiteManager.getSite(new URL(SOURCE_FILE_SITE, Site.SITE_XML),true,null);
-		IFeature remoteFeature = getFeature1(remoteSite);
-		URL url = TARGET_FILE_SITE;
-		File file = new File(TARGET_FILE_SITE.getFile());
-		if (!file.exists()) file.mkdirs();
-		ISite localSite = SiteManager.getSite(url,true,null);
-		remove(remoteFeature,localSite);
-		localSite.install(remoteFeature, null, null);
-
-		// verify
-		String site = TARGET_FILE_SITE.getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin files not installed locally", pluginFile.exists());
-		File pluginXMLFile =
-			new File(
-				site,
-				Site.DEFAULT_PLUGIN_PATH + pluginName + File.separator + "plugin.xml");
-		assertTrue("plugin.xml file not installed locally", pluginXMLFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue(
-			"feature info not installed locally:" + featureFile,
-			featureFile.exists());
-		//cleanup
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-		InstallRegistry.cleanup();
-	}
-
-	/**
-	 * 
-	 */
-	public void testHTTPSite() throws Exception {
-
-		// clean
-		File targetFile  = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(targetFile);
-		InstallRegistry.cleanup();
-
-		ISite remoteSite =
-			SiteManager.getSite(new URL(SOURCE_HTTP_SITE, Site.SITE_XML),true,null);
-		IFeatureReference[] features = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = null;
-
-		if (features == null || features.length == 0)
-			fail("No features on the site");
-
-		for (int i = 0; i < features.length; i++) {
-			if (features[i].getURL().toExternalForm().endsWith("features2.jar")) {
-				remoteFeature = features[i].getFeature(null);
-				break;
-			}
-		}
-
-		assertNotNull("Cannot find feature2.jar on site", remoteFeature);
-		URL url = TARGET_FILE_SITE;
-		File file = new File(TARGET_FILE_SITE.getFile());
-		if (!file.exists()) file.mkdirs();
-		ISite localSite = SiteManager.getSite(url,true,null);
-		localSite.install(remoteFeature, null, null);
-
-		// feature2.jar should not be in the local site
-		IFeatureReference[] localFeatures = localSite.getFeatureReferences();
-		if (localFeatures == null || localFeatures.length == 0)
-			fail("No features on the target site");
-
-		boolean found = false;
-		for (int i = 0; i < localFeatures.length; i++) {
-			if (localFeatures[i].getURL().toExternalForm().endsWith("features2.jar")) {
-				found = true;
-				break;
-			}
-		}
-
-		assertTrue(
-			"Found feature2.jar on target site. Target site feature ref shouldnot contain JAR file",
-			!found);
-
-		// check
-		String site = TARGET_FILE_SITE.getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin info not installed locally", pluginFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue("feature info not installed locally", featureFile.exists());
-
-		//localSite.save();
-
-		//cleanup
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-		InstallRegistry.cleanup();
-	}
-
-	public void testInstall() throws Exception {
-
-		// cleanup local files...
-		SiteLocal siteLocal = ((SiteLocal) SiteManager.getLocalSite());
-		File localFile = new File(siteLocal.getLocationURL().getFile());
-		//if (!localFile.exists()) fail("LocalSite file doesn't exist ->"+localFile.getAbsolutePath()+"<-");
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		/*
-		localFile = new File(localFile,SiteLocal.SITE_LOCAL_FILE);
-		if (!localFile.exists()) fail("LocalSite.xml doesn't exist:"+localFile);
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		*/
-		
-		InternalSiteManager.localSite = null;
-
-		URL INSTALL_SITE = null;
-		try {
-			INSTALL_SITE =
-				new URL("http", getHttpHost(), getHttpPort(), bundle.getString("HTTP_PATH_2"));
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-
-		ISite remoteSite = SiteManager.getSite(INSTALL_SITE,true,null);
-		IFeatureReference[] features = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = null;
-
-		if (features == null || features.length == 0)
-			fail("No features on the site");
-
-		for (int i = 0; i < features.length; i++) {
-			if (features[i].getURL().toExternalForm().endsWith("helpFeature.jar")) {
-				remoteFeature = features[i].getFeature(null);
-				break;
-			}
-		}
-
-		assertNotNull("Cannot find help.jar on site", remoteFeature);
-		ILocalSite localSite = SiteManager.getLocalSite();
-		IConfiguredSite site = localSite.getCurrentConfiguration().getConfiguredSites()[0];
-		Listener listener = new Listener();
-		site.addConfiguredSiteChangedListener(listener);
-
-		((ConfiguredSite)site).setUpdatable(true);
-		site.install(remoteFeature, null, null);
-
-		IPluginEntry[] entries = remoteFeature.getRawPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-
-		String sitePath = site.getSite().getURL().getFile();
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(sitePath, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		if (Locale.getDefault().toString().indexOf("fr") != -1)
-			assertTrue("plugin info not installed locally:"+pluginFile, pluginFile.exists());
-
-		File featureFile =
-			new File(
-				sitePath,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		if (Locale.getDefault().toString().indexOf("fr") != -1 ||
-				Locale.getDefault().toString().indexOf("us") != -1 ||
-				Locale.getDefault().toString().indexOf("de") != -1)
-		assertTrue("feature info not installed locally", featureFile.exists());
-
-		//cleanup
-		File file =
-			new File(
-				site.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier());
-		UpdateManagerUtils.removeFromFileSystem(file);
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(
-			new File(
-				((InstallConfiguration) localSite.getCurrentConfiguration())
-					.getURL()
-					.getFile()));
-		InstallRegistry.cleanup();
-		
-		site.removeConfiguredSiteChangedListener(listener);
-		assertTrue("Listener hasn't received notification", listener.isNotified());
-	}
-
-//	public void testFileSiteWithoutSiteXML() throws Exception {
-//
-//		ISite remoteSite =
-//			SiteManager.getSite(new URL(SOURCE_FILE_SITE, Site.SITE_XML),true,null);
-//		IFeature remoteFeature = getFeature1(remoteSite);
-//		IConfiguredSite localSite =
-//			SiteManager.getLocalSite().getCurrentConfiguration().getConfiguredSites()[0];
-//		localSite.getSite().install(remoteFeature, null, null);
-//
-//		IFeatureReference[] features = localSite.getSite().getFeatureReferences();
-//		if (features.length == 0)
-//			fail("The local site does not contain feature, should not contain an XML file but features should be found anyway by parsing");
-//		if (localSite.getSite().getArchives().length == 0)
-//			fail("The local site does not contain archives, should not contain an XML file but archives should be found anyway by parsing");
-//
-//		//cleanup
-//		File file =
-//			new File(
-//				localSite.getSite().getURL().getFile()
-//					+ File.separator
-//					+ Site.DEFAULT_INSTALLED_FEATURE_PATH
-//					+ remoteFeature.getVersionedIdentifier());
-//		UpdateManagerUtils.removeFromFileSystem(file);
-//		file =
-//			new File(
-//				localSite.getSite().getURL().getFile()
-//					+ File.separator
-//					+ Site.DEFAULT_PLUGIN_PATH
-//					+ "org.eclipse.update.core.tests.feature1.plugin1_3.5.6");
-//		UpdateManagerUtils.removeFromFileSystem(file);
-//		file =
-//			new File(
-//				localSite.getSite().getURL().getFile()
-//					+ File.separator
-//					+ Site.DEFAULT_PLUGIN_PATH
-//					+ "org.eclipse.update.core.tests.feature1.plugin2_5.0.0");
-//		UpdateManagerUtils.removeFromFileSystem(file);
-//		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-//		UpdateManagerUtils.removeFromFileSystem(localFile);
-//
-//	}
-
-	/**
-	* 
-	*/
-//	private Feature createPackagedFeature(URL url, ISite site)
-//		throws CoreException {
-//		String packagedFeatureType = ISite.DEFAULT_PACKAGED_FEATURE_TYPE;
-//		Feature result = null;
-//		if (packagedFeatureType != null) {
-//			IFeatureFactory factory =
-//				FeatureTypeFactory.getInstance().getFactory(packagedFeatureType);
-//			result = (Feature) factory.createFeature(url, site);
-//		}
-//		return result;
-//	}
-	/*
-	 * @see ISite#getDefaultInstallableFeatureType()
-	 */
-	public String getDefaultInstallableFeatureType() {
-		String pluginID =
-			UpdateCore.getPlugin().getDescriptor().getUniqueIdentifier() + ".";
-		return pluginID + PACKAGED_FEATURE_TYPE;
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestLocalSite.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestLocalSite.java
deleted file mode 100644
index d123f00..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestLocalSite.java
+++ /dev/null
@@ -1,422 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-import java.io.*;
-import java.net.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.model.*;
-import org.eclipse.update.tests.*;
-
-public class TestLocalSite extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestLocalSite(String arg0) {
-		super(arg0);
-	}
-	
-	public void testCreationConfigFile() throws Exception {
-
-		//clean up
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		InternalSiteManager.localSite=null;	
-
-
-		ILocalSite site = SiteManager.getLocalSite();
-		site.save();
-		assertTrue("config file hasn't been saved in :"+localFile.getAbsolutePath(), localFile.exists());
-		
-		// cleanup
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		
-
-	}
-	
-	public void testDefaultConfigFile() throws Exception {
-
-		//clean up
-
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		InternalSiteManager.localSite=null;
-
-		ILocalSite site = SiteManager.getLocalSite();
-		assertTrue("The local site does not contain an history of install configuration",site.getConfigurationHistory().length!=0);
-		assertTrue("The local site does not contain an current install configuration",site.getCurrentConfiguration()!=null);
-		assertTrue("The local site does not contain a default configuration site for the current install config",site.getCurrentConfiguration().getConfiguredSites().length!=0);
-		
-		System.out.println("Default Config Site is :"+site.getCurrentConfiguration().getConfiguredSites()[0].getSite().getURL().toExternalForm());
-		
-		// cleanup	
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		
-
-	}
-	
-/*	public void testInstallFeatureSaveConfig() throws Exception {
-
-		//clean up
-		SiteLocal siteLocal = (SiteLocal)SiteManager.getLocalSite();
-		URL newURL = new URL(siteLocal.getLocationURL(),SiteLocal.SITE_LOCAL_FILE);
-		File localFile = new File(newURL.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)siteLocal.getCurrentConfiguration()).getURL().getFile()));	
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE_INSTALLED);
-		IFeature feature = remoteSite.getFeatureReferences()[0].getFeature();
-		int oldNumber = site.getCurrentConfiguration().getConfiguredSites().length;
-		
-		// we are not checking if this is read only
-		IInstallConfiguration newConfig = site.cloneCurrentConfiguration();
-		newConfig.setLabel("new Label");		
-		//IInstallConfiguration newConfig = site.getCurrentConfiguration();
-		IConfiguredSite configSite = newConfig.getConfiguredSites()[0];
-		ConfigurationPolicyModel configPolicy = new BaseSiteLocalFactory().createConfigurationPolicyModel();
-		configPolicy.setPolicy(IPlatformConfiguration.ISitePolicy.USER_INCLUDE);
-		((ConfiguredSite)configSite).setConfigurationPolicy((ConfigurationPolicy)configPolicy);
-		int oldNumberOfhistory = site.getConfigurationHistory().length;		
-		site.addConfiguration(newConfig);	
-		assertNotNull(feature);	
-
-		((ConfiguredSite)configSite).isUpdatable(true);
-		remove(feature,configSite);				
-		configSite.install(feature,null,null);
-				
-		// teh current one points to a real fature
-		// does not throw error.
-		IConfiguredSite configSite2 = site.getCurrentConfiguration().getConfiguredSites()[0];
-		assertTrue("No Configured features found",configSite.getConfiguredFeatures().length>0);
-		IFeatureReference ref = configSite2.getConfiguredFeatures()[0];
-		IFeature feature2 = ref.getFeature();
-		//String configuredFeature = feature2.getLabel();
-
-		assertEquals(feature2.getVersionedIdentifier().toString(),"org.eclipse.update.core.tests.feature3_1.0.0");
-		assertTrue("Wrong id  version of feature",feature2.getVersionedIdentifier().toString().equalsIgnoreCase("org.eclipse.update.core.tests.feature3_1.0.0"));
-		
-		// only one feature configured
-		assertTrue("too many features configured",configSite2.getConfiguredFeatures().length==1);
-		
-		// no feature unconfigured
-		assertTrue("too many unconfigured features",((ConfiguredSite)configSite2).getConfigurationPolicy().getUnconfiguredFeatures().length==0);
-		
-		// test only 2 install config in local site
-		//assertEquals("wrong number of history in Local site:",oldNumberOfhistory+1,site.getConfigurationHistory().length);
-		
-		// test same # of sites in current config
-		assertTrue("Wrong number of config sites in current config",site.getCurrentConfiguration().getConfiguredSites().length==oldNumber);
-		
-		//test only one feature for the site
-		assertTrue("wrong number of configured features for config site",site.getCurrentConfiguration().getConfiguredSites()[0].getConfiguredFeatures().length==1);
-		
-		// test only 2 activities
-		assertTrue("Wrong number of activities for install config",site.getCurrentConfiguration().getActivities().length==2);
-
-		site.save();		
-
-		// check
-		// there are 2 configuration
-		String time = ""+site.getCurrentConfiguration().getCreationDate().getTime();
-		URL location = ((SiteLocal)site).getLocationURL();
-		File file = new File(new URL(location,"Config"+time+".xml").getFile());
-		assertTrue("new configuration does not exist", file.exists());
-		
-		// cleanup
-		localFile = new File(new URL(location,SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		localFile = new File(new URL(location,SiteLocal.DEFAULT_CONFIG_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		localFile = new File(new URL(location,Site.DEFAULT_FEATURE_PATH+File.separator+feature.getVersionedIdentifier().toString()).getFile());		
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		localFile = new File(new URL(location,Site.DEFAULT_FEATURE_PATH+File.separator+feature2.getVersionedIdentifier().toString()).getFile());		
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		UpdateManagerUtils.removeFromFileSystem(file);		
-		localFile = new File(feature2.getURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-	}
-*/
-	
-	public void testRetriveConfig() throws Exception {
-
-		//clean up
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE_INSTALLED,null);
-		IFeature feature = remoteSite.getFeatureReferences()[0].getFeature(null);
-		int oldNumber = site.getCurrentConfiguration().getConfiguredSites().length;		
-		
-		// we are not checking if this is read only
-		IInstallConfiguration newConfig = site.cloneCurrentConfiguration();
-		newConfig.setLabel("new Label");		
-		IConfiguredSite configSite = newConfig.getConfiguredSites()[0];
-		ConfigurationPolicyModel configPolicy = new BaseSiteLocalFactory().createConfigurationPolicyModel();
-		configPolicy.setPolicy(IPlatformConfiguration.ISitePolicy.USER_INCLUDE);
-		((ConfiguredSite)configSite).setConfigurationPolicyModel((ConfigurationPolicyModel)configPolicy);	
-		int oldNumberOfhistory = site.getConfigurationHistory().length;			
-		site.addConfiguration(newConfig);
-		assertNotNull(feature);			
-		
-		((ConfiguredSite)configSite).setUpdatable(true);
-		remove(feature,configSite);			
-		configSite.install(feature,null,null);
-		site.save();
-		
-		// we created the second xml file
-
-		//do not cleanup, we want to reuse previously created local site
-		// but force re-read of xml File
-		InternalSiteManager.localSite=null;
-		site = SiteManager.getLocalSite();
-		
-		// check
-		// there are 2 configuration
-		String time = ""+site.getCurrentConfiguration().getCreationDate().getTime();
-		URL location = ((SiteLocal)site).getLocationURL();		
-		File file = new File(new URL(location,"platform.xml").getFile());
-		assertTrue("new configuration does not exist", file.exists());
-		
-		// teh current one points to a real fature
-		// does not throw error.
-		IConfiguredSite configSite2 = site.getCurrentConfiguration().getConfiguredSites()[0];
-		IFeatureReference[] refs = configSite2.getConfiguredFeatures();
-		IFeature feature2 = null;
-		for (int i = 0; i < refs.length; i++) {
-			IFeature feature3 = refs[i].getFeature(null);			
-			if ("org.eclipse.update.core.tests.feature3_1.0.0".equals(feature3.getVersionedIdentifier().toString())){
-				feature2 = feature3;
-				break;
-			}		
-		}
-		assertNotNull("Feature 2 is Null",feature2);
-		assertTrue("Wrong id  version of feature",feature2.getVersionedIdentifier().toString().equalsIgnoreCase("org.eclipse.update.core.tests.feature3_1.0.0"));
-		
-		// test only 2 install config in local site
-//		assertEquals("wrong number of history in Local site:",oldNumberOfhistory+1,site.getConfigurationHistory().length);
-		
-		// test # of sites in current config
-		assertTrue("Wrong number of config sites in current config",site.getCurrentConfiguration().getConfiguredSites().length==oldNumber);
-		
-		//test only one feature for the site
-//		assertTrue("wrong number of configured features for config site",site.getCurrentConfiguration().getConfiguredSites()[0].getConfiguredFeatures().length==1);
-		
-		// test only 2 activities
-//		assertTrue("Wrong number of activities for install config",site.getCurrentConfiguration().getActivities().length==2);
-		
-		
-		// cleanup
-		localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		localFile = new File(new URL(location,Site.DEFAULT_FEATURE_PATH+File.separator+feature.getVersionedIdentifier().toString()).getFile());		
-		UpdateManagerUtils.removeFromFileSystem(localFile);					
-		UpdateManagerUtils.removeFromFileSystem(file);		
-	}
-
-/*	public void testRetriveConfigHTTPInstall() throws Exception {
-
-		//clean up
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE,null);
-		IFeature feature = remoteSite.getFeatureReferences()[0].getFeature(null);
-		
-		// we are not checking if this is read only
-		IInstallConfiguration newConfig = site.cloneCurrentConfiguration();
-		newConfig.setLabel("new Label");		
-		IConfiguredSite configSite = newConfig.getConfiguredSites()[0];
-		ConfigurationPolicyModel configPolicy = new BaseSiteLocalFactory().createConfigurationPolicyModel();
-		configPolicy.setPolicy(IPlatformConfiguration.ISitePolicy.USER_INCLUDE);
-		((ConfiguredSite)configSite).setConfigurationPolicyModel((ConfigurationPolicyModel)configPolicy);	
-		int oldNumberOfhistory = site.getConfigurationHistory().length;			
-		site.addConfiguration(newConfig);
-		
-	
-		((ConfiguredSite)configSite).setUpdatable(true);				
-		configSite.install(feature,null,null);
-		site.save();
-
-		//do not cleanup, we want to reuse previously created local site
-		// but force re-read of xml File
-		InternalSiteManager.localSite=null;
-		site = SiteManager.getLocalSite();
-		feature = remoteSite.getFeatureReferences()[0].getFeature(null);
-		int oldNumber = site.getCurrentConfiguration().getConfiguredSites().length;		
-		
-		// check
-		// there are 2 configuration
-		String time = ""+site.getCurrentConfiguration().getCreationDate().getTime();
-		URL location = ((SiteLocal)site).getLocationURL();		
-		File file = new File(new URL(location,"platform.xml").getFile());
-		assertTrue("new configuration does not exist", file.exists());
-		
-		// teh current one points to a real fature
-		// does not throw error.
-		IConfiguredSite configSite2 = site.getCurrentConfiguration().getConfiguredSites()[0];
-		
-		IFeatureReference[] refs = configSite2.getConfiguredFeatures();
-		boolean found = false;
-		IFeature feature2 = null;
-		for (int i = 0; !found && i < refs.length; i++) {
-			IFeature feature3 = refs[i].getFeature(null);			
-			if ("org.test1.ident1_1.0.0".equals(feature3.getVersionedIdentifier().toString())){
-				feature2 = feature3;
-				found = true;
-			}		
-		}
-
-		//String configuredFeature = feature2.getLabel();
-		assertTrue("cannot find feature org.test1.ident1_1.0.0 in configured Site",found);
-		assertTrue("Wrong id  version of feature",feature2.getVersionedIdentifier().toString().equalsIgnoreCase("org.test1.ident1_1.0.0"));
-		
-		// test only 2 install config in local site
-//		assertEquals("wrong number of history in Local site:",oldNumberOfhistory+1,site.getConfigurationHistory().length);
-		
-		// test same number of sites in current config
-		assertTrue("Wrong number of config sites in current config",site.getCurrentConfiguration().getConfiguredSites().length==oldNumber);
-		
-		//test only one feature for the site
-//		assertTrue("wrong number of configured features for config site",site.getCurrentConfiguration().getConfiguredSites()[0].getConfiguredFeatures().length==1);
-		
-		// test only 2 activities
-//		assertTrue("Wrong number of activities for install config",site.getCurrentConfiguration().getActivities().length==2);
-		
-		
-		// cleanup
-		localFile = new File(location.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		localFile = new File(new URL(location,Site.DEFAULT_FEATURE_PATH+File.separator+feature.getVersionedIdentifier().toString()).getFile());		
-		UpdateManagerUtils.removeFromFileSystem(localFile);							
-		UpdateManagerUtils.removeFromFileSystem(file);		
-		localFile = new File(feature2.getURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-	}*/
-	
-//TODO uncomment this once site disabling is supported
-public void testRetriveConfigHTTPInstallNotEnable() throws Exception {
-/*
-	//clean up
-	SiteLocal siteLocal = (SiteLocal)SiteManager.getLocalSite();
-	URL newURL = new URL(siteLocal.getLocationURL(),SiteLocal.SITE_LOCAL_FILE);
-	File localFile = new File(newURL.getFile());
-	UpdateManagerUtils.removeFromFileSystem(localFile);
-	UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)siteLocal.getCurrentConfiguration()).getURL().getFile()));	
-	InternalSiteManager.localSite=null;		
-
-	ILocalSite site = SiteManager.getLocalSite();
-	ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE);
-	IFeature feature = remoteSite.getFeatureReferences()[0].getFeature(null);
-		
-	// we are not checking if this is read only
-	IInstallConfiguration newConfig = site.cloneCurrentConfiguration();
-	newConfig.setLabel("new Label");		
-	IConfiguredSite configSite = newConfig.getConfiguredSites()[0];
-	ConfigurationPolicyModel configPolicy = new BaseSiteLocalFactory().createConfigurationPolicyModel();
-	configPolicy.setPolicy(IPlatformConfiguration.ISitePolicy.USER_INCLUDE);
-	((ConfiguredSite)configSite).setConfigurationPolicyModel((ConfigurationPolicyModel)configPolicy);	
-	int oldNumberOfhistory = site.getConfigurationHistory().length;			
-	site.addConfiguration(newConfig);
-		
-	
-	((ConfiguredSite)configSite).setUpdatable(true);
-	configSite.install(feature,null,null);
-	((ConfiguredSite)configSite).setEnabled(false);	
-	site.save();
-
-	//do not cleanup, we want to reuse previously created local site
-	// but force re-read of xml File
-	InternalSiteManager.localSite=null;
-	site = SiteManager.getLocalSite();
-	feature = remoteSite.getFeatureReferences()[0].getFeature(null);
-	int oldNumber = site.getCurrentConfiguration().getConfiguredSites().length;		
-		
-	// check
-	// there are 2 configuration
-	String time = ""+site.getCurrentConfiguration().getCreationDate().getTime();
-	URL location = ((SiteLocal)site).getLocationURL();		
-	File file = new File(location.getFile());
-	assertTrue("new configuration does not exist", file.exists());
-		
-	// teh current one points to a real fature
-	// does not throw error.
-	IConfiguredSite configSite2 = site.getCurrentConfiguration().getConfiguredSites()[0];
-		
-	IFeatureReference[] refs = configSite2.getConfiguredFeatures();
-	boolean found = false;
-	IFeature feature2 = null;
-	for (int i = 0; !found && i < refs.length; i++) {
-		IFeature feature3 = refs[i].getFeature(null);			
-		if ("org.test1.ident1_1.0.0".equals(feature3.getVersionedIdentifier().toString())){
-			feature2 = feature3;
-			found = true;
-		}		
-	}
-
-	//String configuredFeature = feature2.getLabel();
-	assertTrue("found feature org.test1.ident1_1.0.0 in disabled configured Site",!found);
-		
-	//test no configured features
-//	assertTrue("wrong number of configured features for config site",site.getCurrentConfiguration().getConfiguredSites()[0].getConfiguredFeatures().length==0);
-	
-	
-	configSite2.setEnabled(true);
-	refs = configSite2.getConfiguredFeatures();	
-	for (int i = 0; i < refs.length; i++) {
-		IFeature feature3 = refs[i].getFeature(null);			
-		if ("org.test1.ident1_1.0.0".equals(feature3.getVersionedIdentifier().toString())){
-			feature2 = feature3;
-			found = true;
-		}		
-	}
-
-	//String configuredFeature = feature2.getLabel();
-	assertTrue("cannot find feature org.test1.ident1_1.0.0 in configured Site",found);
-	assertTrue("Wrong id  version of feature",feature2.getVersionedIdentifier().toString().equalsIgnoreCase("org.test1.ident1_1.0.0"));
-		
-	// test only 2 install config in local site
-//	assertEquals("wrong number of history in Local site:",oldNumberOfhistory+1,site.getConfigurationHistory().length);
-		
-	// test same number of sites in current config
-//	assertTrue("Wrong number of config sites in current config",site.getCurrentConfiguration().getConfiguredSites().length==oldNumber);
-		
-	//test only one feature for the site
-//	assertTrue("wrong number of configured features for config site",site.getCurrentConfiguration().getConfiguredSites()[0].getConfiguredFeatures().length==1);
-		
-	// test only 2 activities
-//	assertTrue("Wrong number of activities for install config",site.getCurrentConfiguration().getActivities().length==2);
-		
-		
-	// cleanup
-	localFile = new File(new URL(location,SiteLocal.SITE_LOCAL_FILE).getFile());
-	UpdateManagerUtils.removeFromFileSystem(localFile);		
-	localFile = new File(new URL(location,SiteLocal.DEFAULT_CONFIG_FILE).getFile());
-	UpdateManagerUtils.removeFromFileSystem(localFile);	
-	localFile = new File(new URL(location,Site.DEFAULT_FEATURE_PATH+File.separator+feature.getVersionedIdentifier().toString()).getFile());		
-	UpdateManagerUtils.removeFromFileSystem(localFile);	
-	UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)site.getCurrentConfiguration()).getURL().getFile()));						
-	UpdateManagerUtils.removeFromFileSystem(file);		
-	localFile = new File(feature2.getURL().getFile());
-	UpdateManagerUtils.removeFromFileSystem(localFile);*/
-}
-
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestSpaceInInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestSpaceInInstall.java
deleted file mode 100644
index 5e6e4a9..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestSpaceInInstall.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularInstall;
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestSpaceInInstall extends UpdateManagerTestCase {
-	/**
-	 * Constructor for Test1
-	 */
-	public TestSpaceInInstall(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 *
-	 */
-	public void testSpaceInURL() throws Exception {
-
-		//cleanup target 
-		URL testURL = new URL(TARGET_FILE_SITE,"test site space/"); 
-		String testPath = testURL.getFile();
-		File target = new File(testPath);
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL = new File(dataPath + "Site with space/site.xml").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL,true,null);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		File file = new File(testURL.getFile());
-		if (!file.exists()) file.mkdirs();
-		ISite localSite = SiteManager.getSite(testURL,true,null);
-		IFeature remoteFeature = null;
-		
-		// at least one executable feature and on packaged
-		boolean execFeature = false;
-		boolean packFeature = false;
-
-		if (featuresRef.length==0) fail ("no feature found");
-	
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature(null);
-			remove(remoteFeature,localSite); 
-			localSite.install(remoteFeature, null,null);
-			
-			if (remoteFeature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider) packFeature = true;
-			if (remoteFeature.getFeatureContentProvider() instanceof FeatureExecutableContentProvider) execFeature = true;
-
-			// verify
-			String site = testURL.getFile();
-			IPluginEntry[] entries = remoteFeature.getRawPluginEntries();
-			assertTrue("no plugins entry", (entries != null && entries.length != 0));
-			String pluginName = entries[0].getVersionedIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			assertTrue("plugin files not installed locally", pluginFile.exists());
-
-			File featureFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString());
-			assertTrue("feature info not installed locally:"+featureFile, featureFile.exists());
-
-			File featureFileXML = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString() + File.separator + "feature.xml");
-			assertTrue("feature info not installed locally: no feature.xml", featureFileXML.exists());
-		}
-
-		if (!execFeature && !packFeature){
-			fail("cannot find one executable and one package feature on teh site");
-		}
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}
-	
-	
-	/**
-	 *
-	 */
-	public void testSpaceInHTTPURL() throws Exception {
-
-		//cleanup target  
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		InstallRegistry.cleanup();
-		
-		String path = bundle.getString("HTTP_PATH_3");
-		ISite remoteSite = SiteManager.getSite(new URL("http",getHttpHost(),getHttpPort(),path),true,null);		
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,true,null);
-		IFeature remoteFeature = null;
-		
-		// at least one executable feature and on packaged
-		boolean execFeature = false;
-		boolean packFeature = false;
-
-		if (featuresRef.length==0) fail ("no feature found");
-	
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature(null);
-			localSite.install(remoteFeature, null,null);
-			
-			if (remoteFeature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider) packFeature = true;
-			if (remoteFeature.getFeatureContentProvider() instanceof FeatureExecutableContentProvider) execFeature = true;
-
-			// verify
-			String site = TARGET_FILE_SITE.getFile();			
-			IPluginEntry[] entries = remoteFeature.getRawPluginEntries();
-			assertTrue("no plugins entry", (entries != null && entries.length != 0));
-			String pluginName = entries[0].getVersionedIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			assertTrue("plugin files not installed locally", pluginFile.exists());
-
-			File featureFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString());
-			assertTrue("feature info not installed locally:"+featureFile, featureFile.exists());
-
-			File featureFileXML = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString() + File.separator + "feature.xml");
-			assertTrue("feature info not installed locally: no feature.xml", featureFileXML.exists());
-		}
-
-		if (!execFeature && !packFeature){
-			fail("cannot find one executable and one package feature on teh site");
-		}
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-		InstallRegistry.cleanup();
-
-	}
-		
-		
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/AllRegularRemoveTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/AllRegularRemoveTests.java
deleted file mode 100644
index 937ec75..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/AllRegularRemoveTests.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularRemove;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-
-public class AllRegularRemoveTests extends UpdateManagerTestCase {
-public AllRegularRemoveTests(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Regular Remove Tests");
-	
-	suite.addTest(new TestSuite(TestRemove.class));
-	
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/TestRemove.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/TestRemove.java
deleted file mode 100644
index 4ac13a6..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/TestRemove.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.regularRemove;
-import java.io.File;
-import java.net.MalformedURLException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.configuration.IConfiguredSiteChangedListener;
-import org.eclipse.update.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestRemove extends UpdateManagerTestCase {
-
-	public class Listener implements IConfiguredSiteChangedListener {
-
-		public boolean notified = false;
-
-		public void featureInstalled(IFeature feature) {
-			notified = true;
-			System.out.println("Notified DefaultFeature Installed");
-		}
-
-		public void featureRemoved(IFeature feature) {
-		}
-		public void featureConfigured(IFeature feature) {
-		};
-		public void featureUnconfigured(IFeature feature) {
-		};
-
-		public boolean isNotified() {
-			return notified;
-		}
-	}
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestRemove(String arg0) {
-		super(arg0);
-	}
-
-	private IFeature getFeature1(ISite site)
-		throws MalformedURLException, CoreException {
-		//URL url = UpdateManagerUtils.getURL(site.getURL(), "features/org.eclipse.update.core.tests.feature1_1.0.4.jar", null);
-		SiteFeatureReference ref = new SiteFeatureReference();
-		ref.setSite(site);
-		ref.setURLString("features/org.eclipse.update.core.tests.feature1_1.0.4.jar");
-		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-		ref.resolve(site.getURL(), null);
-		return ref.getFeature(null);
-	}
-
-	public void testRemoveFeature() throws Exception {
-
-		// install feature
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE,null);
-		IFeature remoteFeature = getFeature1(remoteSite);
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE,null);
-		IFeatureReference ref = localSite.install(remoteFeature, null, null);
-
-		// then remove it
-		assertNotNull("Feature is null",ref.getFeature(null));
-		String featureRef = ref.getFeature(null).getVersionedIdentifier().toString();
-		localSite.remove(ref.getFeature(null), null);
-
-		// verify
-		String site = TARGET_FILE_SITE.getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin files installed locally", !pluginFile.exists());
-
-		File featureFile =
-			new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + featureRef);
-		assertTrue(
-			"feature info installed locally:" + featureFile,
-			!featureFile.exists());
-
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/sitevalidation/AllSiteValidationTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/sitevalidation/AllSiteValidationTests.java
deleted file mode 100644
index 7d063a9..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/sitevalidation/AllSiteValidationTests.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.sitevalidation;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-public class AllSiteValidationTests extends UpdateManagerTestCase {
-	public AllSiteValidationTests(String name) {
-		super(name);
-	}
-	public static Test suite() {
-		TestSuite suite = new TestSuite();
-		suite.setName("Site Validation Tests");
-
-		// the following will take all teh test methods in teh class that start with 'test'
-
-		suite.addTest(new TestSuite(TestSiteValidation.class));
-
-		return suite;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/sitevalidation/TestSiteValidation.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/sitevalidation/TestSiteValidation.java
deleted file mode 100644
index b608ce7..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/sitevalidation/TestSiteValidation.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.sitevalidation;
-import java.io.*;
-import java.net.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.configurator.IPlatformConfiguration.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.tests.*;
-
-public class TestSiteValidation extends UpdateManagerTestCase {
-
-
-	/**
-	 * Constructor 
-	 */
-	public TestSiteValidation(String arg0) {
-		super(arg0);
-	}
-
-	private void removeConfigSite(URL url) throws Exception {
-		// get new config object
-		IPlatformConfiguration cfig = ConfiguratorUtils.getCurrentPlatformConfiguration();
-		ISiteEntry s1 = cfig.findConfiguredSite(url);
-		assertNotNull("Unable to find site entry:"+url,s1);
-		cfig.unconfigureSite(s1);
-	}
-
-	public void testSite1() throws Exception {
-
-		URL remoteUrl = new URL(TARGET_FILE_SITE + "validation/site1/eclipse");
-		File file = new File(remoteUrl.getFile());
-		ILocalSite local = SiteManager.getLocalSite();
-		IInstallConfiguration currentConfig = local.getCurrentConfiguration();
-		file.mkdirs();
-		IConfiguredSite configuredSite = currentConfig.createConfiguredSite(file);
-		IStatus status = configuredSite.verifyUpdatableStatus();
-
-		String msg = "The site "+file+" should be updatable.";
-		if (!status.isOK()){
-			fail(msg+status.getMessage());
-		}
-		currentConfig.removeConfiguredSite(configuredSite);
-		removeConfigSite(configuredSite.getSite().getURL());
-	}
-	
-	public void testSite2() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "validation/site2/eclipse/");
-		File file = new File(remoteUrl.getFile());
-		ILocalSite local = SiteManager.getLocalSite();
-		IInstallConfiguration currentConfig = local.getCurrentConfiguration();
-		IConfiguredSite configuredSite;
-		try {
-		 configuredSite = currentConfig.createConfiguredSite(file);
-		} catch (CoreException e){
-			return;
-		}
-		IStatus status = configuredSite.verifyUpdatableStatus();
-
-//		UpdateManagerUtils.removeFromFileSystem(new File(file,".eclipseUM"));
-
-		String msg = "The site "+file+" should not be updatable.";
-		if (status.isOK()){
-			fail(msg+status.getMessage());
-		}
-		if (status.getMessage().indexOf("This site is contained in another site:")==-1){
-			fail("Wrong validation:"+status.getMessage());
-		}
-	}	
-
-	public void testSite3() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "validation/site3/eclipse/");
-		File file = new File(remoteUrl.getFile());
-		ILocalSite local = SiteManager.getLocalSite();
-		IInstallConfiguration currentConfig = local.getCurrentConfiguration();
-		IConfiguredSite configuredSite = currentConfig.createConfiguredSite(file);
-		IStatus status = configuredSite.verifyUpdatableStatus();
-
-//		UpdateManagerUtils.removeFromFileSystem(new File(file,".eclipseUM"));
-
-		String msg = "The site "+file+" should not be updatable.";
-		if (status.isOK()){
-			fail(msg+status.getMessage());
-		}
-//		if (status.getMessage().indexOf("This site is contained in another site:")==-1){
-//			fail("Wrong validation:"+status.getMessage());
-//		}
-	}	
-
-	public void testSite4() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "validation/site4/eclipse/");
-		File file = new File(remoteUrl.getFile());
-		ILocalSite local = SiteManager.getLocalSite();
-		IInstallConfiguration currentConfig = local.getCurrentConfiguration();
-		IConfiguredSite configuredSite = currentConfig.createConfiguredSite(file);
-		IStatus status = configuredSite.verifyUpdatableStatus();
-
-		String msg = "The site "+file+" should not be updatable.";
-		if (status.isOK()){
-			fail(msg+status.getMessage());
-		}
-		if (status.getMessage().indexOf("The site cannot be modified by this product. It is already associated with product:")==-1){
-			fail("Wrong validation:"+status.getMessage());
-		}
-	}	
-
-	public void testSite5() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "validation/site5/");
-		File file = new File(remoteUrl.getFile());
-		ILocalSite local = SiteManager.getLocalSite();
-		IInstallConfiguration currentConfig = local.getCurrentConfiguration();
-		IConfiguredSite configuredSite = currentConfig.createConfiguredSite(file);
-		IStatus status = configuredSite.verifyUpdatableStatus();
-
-		String msg = "The site "+file+" should be updatable.";
-		if (!status.isOK()){
-			fail(msg+status.getMessage());
-		}
-		
-			// get new config object
-		URL url = configuredSite.getSite().getURL();
-		IPlatformConfiguration cfig = ConfiguratorUtils.getCurrentPlatformConfiguration();
-		ISiteEntry s1 = cfig.findConfiguredSite(url);
-		assertNotNull("Site entry not found:"+url,s1);
-		cfig.unconfigureSite(s1);
-		cfig.save();
-	}
-	
-	public void testSite6() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "validation/site6/children/children/eclipse/");
-		File file = new File(remoteUrl.getFile());
-		if (!file.exists()) file.mkdirs();
-		ILocalSite local = SiteManager.getLocalSite();
-		IInstallConfiguration currentConfig = local.getCurrentConfiguration();
-		IConfiguredSite configuredSite = currentConfig.createConfiguredSite(file);
-		IStatus status = configuredSite.verifyUpdatableStatus();
-
-//		UpdateManagerUtils.removeFromFileSystem(new File(file,".eclipseUM"));
-
-		String msg = "The site "+file+" should not be updatable.";
-		if (status.isOK()){
-			fail(msg+status.getMessage());
-		}
-//		if (status.getMessage().indexOf("This site is contained in another site:")==-1){
-//			fail("Wrong validation:"+status.getMessage());
-//		}
-	}	
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/AllStandaloneTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/AllStandaloneTests.java
deleted file mode 100644
index bb60c51..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/AllStandaloneTests.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.standalone;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-public class AllStandaloneTests extends UpdateManagerTestCase{
-
-	public AllStandaloneTests(String name){
-		super(name);
-	}
-	
-	public static Test suite(){
-		TestSuite suite = new TestSuite();
-		suite.setName("Standalone Tests");
-		
-		// the following will take all the test methods in 
-		// the class that start with "test"
-		suite.addTest(new TestSuite(TestFeatureInstall.class));
-		suite.addTest(new TestSuite(TestFeatureUpdate.class));
-		suite.addTest(new TestSuite(TestFeatureEnable.class));
-		suite.addTest(new TestSuite(TestFeatureDisable.class));
-		suite.addTest(new TestSuite(TestFeatureUninstall.class));
-		suite.addTest(new TestSuite(TestBundlesInstall.class));
-		//and this one's for fun :)
-//		suite.addTest(new TestSuite(TestSiteSearch.class));
-		
-		return suite;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/StandaloneManagerTestCase.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/StandaloneManagerTestCase.java
deleted file mode 100644
index ece2944..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/StandaloneManagerTestCase.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.standalone;
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.configurator.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.*;
-
-public class StandaloneManagerTestCase extends UpdateManagerTestCase {
-	public static StringBuffer errOutput;
-	public static Integer exitValue= new Integer(-1);
-	public static URL TARGET_FILE_SITE;
-	private boolean oldCache = false;
-	
-	static {
-		File targetDir = new File(System.getProperty("java.io.tmpdir"));
-		targetDir = new File(targetDir, "standalone");
-		targetDir = new File(targetDir, "mytarget");
-		if (targetDir.exists())
-			deleteDirectory(targetDir);
-		try {
-			TARGET_FILE_SITE = targetDir.toURL();
-		} catch (MalformedURLException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	public StandaloneManagerTestCase (String arg0){
-		super(arg0);
-	}
-	
-	/**
-	 * Sets up the fixture, for example, open a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected void umSetUp() {
-		// setup cache site to true
-		oldCache = InternalSiteManager.globalUseCache;
-		InternalSiteManager.globalUseCache = true;
-	}
-	
-	/**
-	 * Tears down the fixture, for example, close a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected void umTearDown() {
-		// do nothing.
-		InternalSiteManager.globalUseCache = oldCache;
-	}
-	
-	public void checkConfiguredSites(){
-		ILocalSite localSite;
-		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
-		try {
-			localSite = SiteManager.getLocalSite();
-			System.out.println("LocalSite: " + localSite.getCurrentConfiguration().getLabel());
-		
-		//Get site to install to
-		IInstallConfiguration currentConfig = localSite.getCurrentConfiguration();
-		IConfiguredSite[] sites = currentConfig.getConfiguredSites();
-//	
-//			// start of config site print
-		System.out.println("GETTING CONFIGURED SITES...");
-		for (int i = 0; i<sites.length; i++){
-			System.out.println("site #" + i + ": " + sites[i].getSite().getURL().getFile());
-		}
-		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
-		} catch (CoreException e) {
-			System.err.println(e);
-		}
-	}
-	
-	// get the first configured site found because this is the one we're most likely to 
-	// have installed into
-	public ISite getConfiguredSite(URL target){
-		try {
-			ILocalSite local = SiteManager.getLocalSite();
-			IInstallConfiguration currentConfig = local.getCurrentConfiguration();
-			IConfiguredSite[] sites = currentConfig.getConfiguredSites();
-			System.out.println("\nretrieving configured sites...");
-			String targetFile = new File(target.getFile()).getAbsolutePath();
-			for (int i = 0; i<sites.length ; i++){
-				System.out.println("site["+i+"]: " + sites[i].getSite().getURL());
-				String siteFile = new File(sites[i].getSite().getURL().getFile()).getAbsolutePath();
-				if (targetFile.equals(siteFile))
-					return sites[i].getSite();
-			}
-			if (sites.length == 0)
-				return null;
-			return sites[0].getSite();
-		} catch (CoreException e) {
-			System.err.println(e);
-			return null;
-		}
-	}
-	//WatchDog thread to kill mirroring process if it hangs (or takes too long)
-	public static class Timer extends Thread{
-		private Process proc;
-		
-		public Timer(Process proc){
-			super();
-			this.setDaemon(true);
-			this.proc = proc;
-		}
-		
-		public void run(){
-			try {
-				// sleep time 5min
-				sleep(300000); 
-				System.out.println("destroying process");
-				proc.destroy();
-			} catch (Exception e) {
-				System.err.println(e);
-				e.printStackTrace();
-			}
-		}
-	}
-	
-	// StreamConsumer to display output to output files or console
-	public static class StreamConsumer extends Thread {
-		private BufferedReader bReader;
-
-		public StreamConsumer(InputStream inputStream) {
-			super();
-			setDaemon(true);
-			bReader = new BufferedReader(new InputStreamReader(inputStream));
-			errOutput = new StringBuffer();
-		}
-
-		public void run() {
-			try {
-				String line;
-				while (null != (line = bReader.readLine())) {
-					System.err.println(line);
-					errOutput.append(line);
-					errOutput.append("\n");
-				}
-			} catch (IOException e) {
-				System.err.println(e);
-				e.printStackTrace();
-			}
-		}
-	}
-	
-	/**
-	 * @param command : command argument to run on site/feature 
-	 * (i.e. 'install', 'enable', 'disable', 'update') *<i>required</i>*
-	 * @param fid : feature id of the feature being installed, enabled, etc.
-	 * (optional - can be null)
-	 * @param ver : version of feature being installed, enabled, etc. (optional - can be null)
-	 * @param config : location of configuration info (i.e. file:D:\temp\.config\)
-	 * @param remoteLoc : remote site url (required for installing/searching from remote site)
-	 * @param localLoc : target site directory (required unless updating/searching)
-	 * @return a string array consisting of commands and their arguments to
-	 * be run
-	 */
-	public String[] getCommand(
-		String command,
-		String fid,
-		String ver,
-		String config,
-		String remoteLoc,
-		String localLoc){
-		final String classpath = "startup.jar";
-		final String launcher = "org.eclipse.core.launcher.Main";
-		final String application = "org.eclipse.update.core.standaloneUpdate";
-		final String FLAG_CP = "-cp";
-		final String FLAG_APP = "-application";
-		final String FLAG_CMD = "-command";
-		final String FLAG_FID = "-featureId";
-		final String FLAG_DATA = "-data";
-		final String FLAG_VERSION = "-version";
-		final String FLAG_FROM = "-from";
-		final String FLAG_TO = "-to";
-		final String FLAG_CONFIG = "-configuration";
-//		final String FLAG_URL = "-mirrorURL";
-		final String FLAG_SPLASH = "-nosplash";
-		final String FLAG_CONSOLELOG = "-consolelog";
-		final String data =
-			UpdateCore.getPlugin().getStateLocation().toOSString();
-		String[] cmd =
-			new String[] {
-				getJavaVMPath(),
-				FLAG_CP,
-				classpath,
-				launcher,
-				FLAG_APP,
-				application,
-				FLAG_CMD,
-				command,
-				(remoteLoc !=null ? FLAG_FROM : ""),
-				(remoteLoc !=null ? remoteLoc : ""),
-				(localLoc !=null ? FLAG_TO : ""),
-				(localLoc !=null ?localLoc.replaceFirst("file:", "") : ""),
-				(fid != null ? FLAG_FID : ""),
-				(fid != null ? fid : ""),
-				(ver != null ? FLAG_VERSION : ""),
-				(ver != null ? ver : ""),
-				(config != null ? FLAG_CONFIG : ""),
-				(config != null ? config : ""),
-				FLAG_SPLASH,
-				FLAG_DATA,
-				data,
-				FLAG_CONSOLELOG};
-		for (int i = 0 ;i<cmd.length; i++){
-			System.out.print(cmd[i] + " ");			
-		}System.out.println();
-		return cmd;
-	}
-	
-	public String getJavaVMPath() {
-		// Create command string for launching the process
-		String vm = System.getProperty("java.vm.name");
-		String executable = "J9".equals(vm) ? "j9" : "java";
-		if (org.eclipse.osgi.service.environment.Constants.OS_WIN32.equals(Platform.getOS()))
-			executable += "w.exe";
-
-		String javaInstallDir =
-			System.getProperty("java.home") + File.separator + "bin";
-		return javaInstallDir + File.separator + executable;
-	}
-	
-	public int performAction(String[] cmd) {
-		File file = new File(getEclipseRoot());
-		try {
-
-			Process proc =
-				Runtime.getRuntime().exec(cmd, (String[]) null, file);
-
-			StreamConsumer outputs = new StreamConsumer(proc.getInputStream());
-			outputs.start();
-			StreamConsumer errors = new StreamConsumer(proc.getErrorStream());
-			errors.start();
-			Timer timer = new Timer(proc);
-			timer.start();
-
-			return proc.waitFor();
-		} catch (IOException e) {
-			System.err.println(e);
-		} catch (InterruptedException e) {
-			System.err.println(e);
-		} catch (Exception e) {
-			System.err.println(e);
-		}
-		return -1;
-	}
-	
-	public String getEclipseRoot() {
-		return ConfiguratorUtils.getInstallURL().toExternalForm().replaceFirst(
-			"file:",
-			"");
-	}
-	
-	public ArrayList getArrayList(String[] list){
-		ArrayList temp = new ArrayList();
-		for(int i = 0; i< list.length; i++){
-			temp.add(list[i]);
-		}
-		return temp;
-	}
-	
-	public File getLatestConfigurationFile(File localFile) {
-
-		try {
-			System.out.println("reading from : " + localFile.getAbsolutePath());
-				FileReader freader = new FileReader(localFile);
-				BufferedReader breader = new BufferedReader(freader);
-				String configFileName="", line;
-				while (breader.ready()) {
-					line = breader.readLine();
-//					System.out.println(line);
-					if (line.trim().startsWith("<config url")) {
-						configFileName = line.split("\"")[1];
-					}
-				}
-				// read config file
-				File parent = new File(localFile.getParent());
-				System.out.println("parent: " + parent.getAbsolutePath());
-				String[] parList = parent.list();
-				int latest = 0; 
-				for (int i = parList.length-1; i>=0; i--){
-					System.out.println("parList[" + i + "]: " + parList[i]);
-					if (parList[i].startsWith("platform")){
-						latest = i;
-						break;
-					}
-				}
-				File configFile = new File(parent.getAbsolutePath() + File.separator + parList[latest]);
-				return configFile;
-				// end of config file read
-		} catch (Exception e) {
-			System.err.println(e);
-			e.printStackTrace();
-		}
-		return localFile;
-	}
-	
-	private static void deleteDirectory(File dir) {
-		File[] list = dir.listFiles();
-		if (list == null)
-			return;
-			
-		for (int i=0; i<list.length; i++) {
-			if (list[i].isDirectory()) 
-				deleteDirectory(list[i]);
-			if (!list[i].delete())
-				System.out.println("Unable to delete "+list[i].toString());
-		}
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestBundlesInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestBundlesInstall.java
deleted file mode 100644
index bb04678..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestBundlesInstall.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.standalone;
-
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.standalone.*;
-
-
-public class TestBundlesInstall extends StandaloneManagerTestCase {
-	private static boolean isInstalled;
-
-	public TestBundlesInstall(String arg0) {
-		super(arg0);
-		isInstalled = false;
-	}
-
-	public void umSetUp() {
-		super.umSetUp();
-		//System.out.println("looking at configured sites available....");
-		//checkConfiguredSites();
-		
-		String featureId = "com.example.bundle.feature";
-		String version = "1.0.0";
-
-		String fromRemoteSiteUrl = "http://"+getHttpHost()+":"+ getHttpPort()+ "/org.eclipse.update.tests.core.updatetests/bundleSite/";;
-		if (!isInstalled) {
-			System.out.println(
-				"==============" + this.getClass() + "=============");
-			StandaloneUpdateApplication app = new StandaloneUpdateApplication();
-			try {
-				exitValue = (Integer)app.run(getCommand(
-					"install",
-					featureId,
-					version,
-					null,
-					fromRemoteSiteUrl,
-					TARGET_FILE_SITE.getFile()));
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			isInstalled = true;
-		}
-		
-	}
-
-	public void testPluginsExist() {
-		ISite localSite = getConfiguredSite(TARGET_FILE_SITE);
-		
-		System.out.println("localSite: " + localSite.getURL().getFile());
-		IPluginEntry[] pluginEntries = localSite.getPluginEntries();
-		ArrayList list = new ArrayList();
-		if (pluginEntries == null || pluginEntries.length == 0){
-			System.err.println("No plugin entries on the target site");
-			fail("No plugin entries on the target site");
-		} else{
-			for (int i = 0; i < pluginEntries.length; i++){
-				System.out.println("found plugin: " + pluginEntries[i].getVersionedIdentifier().toString());
-				list.add(pluginEntries[i].getVersionedIdentifier().toString());
-			}
-		}
-
-		String[] pluginNames =
-			{	"com.example.bundle.plugin_1.0.0",
-				"com.example.bundle.plugin.ui_2.0.0",
-				"com.example.bundle.fragment_1.0.0",
-				"com.example.budle.fragment.ui_1.0.0"};
-		assertTrue(checkFilesInList(pluginNames, list));
-	}
-
-	public void testFeaturesExist() {
-		try {
-			ISite localSite =  getConfiguredSite(TARGET_FILE_SITE);
-
-			System.out.println("localSite: " + localSite.getURL().getFile());
-			// get feature references 
-			IFeatureReference[] localFeatures =
-				localSite.getFeatureReferences();
-			System.out.println("local currentCOnfigSite: " + localSite.getCurrentConfiguredSite());
-			ArrayList list = new ArrayList();
-			if (localFeatures == null || localFeatures.length == 0){
-				System.err.println("No features on the target site");
-				fail("No features on the target site");
-			} else {
-				for (int i = 0; i < localFeatures.length; i++)
-					list.add(localFeatures[i].getVersionedIdentifier().toString());
-			}
-			String[] featureNames =
-				{
-					"com.example.bundle.feature_1.0.0"};
-			assertTrue(checkFilesInList(featureNames, list));
-		} catch (CoreException e) {
-			System.err.println(e);
-		}
-	}
-
-	// makes sure all files/directories in "names" are in the directory listing "list"
-	public boolean checkFilesInList(
-		String[] names,
-		ArrayList list) {
-		
-		for (int i = 0; i < names.length; i++) {
-			System.out.println(names[i]);
-			if (!list.contains(names[i])){
-				return false;
-			}
-		}
-		return true;
-	}
-
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		System.out.println("exitValue: " + exitValue);
-		assertEquals(exitValue, IPlatformRunnable.EXIT_OK);
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureDisable.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureDisable.java
deleted file mode 100644
index 3b332a2..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureDisable.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.standalone;
-
-import java.io.*;
-import java.util.*;
-
-import org.eclipse.core.runtime.IPlatformRunnable;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.standalone.*;
-
-public class TestFeatureDisable extends StandaloneManagerTestCase {
-	public static boolean isDisabled;
-	
-	public TestFeatureDisable(String arg0) {
-		super(arg0);
-		isDisabled = false;
-	}
-
-	public void umSetUp() {
-		super.umSetUp();
-		
-		String featureId = "my.alphabet";
-		String version = "1.0.0";
-
-		checkConfiguredSites();
-		if (!isDisabled) {
-			System.out.println(
-				"==============" + this.getClass() + "=============");
-			StandaloneUpdateApplication app = new StandaloneUpdateApplication();
-			try {
-				exitValue = (Integer)app.run(getCommand(
-					"disable",
-					featureId,
-					version,
-					null,
-					null,
-					TARGET_FILE_SITE.getFile()));
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			isDisabled = true;
-			checkConfiguredSites();
-		}
-	}
-	
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		System.out.println("exitValue: " + exitValue);
-		assertEquals(exitValue, IPlatformRunnable.EXIT_OK);
-	}
-
-	public void testFeatureStatus() throws Exception {
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		System.out.println(localFile.getAbsolutePath());
-		assertTrue(localFile.exists());
-		File configFile = getLatestConfigurationFile(localFile);
-	
-		String[] names =
-			{
-				"features/my.alphabet.round.letters_1.0.0/",
-				"features/my.alphabet.straight.letters_1.0.0/",
-				"features/my.alphabet_1.0.0/" };
-		assertTrue(configFile.exists());
-		assertTrue(checkFeaturesDisabled(getArrayList(names),configFile, TARGET_FILE_SITE.getFile()));
-	}
-
-	public boolean checkFeaturesDisabled(ArrayList featureNames, File configFile, String siteLocation){
-		try {
-			FileReader freader = new FileReader(configFile);
-			BufferedReader breader = new BufferedReader(freader);
-			String line;
-			System.out.println("now reading..." + configFile.getAbsolutePath());
-			boolean isSiteToCheck = false;
-			while (breader.ready()) {
-				line = breader.readLine();
-				if (line.trim().startsWith("<site url")){
-					isSiteToCheck = line.trim().split("\"")[1].replaceFirst("file:","").equals(siteLocation);
-				} else if (isSiteToCheck && line.trim().startsWith("<feature configured")){
-					System.err.println(line);
-					String[] configLine = line.split("\"");
-					if (featureNames.contains(configLine[3]) && configLine[1].equals("true")){
-						fail(configLine[3] + " has not been disabled.");
-					}
-				}
-			}
-		} catch (Exception e) {
-			System.err.println(e);
-		} 
-		return true;
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureEnable.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureEnable.java
deleted file mode 100644
index dad8983..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureEnable.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.standalone;
-
-import java.io.*;
-import java.util.*;
-
-import org.eclipse.core.runtime.IPlatformRunnable;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.standalone.*;
-
-public class TestFeatureEnable extends StandaloneManagerTestCase {
-	public static boolean isEnabled;
-	
-	public TestFeatureEnable(String arg0) {
-		super(arg0);
-		isEnabled = false;
-	}
-
-	public void umSetUp() {
-
-		super.umSetUp();
-		
-		String featureId = "my.alphabet";
-		String version = "1.0.0";
-
-		checkConfiguredSites();
-		if (!isEnabled) {
-			System.out.println(
-				"==============" + this.getClass() + "=============");
-			StandaloneUpdateApplication app = new StandaloneUpdateApplication();
-			try {
-				exitValue = (Integer)app.run(getCommand(
-					"enable",
-					featureId,
-					version,
-					null,
-					null,
-					TARGET_FILE_SITE.getFile()));
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			isEnabled = true;
-			checkConfiguredSites();
-		}
-	}
-	
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		System.out.println("exitValue: " + exitValue);
-		assertEquals(exitValue, IPlatformRunnable.EXIT_OK);
-	}
-
-	public void testFeatureStatus() throws Exception {
-	
-		File localFile = new File(((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile());
-		System.out.println(localFile.getAbsolutePath());
-		assertTrue(localFile.exists());
-		File configFile = getLatestConfigurationFile(localFile);
-		
-		String[] names =
-			{
-				"features/my.alphabet.round.letters_1.0.0/",
-				"features/my.alphabet.straight.letters_1.0.0/",
-				"features/my.alphabet_1.0.0/" };
-		assertTrue(configFile.exists());
-		assertTrue(checkFeaturesEnabled(getArrayList(names),configFile, TARGET_FILE_SITE.getFile()));
-	}
-
-	public boolean checkFeaturesEnabled(ArrayList featureNames, File configFile, String siteLocation){
-		try {
-			FileReader freader = new FileReader(configFile);
-			BufferedReader breader = new BufferedReader(freader);
-			String line;
-			System.out.println("now reading..." + configFile.getAbsolutePath());
-			boolean isSiteToCheck = false;
-			while (breader.ready()) {
-				line = breader.readLine();
-				if (line.trim().startsWith("<site url")){
-					isSiteToCheck = line.trim().split("\"")[1].replaceFirst("file:","").equals(siteLocation);
-				} else if (isSiteToCheck && line.trim().startsWith("<feature configured")){
-					System.err.println(line);
-					String[] configLine = line.split("\"");
-					if (featureNames.contains(configLine[3]) && configLine[1].equals("false")){
-						fail(configLine[3] + " has not been enabled.");
-					}
-					// temp - delete later
-					if (featureNames.contains(configLine[3]))
-						System.err.println(line);
-					// end of temp delete
-				}
-			}
-		} catch (Exception e) {
-			System.err.println(e);
-		} 
-		return true;
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureInstall.java
deleted file mode 100644
index 19fcbcd..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureInstall.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.standalone;
-
-
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.standalone.*;
-
-
-public class TestFeatureInstall extends StandaloneManagerTestCase {
-	private static boolean isInstalled;
-
-	public TestFeatureInstall(String arg0) {
-		super(arg0);
-		isInstalled = false;
-	}
-
-	public void umSetUp() {
-		super.umSetUp();
-		//System.out.println("looking at configured sites available....");
-		//checkConfiguredSites();
-		
-		String featureId = "my.alphabet";
-		String version = "1.0.0";
-
-		String fromRemoteSiteUrl =
-			"http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-update-home/3.0/site/";
-		if (!isInstalled) {
-			System.out.println(
-				"==============" + this.getClass() + "=============");
-			StandaloneUpdateApplication app = new StandaloneUpdateApplication();
-			try {
-				exitValue = (Integer)app.run(getCommand(
-					"install",
-					featureId,
-					version,
-					null,
-					fromRemoteSiteUrl,
-					TARGET_FILE_SITE.getFile()));
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			isInstalled = true;
-		}
-		
-	}
-
-	public void testPluginsExist() {
-		ISite localSite = getConfiguredSite(TARGET_FILE_SITE);
-		
-		System.out.println("localSite: " + localSite.getURL().getFile());
-		IPluginEntry[] pluginEntries = localSite.getPluginEntries();
-		ArrayList list = new ArrayList();
-		if (pluginEntries == null || pluginEntries.length == 0){
-			System.err.println("No plugin entries on the target site");
-			fail("No plugin entries on the target site");
-		} else{
-			for (int i = 0; i < pluginEntries.length; i++){
-				System.out.println("found plugin: " + pluginEntries[i].getVersionedIdentifier().toString());
-				list.add(pluginEntries[i].getVersionedIdentifier().toString());
-			}
-		}
-
-		String[] pluginNames =
-			{	"my.alphabet.letter.a_1.0.0",
-				"my.alphabet.letter.b_1.0.0",
-				"my.alphabet.letter.c_1.0.0",
-				"my.alphabet.letter.e_1.0.0",
-				"my.alphabet.round.letters_1.0.0",
-				"my.alphabet.straight.letters_1.0.0",
-				"my.alphabet_1.0.0" };
-		assertTrue(checkFilesInList(pluginNames, list));
-	}
-
-	public void testFeaturesExist() {
-		try {
-			ISite localSite =  getConfiguredSite(TARGET_FILE_SITE);
-
-			System.out.println("localSite: " + localSite.getURL().getFile());
-			// get feature references 
-			IFeatureReference[] localFeatures =
-				localSite.getFeatureReferences();
-			System.out.println("local currentCOnfigSite: " + localSite.getCurrentConfiguredSite());
-			ArrayList list = new ArrayList();
-			if (localFeatures == null || localFeatures.length == 0){
-				System.err.println("No features on the target site");
-				fail("No features on the target site");
-			} else {
-				for (int i = 0; i < localFeatures.length; i++)
-					list.add(localFeatures[i].getVersionedIdentifier().toString());
-			}
-			String[] featureNames =
-				{
-					"my.alphabet.round.letters_1.0.0",
-					"my.alphabet.straight.letters_1.0.0",
-					"my.alphabet_1.0.0" };
-			assertTrue(checkFilesInList(featureNames, list));
-		} catch (CoreException e) {
-			System.err.println(e);
-		}
-	}
-
-	// makes sure all files/directories in "names" are in the directory listing "list"
-	public boolean checkFilesInList(
-		String[] names,
-		ArrayList list) {
-		
-		for (int i = 0; i < names.length; i++) {
-			System.out.println(names[i]);
-			if (!list.contains(names[i])){
-				return false;
-			}
-		}
-		return true;
-	}
-
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		System.out.println("exitValue: " + exitValue);
-		assertEquals(exitValue, IPlatformRunnable.EXIT_OK);
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureUninstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureUninstall.java
deleted file mode 100644
index a256646..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureUninstall.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.standalone;
-
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.standalone.*;
-
-
-public class TestFeatureUninstall extends StandaloneManagerTestCase {
-	public static boolean isUninstalled;
-	
-	public TestFeatureUninstall(String arg0){
-		super(arg0);
-		isUninstalled = false;
-	}
-	
-	public void umSetUp() {
-		super.umSetUp();
-		System.out.println("looking at configured sites available....");
-		checkConfiguredSites();
-		
-		String featureId = "my.alphabet";
-		String version = "1.0.0";
-
-		if(!isUninstalled){
-			System.out.println(
-				"==============" + this.getClass() + "=============");
-			StandaloneUpdateApplication app = new StandaloneUpdateApplication();
-			try {
-				exitValue = (Integer)app.run(getCommand(
-					"uninstall",
-					featureId,
-					version,
-					null,
-					null,
-					TARGET_FILE_SITE.getFile()));
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			isUninstalled = true;
-		}
-	}
-	
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		System.out.println("exitValue: " + exitValue);
-		assertEquals(exitValue, IPlatformRunnable.EXIT_OK);
-	}
-	
-	public void testFeaturesUninstalled() throws Exception {
-		try {
-			ISite localSite = getConfiguredSite(TARGET_FILE_SITE);
-			
-			// get feature references 
-			IFeatureReference[] localFeatures =
-				localSite.getFeatureReferences();
-			ArrayList list = new ArrayList();
-			if (localFeatures == null || localFeatures.length == 0){
-				fail("No features on the target site");
-			} else {
-				for (int i = 0; i < localFeatures.length; i++)
-					list.add(localFeatures[i].getVersionedIdentifier().toString());
-			}
-			String[] featureNames =
-				{
-					"my.alphabet.round.letters_1.0.0",
-					"my.alphabet.straight.letters_1.0.0",
-					"my.alphabet_1.0.0" };
-			assertTrue(checkFilesNotInList(featureNames, list));
-		} catch (CoreException e) {
-			System.err.println(e);
-		}
-	}
-	
-	public void testPluginsUninstalled() throws Exception {
-			ISite localSite = getConfiguredSite(TARGET_FILE_SITE);
-			
-			IPluginEntry[] pluginEntries = localSite.getPluginEntries();
-			ArrayList list = new ArrayList();
-			if (pluginEntries == null || pluginEntries.length == 0)
-				fail("No plugin entries on the target site");
-			else
-				for (int i = 0; i < pluginEntries.length; i++){
-					list.add(pluginEntries[i].getVersionedIdentifier().toString());
-					System.out.println("plugin found: " + pluginEntries[i].getVersionedIdentifier().toString());
-				}
-
-			String[] pluginNames =
-				{	"my.alphabet.letter.a_1.0.0",
-					"my.alphabet.letter.b_1.0.0",
-					"my.alphabet.letter.c_1.0.0",
-					"my.alphabet.letter.e_1.0.0",
-					"my.alphabet.round.letters_1.0.0",
-					"my.alphabet.straight.letters_1.0.0",
-					"my.alphabet_1.0.0" };
-			assertTrue(checkFilesNotInList(pluginNames, list));	
-	}
-	
-	// makes sure all files/directories in "names" are NOT in the directory listing "list"
-	public boolean checkFilesNotInList(
-		String[] names,
-		ArrayList list) {
-		
-		for (int i = 0; i < names.length; i++) {
-			System.out.println("searching for " + names[i] + "...");
-			if (list.contains(names[i]))
-				return false;
-		}
-		return true;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureUpdate.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureUpdate.java
deleted file mode 100644
index a7e20c1..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/standalone/TestFeatureUpdate.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.tests.standalone;
-
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.standalone.*;
-
-public class TestFeatureUpdate extends StandaloneManagerTestCase {
-	public static boolean isUpdated;
-	
-	public TestFeatureUpdate(String arg0) {
-		super(arg0);
-		isUpdated = false;
-	}
-
-	public void umSetUp() {
-		super.umSetUp();
-		System.out.println("looking at configured sites available....");
-		checkConfiguredSites();
-		
-		String featureId = "my.alphabet";
-		String version = "1.0.1";
-
-		if (!isUpdated) {
-			System.out.println(
-				"==============" + this.getClass() + "=============");
-			StandaloneUpdateApplication app = new StandaloneUpdateApplication();
-			try {
-				exitValue = (Integer)app.run(getCommand(
-						"update",
-						featureId,
-						version,
-						null,
-						null,
-						TARGET_FILE_SITE.getFile()));
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-			isUpdated = true;
-		}
-	}
-
-
-	// ensure exit without problems
-	public void testExitValue() throws Exception {
-		System.out.println("exitValue: " + exitValue);
-		assertEquals(exitValue, IPlatformRunnable.EXIT_OK);
-	}
-	
-	public void testPluginsExist() {
-
-			ISite localSite =  getConfiguredSite(TARGET_FILE_SITE);
-
-			IPluginEntry[] pluginEntries = localSite.getPluginEntries();
-			ArrayList list = new ArrayList();
-			if (pluginEntries == null || pluginEntries.length == 0)
-				fail("No plugin entries on the target site");
-			else
-				for (int i = 0; i < pluginEntries.length; i++) {
-					list.add(
-						pluginEntries[i].getVersionedIdentifier().toString());
-				}
-
-			String[] pluginNames =
-				{
-					"my.alphabet.letter.a_1.0.0",
-					"my.alphabet.letter.b_1.0.0",
-					"my.alphabet.letter.c_1.0.0",
-					"my.alphabet.letter.e_1.0.0",
-					"my.alphabet.round.letters_1.0.0",
-					"my.alphabet.straight.letters_1.0.0",
-					"my.alphabet_1.0.0",
-					"my.alphabet.letter.a_1.0.1",
-					"my.alphabet.letter.b_1.0.1",
-					"my.alphabet.letter.c_1.0.1",
-					"my.alphabet.letter.e_1.0.1",
-					"my.alphabet.round.letters_1.0.1",
-					"my.alphabet.straight.letters_1.0.1",
-					"my.alphabet_1.0.1" };
-			assertTrue(checkFilesInList(pluginNames, list));
-	}
-
-	public void testFeaturesExist() {
-		try {
-			ISite localSite = getConfiguredSite(TARGET_FILE_SITE);
-
-			// get feature references
-			IFeatureReference[] localFeatures =
-				localSite.getFeatureReferences();
-			ArrayList list = new ArrayList();
-			if (localFeatures == null || localFeatures.length == 0) {
-				fail("No features on the target site");
-			} else {
-				for (int i = 0; i < localFeatures.length; i++) {
-					list.add(
-						localFeatures[i].getVersionedIdentifier().toString());
-					System.out.println(
-						localFeatures[i].getVersionedIdentifier().toString());
-				}
-			}
-			String[] featureNames =
-				{
-					"my.alphabet.round.letters_1.0.0",
-					"my.alphabet.straight.letters_1.0.0",
-					"my.alphabet_1.0.0",
-					"my.alphabet.round.letters_1.0.1",
-					"my.alphabet.straight.letters_1.0.1",
-					"my.alphabet_1.0.1" };
-			assertTrue(checkFilesInList(featureNames, list));
-		} catch (CoreException e) {
-			System.err.println(e);
-		}
-	}
-
-	// makes sure all files/directories in "names" are in the directory listing
-	// "list"
-	public boolean checkFilesInList(String[] names, ArrayList list) {
-
-		for (int i = 0; i < names.length; i++) {
-			if (!list.contains(names[i]))
-				return false;
-		}
-		return true;
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/AllTypesTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/AllTypesTests.java
deleted file mode 100644
index 970648d..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/AllTypesTests.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.types;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-
-public class AllTypesTests extends UpdateManagerTestCase {
-public AllTypesTests(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Regular Install Tests");
-	
-	// the following will take all teh test methods in teh class that start with 'test'
-	suite.addTest(new TestSuite(TestFeatureType.class));
-	suite.addTest(new TestSuite(TestSiteType.class));	
-	
-	// or you can specify the method
-	//suite.addTest(new TestGetFeature("methodThatDoesNotStartWithtest"));	
-	
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestFeatureType.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestFeatureType.java
deleted file mode 100644
index bf5479f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestFeatureType.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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.types;
-
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-public class TestFeatureType extends UpdateManagerTestCase {
-
-
-	private static final String PACKAGED_FEATURE_TYPE = "packaged"; //$NON-NLS-1$
-	private static final String INSTALLED_FEATURE_TYPE = "installed"; //$NON-NLS-1$	
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestFeatureType(String arg0) {
-		super(arg0);
-	}
-	
-	
-	public String getDefaultInstallableFeatureType() {
-		String pluginID = UpdateCore.getPlugin().getDescriptor().getUniqueIdentifier() + "."; //$NON-NLS-1$
-		return pluginID + PACKAGED_FEATURE_TYPE;
-	}
-	
-	public String getDefaultExecutableFeatureType() {
-		String pluginID = UpdateCore.getPlugin().getDescriptor().getUniqueIdentifier() + "."; //$NON-NLS-1$
-		return pluginID + INSTALLED_FEATURE_TYPE;
-	}		
-	
-	/**
-	 * @throws Exception
-	 */
-	public void testSimplePackagedFeatureType() throws Exception{ 
-		FeatureTypeFactory factories = FeatureTypeFactory.getInstance();
-		IFeatureFactory factory = factories.getFactory(getDefaultInstallableFeatureType());
-		
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE,null);
-		URL featureURL = new URL(SOURCE_FILE_SITE,"features/features2.jar ");
-		
-		IFeature anotherFeature = factory.createFeature(featureURL,site,null);
-		
-		assertTrue("Factory doesn't create same feature",anotherFeature.getVersionedIdentifier().equals(anotherFeature.getVersionedIdentifier()));
-	}	
-	
-		/**
-	 * @throws Exception
-	 */
-	public void testSimpleExecutableFeatureType() throws Exception{ 
-		FeatureTypeFactory factories = FeatureTypeFactory.getInstance();
-		IFeatureFactory factory = factories.getFactory(getDefaultExecutableFeatureType());
-		
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE,null);
-		URL featureURL = new URL(SOURCE_FILE_SITE,"testAPI/"+Site.DEFAULT_INSTALLED_FEATURE_PATH+"feature3/");
-		
-		IFeature anotherFeature = factory.createFeature(featureURL,site,null);
-		
-		assertTrue("Factory doesn't create same feature",anotherFeature.getVersionedIdentifier().equals(anotherFeature.getVersionedIdentifier()));
-	}	
-	
-	/**
-	 * @throws Exception
-	 */
-	public void testFeatureType() throws Exception{ 
-		FeatureTypeFactory factories = FeatureTypeFactory.getInstance();
-		IFeatureFactory factory = factories.getFactory(getDefaultInstallableFeatureType());
-		
-		ISite site = SiteManager.getSite(SOURCE_HTTP_SITE,null);
-		IFeature feature = site.getFeatureReferences()[0].getFeature(null);
-		
-		IFeature anotherFeature = factory.createFeature(feature.getURL(),site,null);
-		
-		assertTrue("Factory doesn't create same feature",feature.getVersionedIdentifier().equals(anotherFeature.getVersionedIdentifier()));
-	}
-	
-	
-	/**
-	 * @throws Exception
-	 */
-	public void testFeatureNewType() throws Exception{ 
-		FeatureTypeFactory factories = FeatureTypeFactory.getInstance();
-		IFeatureFactory factory = factories.getFactory(getDefaultExecutableFeatureType());
-		
-		String featurePath = dataPath+"FeatureTypeExamples/site1/site.xml";
-		ISite site = SiteManager.getSite(new File(featurePath).toURL(),null);
-		IFeatureReference ref = site.getFeatureReferences()[0];
-		IFeature feature = ref.getFeature(null);
-		
-		IFeature anotherFeature = factory.createFeature(feature.getURL(),site,null);
-
-		assertTrue(feature.getFeatureContentProvider() instanceof FeatureExecutableContentProvider);		
-		assertTrue(((FeatureReference)ref).getType().equals("org.eclipse.update.tests.core.feature1"));		
-		assertTrue("Factory doesn't create same feature",feature.getVersionedIdentifier().equals(anotherFeature.getVersionedIdentifier()));
-
-
-	}
-	
-	
-		/**
-	 * @throws Exception
-	 */
-	public void testFeatureAnotherType() throws Exception{ 
-		FeatureTypeFactory factories = FeatureTypeFactory.getInstance();
-		IFeatureFactory factory = factories.getFactory(getDefaultInstallableFeatureType());
-		
-		String featurePath = dataPath+"FeatureTypeExamples/site2/site.xml";
-		ISite site = SiteManager.getSite(new File(featurePath).toURL(),null);
-		IFeatureReference ref = site.getFeatureReferences()[0];		
-		IFeature feature = ref.getFeature(null);
-		
-		IFeature anotherFeature = factory.createFeature(feature.getURL(),site,null);
-		
-		assertTrue("Factory doesn't create same feature",feature.getVersionedIdentifier().equals(anotherFeature.getVersionedIdentifier()));
-		assertTrue(feature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider);
-		assertTrue(((FeatureReference)ref).getType().equals("org.eclipse.update.core.packaged"));
-		
-	}
-		
-		
-	/**
-	 * @throws Exception
-	 */
-	public void testFeatureUnknownType() throws Exception{ 
-		String featurePath = dataPath+"FeatureTypeExamples/site3/site.xml";
-		ISite site = SiteManager.getSite(new File(featurePath).toURL(),null);
-		IFeatureReference ref = site.getFeatureReferences()[0];		
-		try {
-			ref.getFeature(null);
-			assertTrue("id found, should not be found",false);
-		} catch (CoreException e){
-			if (e.getMessage().indexOf("org.eclipse.update.core.unknowntype.jar")==-1){
-				throw e;
-			}
-		}
-		
-	}		
-		
-}
-
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestSiteType.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestSiteType.java
deleted file mode 100644
index f4513d4..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestSiteType.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.types;
-
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.FeaturePackagedContentProvider;
-import org.eclipse.update.internal.core.SiteURLContentProvider;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import org.eclipse.update.tests.implementation.SiteFTPFactory;
-
-public class TestSiteType extends UpdateManagerTestCase {
-
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestSiteType(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 * @throws Exception
-	 */
-	public void testSiteType() throws Exception {
-
-		String featurePath = dataPath + "SiteTypeExamples/site1/site.xml";
-		ISite site = SiteManager.getSite(new File(featurePath).toURL(),null);
-		IFeatureReference ref = site.getFeatureReferences()[0];
-		IFeature feature = ref.getFeature(null);
-
-		assertTrue(site.getSiteContentProvider() instanceof SiteURLContentProvider);
-		assertTrue(((Site) site).getType().equals("org.eclipse.update.core.http"));
-		assertTrue(feature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider);
-
-	}
-
-	/**
-		 * @throws Exception
-		 */
-	public void testFTPSiteType() throws Exception {
-
-		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE + "FTPLikeSite/"),null);
-
-		// should not find the mapping
-		// but then should attempt to read the XML file
-		// found a new type
-		// call the new type
-		assertTrue(
-			"Wrong site type",
-			site.getType().equals("org.eclipse.update.tests.ftp"));
-		assertTrue(
-			"Wrong file",
-			site.getURL().getFile().equals("/" + SiteFTPFactory.FILE));
-
-	}
-
-	public void testParseValid1() throws Exception {
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/siteftp.xml");
-			ISite site = SiteManager.getSite(remoteURL,null);
-			site.getArchives();
-		} catch (CoreException e) {
-			if (e.getMessage().indexOf("</feature>") == -1) {
-				throw e;
-			}
-		}
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/AllCoreUITests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/AllCoreUITests.java
deleted file mode 100644
index a18ab16..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/AllCoreUITests.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.uivalues;
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-
-public class AllCoreUITests extends UpdateManagerTestCase {
-public AllCoreUITests(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Regular Install Tests");
-	
-	// the following will take all teh test methods in teh class that start with 'test'
-	suite.addTest(new TestSuite(TestUILabel.class));
-	
-	// or you can specify the method
-	//suite.addTest(new TestGetFeature("methodThatDoesNotStartWithtest"));	
-	
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/TestUILabel.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/TestUILabel.java
deleted file mode 100644
index a8915d5..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/TestUILabel.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.tests.uivalues;
-
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-public class TestUILabel extends UpdateManagerTestCase {
-
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestUILabel(String arg0) {
-		super(arg0);
-	}
-	
-	
-	/**
-	 * Method testHTTPSite.
-	 * @throws Exception
-	 */
-	public void testUpdateManagerSite() throws Exception{ 
-		
-		ISite remoteSite = SiteManager.getSite(new URL("http",getHttpHost(),getHttpPort(),bundle.getString("HTTP_PATH_2")),null);
-		ICategory[] categories = remoteSite.getCategories();
-		for (int i =0; i<categories.length; i++){
-			System.out.println("Category ->"+categories[i].getLabel()+":"+categories[i].getName());
-		}
-		System.out.println(remoteSite.getDescription().getURL().toExternalForm());
-		IFeatureReference[] remoteFeatures = remoteSite.getFeatureReferences();
-		if (remoteFeatures==null || remoteFeatures.length==0) fail("No feature available for testing");		
-		for (int i=0;i<remoteFeatures.length;i++){
-			IFeature feature = remoteFeatures[i].getFeature(null);
-			System.out.println("feature:"+feature.getVersionedIdentifier()+"->"+feature.getLabel());
-			print(feature.getLicense(),"License");
-			print(feature.getCopyright(),"Copyright");			
-			print(feature.getDescription(),"Description");				
-			
-			// check that it downloads the feature.jar under the cover
-			// and unpack it
-			
-			URL url = feature.getLicense().getURL();
-			if (url!=null){
-				assertTrue((new File(url.getFile())).exists());
-			}
-
-			url = feature.getCopyright().getURL();
-			if (url!=null){
-				assertTrue((new File(url.getFile())).exists());
-			}
-			
-			url = feature.getDescription().getURL();
-			if (url!=null){
-				assertTrue((new File(url.getFile())).exists());
-			}
-			
-		}
-	}
-	
-	
-	/**
-	 * Method print.
-	 * @param info
-	 * @param text
-	 */
-	private void print(IURLEntry info, String text){
-		System.out.print("->"+text+":");
-		if (info.getURL()!=null) 
-			System.out.println("<"+info.getURL().toExternalForm()+">");
-		else 
-			System.out.println(info.getAnnotation());
-	}
-} 
-
-
diff --git a/update/org.eclipse.update.tests.core/test.xml b/update/org.eclipse.update.tests.core/test.xml
deleted file mode 100644
index 1da81e0..0000000
--- a/update/org.eclipse.update.tests.core/test.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0"?>
-<project name="testsuite" default="run" basedir="."> 
-  
-  <!-- The property ${eclipse-home} should be passed into this script -->
-  <!-- Set a meaningful default value for when it is not. -->
-  <property name="eclipse-home" value="${basedir}/../.."/>
-  
-  <!-- sets the properties eclipse-home, and library-file -->
-  <property name="plugin-name" value="org.eclipse.update.tests.core"/>
-  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
-  <property name="class-name" value="org.eclipse.update.tests.AllTests" />
-  
-  <!-- This target holds all initialization code that needs to be done for -->
-  <!-- all tests that are to be run. Initialization for individual tests -->
-  <!-- should be done within the body of the suite target. -->
-  <target name="init">
-    <tstamp/>
-    <delete>
-      <fileset dir="${eclipse-home}" includes="org*.xml"/>
-    </delete>
-  </target>
-  
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite">
-    <property name="sniff-folder" value="${eclipse-home}/update_core_sniff_folder"/>
-    <delete dir="${sniff-folder}" quiet="true"/>
-    
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${sniff-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" value="${class-name}"/>
-    </ant>
-  </target>
-  
-  <!-- This target holds code to cleanup the testing environment after -->
-  <!-- after all of the tests have been run. You can use this target to -->
-  <!-- delete temporary files that have been created. -->
-  <target name="cleanup">
-  </target>
-  
-  <!-- This target runs the test suite. Any actions that need to happen -->
-  <!-- after all the tests have been run should go here. -->
-   <target name="run" depends="init,suite,cleanup">
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org*.xml"/>
-      <property name="output-file" value="${plugin-name}.xml"/>
-    </ant>
-  </target>
-	
-	<!-- This target defines the performance tests that need to be run. -->
-	<target name="performance-suite">
-	  <property name="your-performance-folder" value="${eclipse-home}/update_performance_folder"/>
-	  <delete dir="${your-performance-folder}" quiet="true"/>
-	  <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-	    <property name="data-dir" value="${your-performance-folder}"/>
-	    <property name="plugin-name" value="${plugin-name}"/>
-	    <property name="classname" value="org.eclipse.update.tests.perfms.AllPerformanceTests"/>
-	  </ant>
-	</target>
-	
-  <!-- This target runs the performance test suites. -->
-	<target name="performance" depends="init,performance-suite">
-	  <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-	    <property name="includes" value="org*.xml"/>
-	    <property name="output-file" value="${plugin-name}.xml"/>
-	  </ant>
-	</target>
-
-</project>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/test_with_mail.xml b/update/org.eclipse.update.tests.core/test_with_mail.xml
deleted file mode 100644
index 9f1d408..0000000
--- a/update/org.eclipse.update.tests.core/test_with_mail.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0"?>
-<project name="testsuite" default="run" basedir="."> 
-  
-  <!-- The property ${eclipse-home} should be passed into this script -->
-  <!-- Set a meaningful default value for when it is not. -->
-  <property name="eclipse-home" value="${basedir}/../.."/>
-  
-  <!-- sets the properties eclipse-home, and library-file -->
-  <property name="plugin-name" value="org.eclipse.update.tests.core"/>
-  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
-  <property name="class-name" value="org.eclipse.update.tests.AllTests" />
-  
-  <!-- This target holds all initialization code that needs to be done for -->
-  <!-- all tests that are to be run. Initialization for individual tests -->
-  <!-- should be done within the body of the suite target. -->
-  <target name="init">
-    <tstamp/>
-    <delete>
-      <fileset dir="${eclipse-home}" includes="org*.xml"/>
-    </delete>
-  </target>
-  
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite">
-    <property name="sniff-folder" value="${eclipse-home}/update_core_sniff_folder"/>
-    <delete dir="${sniff-folder}" quiet="true"/>
-    
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${sniff-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" value="${class-name}"/>
-    </ant>
-  </target>
-  
-  <!-- This target holds code to cleanup the testing environment after -->
-  <!-- after all of the tests have been run. You can use this target to -->
-  <!-- delete temporary files that have been created. -->
-  <target name="cleanup">
-  </target>
-  
-  <!-- This target runs the test suite. Any actions that need to happen -->
-  <!-- after all the tests have been run should go here. -->
-   <target name="run" depends="init,suite,cleanup">
-
-    <property name="email-from" value="Eclipse_Automated_Test@oti.com"/>
-    <property name="email-subject" value="Install/Update: Nightly Build Report"/>
-    <property name="email-subject-log" value="Install/Update: Nightly .log"/>
-    <property name="email-server" value="d25ml04.torolab.ibm.com"/>
-    <property name="infile" value="${eclipse-home}/${plugin-name}.xml"/>
-    <property name="infile-log" value="${eclipse-home}/workspace/.metadata/.log"/>
-      
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org*.xml"/>
-      <property name="output-file" value="${plugin-name}.xml"/>
-    </ant>
-    
-    <touch file="${infile-log}"/>
-
-    <mail from="${email-from}" tolist="celek@ca.ibm.com"
-          subject="${email-subject}" files="${infile}"
-          mailhost="${email-server}"/>
-
-    <mail from="${email-from}" tolist="celek@ca.ibm.com"
-          subject="${email-subject-log}" files="${infile-log}"
-          mailhost="${email-server}"/>
-
-    <mail from="${email-from}" tolist="celek@rogers.com"
-          subject="${email-subject-log}" files="${infile-log}"
-          mailhost="${email-server}"/>
-
-    <mail from="${email-from}" tolist="celek@rogers.com"
-          subject="${email-subject}" files="${infile}"
-          mailhost="${email-server}"/>
-
-  </target>
-</project>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/features space/helpFeature.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/features space/helpFeature.jar
deleted file mode 100644
index 1a23946..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/features space/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/features space/space feature.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/features space/space feature.jar
deleted file mode 100644
index 33c3d5d..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/features space/space feature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/info/siteInfo.html b/update/org.eclipse.update.tests.core/webserver/Site with space/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/install/features space/feature3/feature.xml b/update/org.eclipse.update.tests.core/webserver/Site with space/install/features space/feature3/feature.xml
deleted file mode 100644
index 67741d9..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/install/features space/feature3/feature.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/Pde_core.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/help.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/junit_3.7.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/site.xml b/update/org.eclipse.update.tests.core/webserver/Site with space/site.xml
deleted file mode 100644
index b5d4bbf..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/site.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-<description url="info/siteInfo.html"/>
-  <feature url="features space/helpFeature.jar">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features space/space feature.jar">
-    <category name="eclipse/J2EE"/>
-  </feature>
-
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins space/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins space/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins space/junit_3.7.jar"/>
-  <archive path="plugins/org.eclipse.update.plugin1_1.1.1" url="plugins space/org.eclipse.update.plugin1_1.1.1"/>  
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/helpFeature.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/helpFeature.jar
deleted file mode 100644
index aec67d4..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/org.eclipse.pde.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/org.eclipse.pde.feature_1.0.0.jar
deleted file mode 100644
index 870b40a..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/org.eclipse.pde.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/siteInfo.html b/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/Pde_core.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/help.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/junit_3.7.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/site.xml b/update/org.eclipse.update.tests.core/webserver/UpdateManager/site.xml
deleted file mode 100644
index 5e5fda7..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/site.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site >
-<description url="info/siteInfo.html"/>
-  <feature url="features/helpFeature.jar">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features/org.eclipse.pde.feature_1.0.0.jar">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins/junit_3.7.jar"/>
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/features2.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/features2.jar
deleted file mode 100644
index 81df72c..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/features2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.test.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.test.feature_1.0.0.jar
deleted file mode 100644
index d1aee3f..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.test.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.update.core.tests.feature1_1.0.4.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.update.core.tests.feature1_1.0.4.jar
deleted file mode 100644
index f515ff4..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.update.core.tests.feature1_1.0.4.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse_test_feature.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse_test_feature.jar
deleted file mode 100644
index 2be38d3..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse_test_feature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/features/org.eclipse.update.core.tests.childrenfeature_2.0.0.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/features/org.eclipse.update.core.tests.childrenfeature_2.0.0.jar
deleted file mode 100644
index 022665c..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/features/org.eclipse.update.core.tests.childrenfeature_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/features/rootfeature.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/features/rootfeature.jar
deleted file mode 100644
index b519803..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/features/rootfeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
deleted file mode 100644
index 5d9f5bc..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
deleted file mode 100644
index 8b4b04a..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar
deleted file mode 100644
index 52208fe..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/site.xml b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/site.xml
deleted file mode 100644
index 7b09c86..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/nestedFeatureSiteTest/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-  <feature url="features/rootfeature.jar" os="*"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar
deleted file mode 100644
index b00d882..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar
deleted file mode 100644
index 0c995d5..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar
deleted file mode 100644
index 0c995d5..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar
deleted file mode 100644
index d6737f6..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
deleted file mode 100644
index eb8690f..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
deleted file mode 100644
index 90a612f..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.properties b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.properties
deleted file mode 100644
index 8e1ced4..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-drivers=Required Drivers
-security=Security Fixes
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.xml b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.xml
deleted file mode 100644
index 657d9b2..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site id="org.eclipse.update.core.tests" name="Tests" version="0.0.1">
-  <feature url="features/org.eclipse.test.feature_1.0.0.jar">
-    <category name="category1"/>
-  </feature>
-  <feature url="features/features2.jar">
-    <category name="category1/subcat1"/>
-    <category name="category2"/>
-  </feature>
-  <feature url="features/org.eclipse.update.core.tests.feature1_1.0.4.jar">
-    <category name="category1"/>
-    <category name="category2"/>
-  </feature>
-  <feature url="features/org.eclipse_test_feature.jar"/>
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-    <category name="category1"/>
-  </feature>
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-  </feature>
-
-  <category-def name="category1/subcat1" label="Special Fix"/>
-  <category-def name="category1" label="%drivers"/>
-  <category-def name="category2" label="%security"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/WEB-INF/web.xml b/update/org.eclipse.update.tests.core/webserver/WEB-INF/web.xml
deleted file mode 100644
index 1a6d904..0000000
--- a/update/org.eclipse.update.tests.core/webserver/WEB-INF/web.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-
-<!DOCTYPE web-app
-    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
-    "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
-
-<web-app>
-    
-</web-app>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSite/features/com.example.bundle.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/webserver/bundleSite/features/com.example.bundle.feature_1.0.0.jar
deleted file mode 100644
index 20d3589..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSite/features/com.example.bundle.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.budle.fragment.ui_1.0.0.jar b/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.budle.fragment.ui_1.0.0.jar
deleted file mode 100644
index d79d2cd..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.budle.fragment.ui_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.bundle.fragment_1.0.0.jar b/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.bundle.fragment_1.0.0.jar
deleted file mode 100644
index edb02bb..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.bundle.fragment_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.bundle.plugin.ui_2.0.0.jar b/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.bundle.plugin.ui_2.0.0.jar
deleted file mode 100644
index 32ec02c..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.bundle.plugin.ui_2.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.bundle.plugin_1.0.0.jar b/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.bundle.plugin_1.0.0.jar
deleted file mode 100644
index 2b1b693..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSite/plugins/com.example.bundle.plugin_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSite/site.xml b/update/org.eclipse.update.tests.core/webserver/bundleSite/site.xml
deleted file mode 100644
index bab1332..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSite/site.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <feature url="features/com.example.bundle.feature_1.0.0.jar" id="com.example.bundle.feature" version="1.0.0">
-      <category name="BundleFeature"/>
-   </feature>
-   <category-def name="BundleFeature" label="Feature with Bundles"/>
-</site>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/.classpath b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/.project b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/.project
deleted file mode 100644
index 8e20903..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/.project
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>com.example.budle.fragment.ui</name>
-	<comment></comment>
-	<projects>
-		<project>com.example.bundle.plugin</project>
-		<project>com.example.bundle.plugin.ui</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.ui</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/.template b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/.template
deleted file mode 100644
index f3bcd41..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/.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/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 2ad686f..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Generated-from: 1077062974451
-Bundle-Name: Ui Fragment
-Bundle-Version: 1.0.0
-Bundle-SymbolicName: com.example.budle.fragment.ui
-Bundle-Vendor: Eclipse.org
-Bundle-ClassPath: ui.jar
-Legacy: true
-Fragment-Host: com.example.bundle.plugin.ui; bundle-version=2.0.0
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/build.properties b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/build.properties
deleted file mode 100644
index 9adc643..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/build.properties
+++ /dev/null
@@ -1,15 +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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.ui.jar = src/
-output.ui.jar = bin/
-bin.includes = fragment.xml,\
-               META-INF/,\
-               ui.jar
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/fragment.xml b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/fragment.xml
deleted file mode 100644
index 3c484b3..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.budle.fragment.ui/fragment.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<fragment
-   id="com.example.budle.fragment.ui"
-   name="Ui Fragment"
-   version="1.0.0"
-   provider-name="Eclipse.org"
-   plugin-id="com.example.bundle.plugin.ui"
-   plugin-version="2.0.0"
-   match="greaterOrEqual">
-
-   <runtime>
-      <library name="ui.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-
-</fragment>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.feature/.project b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.feature/.project
deleted file mode 100644
index 8f3e4bc..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>com.example.bundle.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/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.feature/build.properties b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.feature/build.properties
deleted file mode 100644
index 8be2b5a..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.feature/build.properties
+++ /dev/null
@@ -1,11 +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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = feature.xml
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.feature/feature.xml b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.feature/feature.xml
deleted file mode 100644
index bb41043..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.feature/feature.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="com.example.bundle.feature"
-      label="com.example.bundle.feature"
-      version="1.0.0"
-      provider-name="Eclipse.org">
-
-   <license>
-      A placeholder license for the feature.
-   </license>
-
-   <install-handler/>
-
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-   </requires>
-
-   <plugin
-         id="com.example.bundle.plugin"
-         download-size="0"
-         install-size="0"
-         version="1.0.0"/>
-
-   <plugin
-         id="com.example.budle.fragment.ui"
-         download-size="0"
-         install-size="0"
-         version="1.0.0"
-         fragment="true"/>
-
-   <plugin
-         id="com.example.bundle.fragment"
-         download-size="0"
-         install-size="0"
-         version="1.0.0"
-         fragment="true"/>
-
-   <plugin
-         id="com.example.bundle.plugin.ui"
-         download-size="0"
-         install-size="0"
-         version="2.0.0"/>
-
-</feature>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/.classpath b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/.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/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/.project b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/.project
deleted file mode 100644
index 06d0c21..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/.project
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>com.example.bundle.fragment</name>
-	<comment></comment>
-	<projects>
-		<project>com.example.bundle.plugin</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.ui</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/.template b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/.template
deleted file mode 100644
index f3bcd41..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/.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/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/META-INF/MANIFEST.MF
deleted file mode 100644
index 9d66480..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Generated-from: 1077062909487
-Bundle-Name: Fragment Fragment
-Bundle-Version: 1.0.0
-Bundle-SymbolicName: com.example.bundle.fragment
-Bundle-Vendor: Eclipse.org
-Bundle-ClassPath: fragment.jar
-Legacy: true
-Fragment-Host: com.example.bundle.plugin; bundle-version=1.0.0
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/build.properties b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/build.properties
deleted file mode 100644
index a9f2221..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/build.properties
+++ /dev/null
@@ -1,15 +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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.fragment.jar = src/
-output.fragment.jar = bin/
-bin.includes = fragment.xml,\
-               META-INF/,\
-               fragment.jar
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/fragment.xml b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/fragment.xml
deleted file mode 100644
index 2a5cd6e..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.fragment/fragment.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<fragment
-   id="com.example.bundle.fragment"
-   name="Fragment Fragment"
-   version="1.0.0"
-   provider-name="Eclipse.org"
-   plugin-id="com.example.bundle.plugin"
-   plugin-version="1.0.0">
-
-   <runtime>
-      <library name="fragment.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-
-</fragment>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/.classpath b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/.project b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/.project
deleted file mode 100644
index 83c3553..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/.project
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>com.example.bundle.plugin.ui</name>
-	<comment></comment>
-	<projects>
-		<project>com.example.bundle.plugin</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.ui</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/.template b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/.template
deleted file mode 100644
index f3bcd41..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/.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/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index e3507a9..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Generated-from: 1077062999827
-Bundle-Name: Ui Plug-in
-Bundle-Version: 2.0.0
-Bundle-SymbolicName: com.example.bundle.plugin.ui
-Bundle-Vendor: Eclipse.org
-Bundle-ClassPath: ui.jar
-Legacy: true
-Bundle-Activator: com.example.bundle.plugin.ui.UiPlugin
-Require-Bundle: 
- org.eclipse.core.runtime,
- org.eclipse.ui,
- com.example.bundle.plugin; bundle-version=1.0.0;version-match=perfect
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/bin/com/example/bundle/plugin/ui/UiPlugin.class b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/bin/com/example/bundle/plugin/ui/UiPlugin.class
deleted file mode 100644
index 5f73189..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/bin/com/example/bundle/plugin/ui/UiPlugin.class
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/build.properties b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/build.properties
deleted file mode 100644
index 0577e11..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/build.properties
+++ /dev/null
@@ -1,15 +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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.ui.jar = src/
-output.ui.jar = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               ui.jar
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/plugin.xml b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/plugin.xml
deleted file mode 100644
index aeffdef..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/plugin.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="com.example.bundle.plugin.ui"
-   name="Ui Plug-in"
-   version="2.0.0"
-   provider-name="Eclipse.org"
-   class="com.example.bundle.plugin.ui.UiPlugin">
-
-   <runtime>
-      <library name="ui.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="com.example.bundle.plugin" version="1.0.0" match="perfect"/>
-   </requires>
-
-
-</plugin>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/src/com/example/bundle/plugin/ui/UiPlugin.java b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/src/com/example/bundle/plugin/ui/UiPlugin.java
deleted file mode 100644
index a9549db..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin.ui/src/com/example/bundle/plugin/ui/UiPlugin.java
+++ /dev/null
@@ -1,79 +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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package com.example.bundle.plugin.ui;
-
-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 UiPlugin extends AbstractUIPlugin {
-	//The shared instance.
-	private static UiPlugin plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-	
-	/**
-	 * The constructor.
-	 */
-	public UiPlugin() {
-		super();
-		plugin = this;
-		try {
-			resourceBundle = ResourceBundle.getBundle("com.example.bundle.plugin.ui.UiPluginResources");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static UiPlugin 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 = UiPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/.classpath b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/.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/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/.project b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/.project
deleted file mode 100644
index 1719d73..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>com.example.bundle.plugin</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.ui</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/.template b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/.template
deleted file mode 100644
index f3bcd41..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/.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/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/META-INF/MANIFEST.MF b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/META-INF/MANIFEST.MF
deleted file mode 100644
index fc1adaf..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Generated-from: 1077062603708
-Bundle-Name: Plugin Plug-in
-Bundle-Version: 1.0.0
-Bundle-SymbolicName: com.example.bundle.plugin
-Bundle-Vendor: EXAMPLE
-Bundle-ClassPath: plugin.jar
-Legacy: true
-Bundle-Activator: com.example.bundle.plugin.PluginPlugin
-Require-Bundle: 
- org.eclipse.core.runtime,
- org.eclipse.ui
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/bin/com/example/bundle/plugin/PluginPlugin.class b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/bin/com/example/bundle/plugin/PluginPlugin.class
deleted file mode 100644
index 76caf03..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/bin/com/example/bundle/plugin/PluginPlugin.class
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/build.properties b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/build.properties
deleted file mode 100644
index 44de1ca..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/build.properties
+++ /dev/null
@@ -1,15 +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 Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.plugin.jar = src/
-output.plugin.jar = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               plugin.jar
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/plugin.xml b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/plugin.xml
deleted file mode 100644
index 297bc76..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/plugin.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="com.example.bundle.plugin"
-   name="Plugin Plug-in"
-   version="1.0.0"
-   provider-name="Eclipse.org"
-   class="com.example.bundle.plugin.PluginPlugin">
-
-   <runtime>
-      <library name="plugin.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-   </requires>
-
-
-</plugin>
diff --git a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/src/com/example/bundle/plugin/PluginPlugin.java b/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/src/com/example/bundle/plugin/PluginPlugin.java
deleted file mode 100644
index a8a69f6..0000000
--- a/update/org.eclipse.update.tests.core/webserver/bundleSitesrc/com.example.bundle.plugin/src/com/example/bundle/plugin/PluginPlugin.java
+++ /dev/null
@@ -1,79 +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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package com.example.bundle.plugin;
-
-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 PluginPlugin extends AbstractUIPlugin {
-	//The shared instance.
-	private static PluginPlugin plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-	
-	/**
-	 * The constructor.
-	 */
-	public PluginPlugin() {
-		super();
-		plugin = this;
-		try {
-			resourceBundle = ResourceBundle.getBundle("com.example.bundle.plugin.PluginPluginResources");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static PluginPlugin 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 = PluginPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/.classpath b/update/org.eclipse.update.ui.forms/.classpath
deleted file mode 100644
index 4848249..0000000
--- a/update/org.eclipse.update.ui.forms/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update.ui.forms/.cvsignore b/update/org.eclipse.update.ui.forms/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/update/org.eclipse.update.ui.forms/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/.project b/update/org.eclipse.update.ui.forms/.project
deleted file mode 100644
index 8540f9e..0000000
--- a/update/org.eclipse.update.ui.forms/.project
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.ui.forms</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.ui.ide</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.ui.forms/about.html b/update/org.eclipse.update.ui.forms/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/update/org.eclipse.update.ui.forms/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/build.properties b/update/org.eclipse.update.ui.forms/build.properties
deleted file mode 100644
index 14fda25..0000000
--- a/update/org.eclipse.update.ui.forms/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-bin.includes = plugin.properties,\
-               *.jar,\
-               plugin.xml,\
-               about.html
-source.forms.jar = src/
-src.includes = about.html
diff --git a/update/org.eclipse.update.ui.forms/plugin.properties b/update/org.eclipse.update.ui.forms/plugin.properties
deleted file mode 100644
index 2699472..0000000
--- a/update/org.eclipse.update.ui.forms/plugin.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#
-# plugin.xml properties
-#
-
-name = Install/Update Forms
-provider-name = Eclipse.org
-
diff --git a/update/org.eclipse.update.ui.forms/plugin.xml b/update/org.eclipse.update.ui.forms/plugin.xml
deleted file mode 100644
index ab2a167..0000000
--- a/update/org.eclipse.update.ui.forms/plugin.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.update.ui.forms"
-   name="%name"
-   version="3.0.0"
-   provider-name="%provider-name"
-   class="org.eclipse.update.ui.forms.internal.FormsPlugin">
-
-   <runtime>
-      <library name="forms.jar">
-         <export name="*"/>
-         <packages prefixes="org.eclipse.update.ui.forms.internal"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime.compatibility"/>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-
-
-</plugin>
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractForm.java
deleted file mode 100644
index c125441..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractForm.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.jface.preference.*;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.*;
-import org.eclipse.jface.util.*;
-import org.eclipse.ui.actions.*;
-
-/**
- * This class implements IForm interface and
- * provides some common services to its subclasses.
- * It handles some common properties like heading
- * text, image and colors, as well as
- * font change processing.
- */
-
-public abstract class AbstractForm implements IForm, IPropertyChangeListener {
-	protected FormWidgetFactory factory;
-	protected Color headingBackground;
-	protected Color headingForeground;
-	protected boolean headingVisible = true;
-	protected Image headingImage;
-	protected String headingText;
-	protected Font titleFont;
-	private IPropertyChangeListener hyperlinkColorListener;
-
-	public AbstractForm() {
-		factory = new FormWidgetFactory();
-		titleFont = JFaceResources.getHeaderFont();
-		JFaceResources.getFontRegistry().addListener(this);
-		IPreferenceStore pstore = JFacePreferences.getPreferenceStore();
-		hyperlinkColorListener = new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent e) {
-				if (e.getProperty().equals(JFacePreferences.HYPERLINK_COLOR)
-					|| e.getProperty().equals(
-						JFacePreferences.ACTIVE_HYPERLINK_COLOR)) {
-					updateHyperlinkColors();
-				}
-			}
-		};
-		pstore.addPropertyChangeListener(hyperlinkColorListener);
-	}
-	
-	protected void updateHyperlinkColors() {
-		factory.updateHyperlinkColors();
-	}
-
-	/**
-	 * @see IForm#commitChanges(boolean)
-	 */
-	public void commitChanges(boolean onSave) {
-	}
-
-	/**
-	 * @see IForm#createControl(Composite)
-	 */
-	public abstract Control createControl(Composite parent);
-
-	/**
-	 * @see IForm#dispose()
-	 */
-	public void dispose() {
-		factory.dispose();
-		JFaceResources.getFontRegistry().removeListener(this);
-		IPreferenceStore pstore = JFacePreferences.getPreferenceStore();
-		pstore.removePropertyChangeListener(this);
-		pstore.removePropertyChangeListener(hyperlinkColorListener);
-	}
-
-	/**
-	 * @see IForm#doGlobalAction(String)
-	 */
-	public boolean doGlobalAction(String actionId) {
-		return false;
-	}
-
-	/**
-	 * @see IForm#expandTo(Object)
-	 */
-	public void expandTo(Object object) {
-	}
-
-	/**
-	 * @see IForm#getControl()
-	 */
-	public abstract Control getControl();
-
-	/**
-	 * @see IForm#getFactory()
-	 */
-	public FormWidgetFactory getFactory() {
-		return factory;
-	}
-
-	/**
-	 * @see IForm#getHeadingBackground()
-	 */
-	public Color getHeadingBackground() {
-		return headingBackground;
-	}
-
-	/**
-	 * @see IForm#getHeadingForeground()
-	 */
-	public Color getHeadingForeground() {
-		return headingForeground;
-	}
-
-	/**
-	 * @see IForm#getHeadingImage()
-	 */
-	public Image getHeadingImage() {
-		return headingImage;
-	}
-
-	/**
-	 * @see IForm#getHeading()
-	 */
-	public String getHeadingText() {
-		if (headingText == null)
-			return "";
-		return headingText;
-	}
-
-	/**
-	 * @see IForm#initialize(Object)
-	 */
-	public void initialize(Object model) {
-	}
-
-	/**
-	 * @see IForm#isHeadingVisible()
-	 */
-	public boolean isHeadingVisible() {
-		return headingVisible;
-	}
-
-	/**
-	 * @see IForm#registerSection(FormSection)
-	 */
-	public void registerSection(FormSection section) {
-	}
-
-	/**
-	 * @see IForm#setFocus()
-	 */
-	public void setFocus() {
-	}
-
-	/**
-	 * @see IForm#setHeadingBackground(Color)
-	 */
-	public void setHeadingBackground(Color newHeadingBackground) {
-		this.headingBackground = newHeadingBackground;
-	}
-
-	/**
-	 * @see IForm#setHeadingForeground(Color)
-	 */
-	public void setHeadingForeground(Color newHeadingForeground) {
-		this.headingForeground = newHeadingForeground;
-	}
-
-	/**
-	 * @see IForm#setHeadingImage(Image)
-	 */
-	public void setHeadingImage(Image headingImage) {
-		this.headingImage = headingImage;
-	}
-
-	/**
-	 * @see IForm#setHeadingVisible(boolean)
-	 */
-	public void setHeadingVisible(boolean newHeadingVisible) {
-		this.headingVisible = newHeadingVisible;
-	}
-
-	/**
-	 * @see IForm#setHeading(String)
-	 */
-	public void setHeadingText(String headingText) {
-		this.headingText = headingText;
-	}
-
-	/**
-	 * @see IForm#update()
-	 */
-	public void update() {
-	}
-
-	protected boolean canPerformDirectly(String id, Control control) {
-		if (control instanceof Text) {
-			Text text = (Text) control;
-			if (id.equals(ActionFactory.CUT.getId())) {
-				text.cut();
-				return true;
-			}
-			if (id.equals(ActionFactory.COPY.getId())) {
-				text.copy();
-				return true;
-			}
-			if (id.equals(ActionFactory.PASTE.getId())) {
-				text.paste();
-				return true;
-			}
-			if (id.equals(ActionFactory.SELECT_ALL.getId())) {
-				text.selectAll();
-				return true;
-			}
-			if (id.equals(ActionFactory.DELETE.getId())) {
-				int count = text.getSelectionCount();
-				if (count == 0) {
-					int caretPos = text.getCaretPosition();
-					text.setSelection(caretPos, caretPos + 1);
-				}
-				text.insert("");
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractSectionForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractSectionForm.java
deleted file mode 100644
index 02903ca..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractSectionForm.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-import java.util.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.graphics.*;
-
-/**
- * This form class understands form sections.
- * It assumes that they are part of the form
- * and it offers life cycle handling of sections
- * once they are registered.
- */
-
-public abstract class AbstractSectionForm extends AbstractForm {
-	public static final int H_SCROLL_INCREMENT = 5;
-	public static final int V_SCROLL_INCREMENT = 64;
-	protected Vector sections = null;
-
-	public void registerSection(FormSection section) {
-		if (sections == null)
-			sections = new Vector();
-		if (!sections.contains(section))
-			sections.add(section);
-	}
-
-	public void unregisterSection(FormSection section) {
-		if (sections != null && sections.contains(section))
-			sections.remove(section);
-	}
-
-	public void initialize(Object model) {
-		if (sections != null) {
-			for (Iterator iter = sections.iterator(); iter.hasNext();) {
-				FormSection section = (FormSection) iter.next();
-				section.initialize(model);
-			}
-		}
-	}
-
-	public void setFocus() {
-		if (sections != null && sections.size() > 0) {
-			FormSection firstSection = (FormSection) sections.firstElement();
-			firstSection.setFocus();
-		}
-	}
-
-	public void update() {
-		if (sections != null) {
-			for (Iterator iter = sections.iterator(); iter.hasNext();) {
-				FormSection section = (FormSection) iter.next();
-				section.update();
-			}
-		}
-	}
-
-	public void commitChanges(boolean onSave) {
-		if (sections != null) {
-			for (Iterator iter = sections.iterator(); iter.hasNext();) {
-				FormSection section = (FormSection) iter.next();
-				if (section.isDirty())
-					section.commitChanges(onSave);
-			}
-		}
-	}
-
-	public boolean doGlobalAction(String actionId) {
-		Control focusControl = getFocusControl();
-		if (focusControl == null)
-			return false;
-
-		if (canPerformDirectly(actionId, focusControl))
-			return true;
-		Composite parent = focusControl.getParent();
-		FormSection targetSection = null;
-		while (parent != null) {
-			Object data = parent.getData();
-			if (data != null && data instanceof FormSection) {
-				targetSection = (FormSection) data;
-				break;
-			}
-			parent = parent.getParent();
-		}
-		if (targetSection != null) {
-			return targetSection.doGlobalAction(actionId);
-		}
-		return false;
-	}
-
-	protected Control getFocusControl() {
-		Control control = getControl();
-		if (control == null || control.isDisposed())
-			return null;
-		Display display = control.getDisplay();
-		Control focusControl = display.getFocusControl();
-		if (focusControl == null || focusControl.isDisposed())
-			return null;
-		return focusControl;
-	}
-
-	public boolean canPaste(Clipboard clipboard) {
-		Control focusControl = getFocusControl();
-		if (focusControl == null)
-			return false;
-		Composite parent = focusControl.getParent();
-		FormSection targetSection = null;
-		while (parent != null) {
-			Object data = parent.getData();
-			if (data != null && data instanceof FormSection) {
-				targetSection = (FormSection) data;
-				break;
-			}
-			parent = parent.getParent();
-		}
-		if (targetSection != null) {
-			return targetSection.canPaste(clipboard);
-		}
-		return false;
-	}
-
-	public void dispose() {
-		if (sections != null) {
-			for (Iterator iter = sections.iterator(); iter.hasNext();) {
-				FormSection section = (FormSection) iter.next();
-				section.dispose();
-			}
-		}
-		super.dispose();
-	}
-
-	public static void ensureVisible(ScrolledComposite scomp, Control control) {
-		Point controlSize = control.getSize();
-		Point controlOrigin = getControlLocation(scomp, control);
-		ensureVisible(scomp, controlOrigin, controlSize);
-	}
-
-	public static void ensureVisible(ScrolledComposite scomp, Point controlOrigin, Point controlSize) {
-		Point area = scomp.getContent().getSize();
-		Point scompOrigin = scomp.getOrigin();
-
-		int x = scompOrigin.x;
-		int y = scompOrigin.y;
-
-		if (controlOrigin.x + controlSize.x > scompOrigin.x + area.x) {
-			x = controlOrigin.x + controlSize.x - area.x;
-		}		
-		if (controlOrigin.x < x ) {
-			 x = controlOrigin.x;
-		 }         
-		
-		if (controlOrigin.y + controlSize.y > scompOrigin.y + area.y) {
-			y = controlOrigin.y + controlSize.y - area.y;
-		}
-		if (controlOrigin.y < y ) {
-			 y = controlOrigin.y;
-		 }         
-		scomp.setOrigin(x, y);
-	}
-	
-	public static Point getControlLocation(ScrolledComposite scomp, Control control) {
-		int x = 0;
-		int y = 0;
-		Control currentControl = control;
-		for (;;) {
-			if (currentControl == scomp)
-				break;
-			if (currentControl.getLocation().x > 0)
-				x += currentControl.getLocation().x;
-			if (currentControl.getLocation().y > 0)
-				y += currentControl.getLocation().y;
-			currentControl = currentControl.getParent();
-		}
-		return new Point(x, y);
-	}
-	
-	public static void scrollVertical(ScrolledComposite scomp, boolean up) {
-		scroll(scomp, 0, up ? -V_SCROLL_INCREMENT : V_SCROLL_INCREMENT);
-	}
-	public static void scrollHorizontal(ScrolledComposite scomp, boolean left) {
-		scroll(scomp, left ? -H_SCROLL_INCREMENT : H_SCROLL_INCREMENT, 0);
-	}
-	public static void scrollPage(ScrolledComposite scomp, boolean up) {
-		Rectangle clientArea = scomp.getClientArea();
-		int increment = up ? -clientArea.height : clientArea.height;
-		scroll(scomp, 0, increment);
-	}
-	private static void scroll(ScrolledComposite scomp, int xoffset, int yoffset) {
-		Point origin = scomp.getOrigin();
-		Point contentSize = scomp.getContent().getSize();
-		int xorigin = origin.x + xoffset;
-		int yorigin = origin.y + yoffset;
-		xorigin = Math.max(xorigin, 0);
-		xorigin = Math.min(xorigin, contentSize.x - 1);
-		yorigin = Math.max(yorigin, 0);
-		yorigin = Math.min(yorigin, contentSize.y - 1);
-		scomp.setOrigin(xorigin, yorigin);
-	}
-
-	public static void updatePageIncrement(ScrolledComposite scomp) {
-		ScrollBar vbar = scomp.getVerticalBar();
-		if (vbar != null) {
-			Rectangle clientArea = scomp.getClientArea();
-			int increment = clientArea.height - 5;
-			vbar.setPageIncrement(increment);
-		}
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/CustomWorkbook.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/CustomWorkbook.java
deleted file mode 100644
index f88ebcc..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/CustomWorkbook.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import java.util.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.custom.*;
-
-
-public class CustomWorkbook implements IFormWorkbook {
-	private Hashtable pages;
-	private boolean firstPageSelected=true;
-	private CTabFolder tabFolder;
-	private Vector listeners=new Vector();
-	private IFormPage currentPage;
-
-public CustomWorkbook() {
-	pages = new Hashtable();
-}
-public void addFormSelectionListener(IFormSelectionListener listener) {
-	listeners.addElement(listener);
-}
-public void addPage(IFormPage page) {
-	CTabItem item = new CTabItem(tabFolder, SWT.NULL);
-	item.setText(page.getLabel());
-	item.setToolTipText(page.getTitle());
-	item.setData(page);
-	pages.put(page, item);
-	
-	if (firstPageSelected && currentPage == null)
-		selectPage(page, true);
-}
-public void createControl(Composite parent) {
-	tabFolder = new CTabFolder(parent, SWT.BOTTOM);
-	tabFolder.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			CTabItem item = (CTabItem) e.item;
-			IFormPage page = (IFormPage) item.getData();
-			if (page != null)
-				selectPage(page, true);
-		}
-	});
-	// listener to resize visible components
-	tabFolder.addListener(SWT.Resize, new Listener() {
-		public void handleEvent(Event e) {
-			if (currentPage != null)
-				setControlSize(currentPage.getControl());
-		}
-	});
-}
-private void fireSelectionChanged(IFormPage page, boolean setFocus) {
-	for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-		IFormSelectionListener listener = (IFormSelectionListener) iter.next();
-		listener.formSelected(page, setFocus);
-	}
-}
-public Control getControl() {
-	return tabFolder;
-}
-public IFormPage getCurrentPage() {
-	return currentPage;
-}
-public boolean isFirstPageSelected() {
-	return firstPageSelected;
-}
-public void removeFormSelectionListener(IFormSelectionListener listener) {
-	listeners.removeElement(listener);
-}
-public void removePage(IFormPage page) {
-	CTabItem item = (CTabItem) pages.get(page);
-	if (item != null)
-		item.dispose();
-}
-private void reselectPage(final IFormPage page) {
-	tabFolder.getDisplay().asyncExec(new Runnable() {
-		public void run() {
-		selectPage(page, true);
-		}
-	});
-}
-public void selectPage(final IFormPage page, final boolean setFocus) {
-	final IFormPage oldPage = currentPage;
-	currentPage = page;
-
-	// It may take a while
-	BusyIndicator.showWhile(tabFolder.getDisplay(), new Runnable() {
-		public void run() {
-			switchPages(oldPage, page, setFocus);
-		}
-	});
-}
-private void setControlSize(Control control) {
-	Rectangle bounds = tabFolder.getBounds();
-	Rectangle offset = tabFolder.getClientArea();
-	bounds.x += offset.x;
-	bounds.y += offset.y;
-	bounds.width = offset.width;
-	bounds.height = offset.height;
-	control.setBounds(bounds);
-	control.moveAbove(tabFolder);
-}
-private void setControlVisible(Control control) {
-	if (control == null)
-		return;
-	setControlSize(control);
-	control.setVisible(true);
-}
-public void setFirstPageSelected(boolean newFirstPageSelected) {
-	firstPageSelected = newFirstPageSelected;
-}
-private void switchPages(IFormPage oldPage, IFormPage newPage, boolean setFocus) {
-	if (oldPage != null && oldPage!=newPage) {
-		boolean okToSwitch = oldPage.becomesInvisible(newPage);
-		if (!okToSwitch) {
-			// We must try to go back to the source page
-			reselectPage(oldPage);
-			return;
-		}
-	}
-	if (newPage.getControl() == null)
-		newPage.createControl(tabFolder);
-	tabFolder.setSelection((CTabItem) pages.get(newPage));
-	if (oldPage != null && oldPage != newPage) {
-		Control oldControl = oldPage.getControl();
-		if (oldControl!=null) oldControl.setVisible(false);
-	}
-	Control newControl = newPage.getControl();
-	newPage.becomesVisible(oldPage);
-	setControlVisible(newControl);
-	fireSelectionChanged(newPage, setFocus);
-}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ExpandableGroup.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ExpandableGroup.java
deleted file mode 100644
index edb5f8a..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ExpandableGroup.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-
-public abstract class ExpandableGroup {
-	private String text;
-	private boolean expanded;
-	private Composite expansion;
-	protected SelectableFormLabel textLabel;
-	private Composite control;
-	private boolean expandable=true;
-	
-class ExpandableLayout extends Layout {
-	protected void layout(Composite parent, boolean changed) {
-		Rectangle clientArea = parent.getClientArea();
-		Point size = textLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-		int x = 0;
-		int y = 1;
-		
-		if (expandable) {
-			x = 8 + 8;
-		}
-		textLabel.setBounds(x, y, size.x, size.y);
-	
-		if (expandable)
-		   y = Math.max(size.y, 8) + 2 + 2;
-		else
-		   y = size.y + 2;
-		if (expanded) {
-			int areaWidth = clientArea.width - x;
-			size = expansion.computeSize(areaWidth, SWT.DEFAULT, changed);
-			expansion.setBounds(x, y, size.x, size.y);
-		}
-	}
-
-	protected Point computeSize(Composite parent, int wHint, int hHint, boolean changed) {
-		int width = 0, height = 0;
-		Point size = textLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-		width = size.x;
-		height = size.y + 2 + 2;
-		if (expanded) {
-			size = expansion.computeSize(wHint, SWT.DEFAULT, changed);
-			width = Math.max(width, size.x);
-			height += size.y;
-		}
-		if (expandable) {
-			height = Math.max(height, 8);
-			width += 8 + 8;
-		}
-		return new Point(width, height);
-	}
-}
-
-	public ExpandableGroup() {
-	}
-	
-	public ExpandableGroup(int style) {
-		//this.style = style;
-	}
-	
-	public Control getControl() {
-		return control;
-	}
-	
-	public void createControl(Composite parent, final FormWidgetFactory factory) {
-		final Canvas container = new Canvas(parent, SWT.NULL);
-		container.setBackground(factory.getBackgroundColor());
-		container.setLayout(new ExpandableLayout());
-		container.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				if (expandable) repaint(e);
-			}
-		});
-		container.addMouseListener(new MouseAdapter() {
-			public void mouseUp(MouseEvent e) {
-				Rectangle box = getBoxBounds(null);
-				if (box.contains(e.x, e.y)) {
-					container.setCursor(factory.getBusyCursor());
-					setExpanded(!isExpanded());
-					container.setCursor(null);
-				}
-			}
-		});
-		textLabel = createTextLabel(container, factory);
-		getHyperlinkHandler(factory).registerHyperlink(textLabel, new HyperlinkAdapter () {
-			public void linkActivated(Control link) {
-				ExpandableGroup.this.linkActivated();
-				if (expandable) setExpanded(!isExpanded());
-			}
-		});
-		textLabel.addFocusListener(factory.visibilityHandler);
-		textLabel.addKeyListener(factory.keyboardHandler);		
-		if (text!=null) textLabel.setText(text);
-		expansion = factory.createComposite(container);
-		fillExpansion(expansion, factory);
-		this.control = container;
-	}
-	
-	protected SelectableFormLabel createTextLabel(Composite parent, FormWidgetFactory factory) {
-		SelectableFormLabel text = new SelectableFormLabel(parent, SWT.WRAP);
-		text.setBackground(factory.getBackgroundColor());
-		return text;
-	}
-	
-	protected HyperlinkHandler getHyperlinkHandler(FormWidgetFactory factory) {
-		return factory.getHyperlinkHandler();
-	}
-	
-	public abstract void fillExpansion(Composite expansion, FormWidgetFactory factory);
-	
-	public void setText(String text) {
-		this.text = text;
-		if (textLabel!=null)
-		   textLabel.setText(text);
-	}
-	
-	public String getText() {
-		return text;
-	}
-	
-	public boolean isExpanded() {
-		return expanded;
-	}
-	
-	public void setExpandable(boolean expandable) {
-		this.expandable = expandable;
-	}
-	
-	public boolean isExpandable() {
-		return expandable;
-	}
-	
-	public void setExpanded(boolean expanded) {
-		if (this.expanded != expanded) {
-			if (expanded) {
-				aboutToExpand();
-			}
-			else {
-				aboutToCollapse();
-			}
-			this.expanded = expanded;
-			expansion.setVisible(expanded);
-			control.layout();
-			if (expanded) {
-				this.expanded();
-			}
-			else {
-				collapsed();
-			}
-		}
-	}
-	
-	private void repaint(PaintEvent e) {
-		GC gc = e.gc;
-		Rectangle box = getBoxBounds(gc);
-		gc.setForeground(control.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
-		gc.drawRectangle(box);
-		gc.setForeground(control.getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND));
-		gc.drawLine(box.x+2, box.y+4, box.x+6, box.y+4);
-		if (!isExpanded()) {
-			gc.drawLine(box.x+4, box.y+2, box.x+4, box.y+6);
-		}
-	}
-	
-	private Rectangle getBoxBounds(GC gc) {
-		int x = 0;
-		int y = 0;
-		boolean noGC = false;
-	
-		if (gc==null) {
-			gc = new GC(control);
-			noGC = true;
-		}
-		gc.setFont(textLabel.getFont());
-		int height = gc.getFontMetrics().getHeight();
-		y = height/2 - 4 +1;
-		y = Math.max(y, 0);
-		if (noGC) gc.dispose();
-		return new Rectangle(x, y, 8, 8);
-	}
-	
-	protected void updateLayout() {
-		control.layout();
-	}
-	
-	protected void aboutToExpand() {
-	}
-	
-	protected void aboutToCollapse() {
-	}
-	
-	protected void expanded() {
-	}
-	protected void collapsed() {
-	}
-	protected void linkActivated() {
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormButton.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormButton.java
deleted file mode 100644
index c307edf..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormButton.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-
-public class FormButton {
-	private Button button;
-	private Image image;
-	private FormWidgetFactory factory;
-	private Image hoverImage;
-	private boolean inside;
-	private Image disabledImage;
-
-public FormButton(Button button, FormWidgetFactory factory) {
-	this.button = button;
-	this.factory = factory;
-	button.addMouseTrackListener(new MouseTrackAdapter() {
-		public void mouseEnter(MouseEvent e) {
-			inside=true;
-			updateImage();
-		}
-		public void mouseExit(MouseEvent e) {
-			inside=false;
-			updateImage();
-		}
-	});
-}
-public Button getButton() {
-	return button;
-}
-public Image getDisabledImage() {
-	return disabledImage;
-}
-public Image getHoverImage() {
-	return hoverImage;
-}
-public Image getImage() {
-	return image;
-}
-public void setDisabledImage(Image newDisabledImage) {
-	disabledImage = newDisabledImage;
-}
-public void setEnabled(boolean enabled) {
-	button.setEnabled(enabled);
-	updateImage();
-}
-public void setHoverImage(Image newHoverImage) {
-	hoverImage = newHoverImage;
-}
-public void setImage(Image newImage) {
-	image = newImage;
-	if (hoverImage==null) hoverImage = image;
-	if (disabledImage==null) disabledImage = image;
-	updateImage();
-}
-public void updateImage() {
-	boolean enabled = button.isEnabled();
-	if (enabled == false) {
-		button.setImage(disabledImage);
-	} else {
-		if (inside) {
-			button.setCursor(factory.getHyperlinkCursor());
-			button.setImage(hoverImage);
-		} else {
-			button.setCursor(null);
-			button.setImage(image);
-		}
-	}
-}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormEntry.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormEntry.java
deleted file mode 100644
index a5e7e14..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormEntry.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.widgets.*;
-import java.util.*;
-
-public class FormEntry {
-	private Text text;
-	private String value;
-	private boolean dirty;
-	private Vector listeners=new Vector();
-	boolean ignoreModify=false;
-
-public FormEntry(Text text) {
-	this.text = text;
-	this.value = text.getText();
-	addListeners();
-}
-public void addFormTextListener(IFormTextListener listener) {
-	listeners.addElement(listener);
-}
-private void addListeners() {
-	text.addKeyListener(new KeyAdapter() {
-		public void keyReleased(KeyEvent e) {
-			keyReleaseOccured(e);
-		}
-	});
-	text.addModifyListener(new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			editOccured(e);
-		}
-	});
-	text.addFocusListener (new FocusAdapter() {
-		public void focusLost(FocusEvent e) {
-			if (dirty) commit();
-		}
-	});
-}
-public void commit() {
-	if (dirty) {
-		value = text.getText();
-		//notify
-		for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-			((IFormTextListener) iter.next()).textValueChanged(this);
-		}
-	}
-	dirty = false;
-}
-protected void editOccured(ModifyEvent e) {
-	if (ignoreModify) return;
-	dirty = true;
-	for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-		((IFormTextListener) iter.next()).textDirty(this);
-	}
-}
-
-public Text getControl() {
-	return text;
-}
-public java.lang.String getValue() {
-	return value;
-}
-public boolean isDirty() {
-	return dirty;
-}
-protected void keyReleaseOccured(KeyEvent e) {
-	if (e.character == '\r') {
-		// commit value
-		if (dirty) commit();
-	}
-	else if (e.character == '\u001b') { // Escape character
-		text.setText(value!=null?value:""); // restore old
-		dirty= false;
-	}
-}
-public void removeFormTextListener(IFormTextListener listener) {
-	listeners.removeElement(listener);
-}
-public void setDirty(boolean newDirty) {
-	dirty = newDirty;
-}
-public void setValue(String value) {
-	if (text!=null) text.setText(value!=null?value:"");
-	this.value = value;
-}
-
-public void setValue(String value, boolean blockNotification) {
-	ignoreModify = blockNotification;
-	setValue(value);
-	ignoreModify = false;
-}
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormLabel.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormLabel.java
deleted file mode 100644
index 965e1e8..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormLabel.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import java.text.BreakIterator;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-
-/**
- * FormText is a windowless control that
- * draws text in the provided context.
- */
-public class FormLabel extends Canvas {
-	private String text = "";
-	protected int textMarginWidth = 5;
-	protected int textMarginHeight = 5;
-	private boolean underlined;
-
-	public FormLabel(Composite parent, int style) {
-		super(parent, style);
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		initAccessible();
-	}
-	public String getText() {
-		return text;
-	}
-	public void setText(String text) {
-		if (text != null)
-			this.text = text;
-		else
-			text = "";
-	}
-
-	protected void initAccessible() {
-		Accessible accessible = getAccessible();
-		accessible.addAccessibleListener(new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				e.result = getText();
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-		});
-
-		accessible
-			.addAccessibleControlListener(new AccessibleControlAdapter() {
-			public void getChildAtPoint(AccessibleControlEvent e) {
-				Point pt = toControl(new Point(e.x, e.y));
-				e.childID =
-					(getBounds().contains(pt))
-						? ACC.CHILDID_SELF
-						: ACC.CHILDID_NONE;
-			}
-
-			public void getLocation(AccessibleControlEvent e) {
-				Rectangle location = getBounds();
-				Point pt = toDisplay(new Point(location.x, location.y));
-				e.x = pt.x;
-				e.y = pt.y;
-				e.width = location.width;
-				e.height = location.height;
-			}
-
-			public void getChildCount(AccessibleControlEvent e) {
-				e.detail = 0;
-			}
-
-			public void getRole(AccessibleControlEvent e) {
-				e.detail = ACC.ROLE_LABEL;
-			}
-
-			public void getState(AccessibleControlEvent e) {
-				e.detail = ACC.STATE_READONLY;
-			}
-		});
-	}
-
-	public void setUnderlined(boolean underlined) {
-		this.underlined = underlined;
-	}
-
-	public boolean isUnderlined() {
-		return underlined;
-	}
-
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		checkWidget();
-		int innerWidth = wHint;
-		if (innerWidth != SWT.DEFAULT)
-			innerWidth -= textMarginWidth * 2;
-		Point textSize = computeTextSize(innerWidth, hHint);
-		int textWidth = textSize.x + 2 * textMarginWidth;
-		int textHeight = textSize.y + 2 * textMarginHeight;
-		return new Point(textWidth, textHeight);
-	}
-
-	public static int computeWrapHeight(GC gc, String text, int width) {
-		BreakIterator wb = BreakIterator.getWordInstance();
-		wb.setText(text);
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-
-		int saved = 0;
-		int last = 0;
-		int height = lineHeight;
-
-		for (int loc = wb.first();
-			loc != BreakIterator.DONE;
-			loc = wb.next()) {
-			String word = text.substring(saved, loc);
-			Point extent = gc.textExtent(word);
-			if (extent.x > width) {
-				// overflow
-				saved = last;
-				height += extent.y;
-			}
-			last = loc;
-		}
-		return height;
-	}
-
-	private Point computeTextSize(int wHint, int hHint) {
-		Point extent;
-		GC gc = new GC(this);
-
-		gc.setFont(getFont());
-		if ((getStyle() & SWT.WRAP) != 0 && wHint != SWT.DEFAULT) {
-			int height = computeWrapHeight(gc, text, wHint);
-			extent = new Point(wHint, height);
-		} else {
-			extent = gc.textExtent(getText());
-		}
-		gc.dispose();
-		return extent;
-	}
-
-	public static void paintWrapText(
-		GC gc,
-		Point size,
-		String text,
-		int marginWidth,
-		int marginHeight) {
-		paintWrapText(gc, size, text, marginWidth, marginHeight, false);
-	}
-
-	public static void paintWrapText(
-		GC gc,
-		Point size,
-		String text,
-		int marginWidth,
-		int marginHeight,
-		boolean underline) {
-		BreakIterator wb = BreakIterator.getWordInstance();
-		wb.setText(text);
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		int descent = fm.getDescent();
-
-		int saved = 0;
-		int last = 0;
-		int y = marginHeight;
-		int width = size.x - marginWidth * 2;
-
-		for (int loc = wb.first();
-			loc != BreakIterator.DONE;
-			loc = wb.next()) {
-			String line = text.substring(saved, loc);
-			Point extent = gc.textExtent(line);
-			if (extent.x > width) {
-				// overflow
-				String prevLine = text.substring(saved, last);
-				gc.drawString(prevLine, marginWidth, y, true);
-				if (underline) {
-					Point prevExtent = gc.textExtent(prevLine);
-					int lineY = y + lineHeight - descent + 1;
-					gc.drawLine(marginWidth, lineY, prevExtent.x, lineY);
-				}
-
-				saved = last;
-				y += lineHeight;
-			}
-			last = loc;
-		}
-		// paint the last line
-		String lastLine = text.substring(saved, last);
-		gc.drawString(lastLine, marginWidth, y, true);
-		if (underline) {
-			int lineY = y + lineHeight - descent + 1;
-			Point lastExtent = gc.textExtent(lastLine);
-			gc.drawLine(marginWidth, lineY, marginWidth + lastExtent.x, lineY);
-		}
-	}
-
-	protected void paint(PaintEvent e) {
-		GC gc = e.gc;
-		Point size = getSize();
-		gc.setFont(getFont());
-		gc.setForeground(getForeground());
-		if ((getStyle() & SWT.WRAP) != 0) {
-			paintWrapText(
-				gc,
-				size,
-				text,
-				textMarginWidth,
-				textMarginHeight,
-				underlined);
-		} else {
-			gc.drawText(getText(), textMarginWidth, textMarginHeight, true);
-			if (underlined) {
-				FontMetrics fm = gc.getFontMetrics();
-				int descent = fm.getDescent();
-				int lineY = size.y - textMarginHeight - descent + 1;
-				gc.drawLine(
-					textMarginWidth,
-					lineY,
-					size.x - textMarginWidth,
-					lineY);
-			}
-		}
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormSection.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormSection.java
deleted file mode 100644
index 742231d..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormSection.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.*;
-import org.eclipse.jface.util.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.dnd.Clipboard;
-
-public abstract class FormSection implements IPropertyChangeListener {
-	public static final int SELECTION = 1;
-	private String headerColorKey = FormWidgetFactory.DEFAULT_HEADER_COLOR;
-	private String headerText;
-	private Control client;
-	protected Label header;
-	protected Control separator;
-	private SectionChangeManager sectionManager;
-	private String description;
-	private boolean dirty;
-	protected Label descriptionLabel;
-	private ToggleControl toggle;
-	private boolean readOnly;
-	private boolean addSeparator = true;
-	private boolean descriptionPainted = true;
-	private boolean headerPainted = true;
-	private boolean collapsable = false;
-	private boolean collapsed = false;
-	private int widthHint = SWT.DEFAULT;
-	private int heightHint = SWT.DEFAULT;
-	private Composite control;
-	public boolean compactMode=false;
-
-	/*
-	 * This is a special layout for the section. Both the
-	 * header and the description labels will wrap and
-	 * they will use client's size to calculate needed
-	 * height. This kind of behaviour is not possible
-	 * with stock grid layout.
-	 */
-	class SectionLayout extends Layout implements ILayoutExtension {
-		int vspacing = 3;
-		int sepHeight = 2;
-
-		public int getMinimumWidth(Composite parent, boolean flush) {
-			return 30;
-		}
-
-		public int getMaximumWidth(Composite parent, boolean flush) {
-			int maxWidth = 0;
-			if (client != null) {
-				if (client instanceof Composite) {
-					Layout cl = ((Composite) client).getLayout();
-					if (cl instanceof ILayoutExtension)
-						maxWidth =
-							((ILayoutExtension) cl).getMaximumWidth(
-								(Composite) client,
-								flush);
-				}
-				if (maxWidth == 0) {
-					Point csize =
-						client.computeSize(SWT.DEFAULT, SWT.DEFAULT, flush);
-					maxWidth = csize.x;
-				}
-			}
-			if (headerPainted && header != null) {
-				Point hsize =
-					header.computeSize(SWT.DEFAULT, SWT.DEFAULT, flush);
-				maxWidth = Math.max(maxWidth, hsize.x);
-			}
-			if (descriptionPainted && descriptionLabel != null) {
-				Point dsize =
-					descriptionLabel.computeSize(
-						SWT.DEFAULT,
-						SWT.DEFAULT,
-						flush);
-				maxWidth = Math.max(maxWidth, dsize.x);
-			}
-			return maxWidth;
-		}
-
-		protected Point computeSize(
-			Composite parent,
-			int wHint,
-			int hHint,
-			boolean flush) {
-			int width = 0;
-			int height = 0;
-			int cwidth = 0;
-			int collapsedHeight = 0;
-
-			if (wHint != SWT.DEFAULT)
-				width = wHint;
-			if (hHint != SWT.DEFAULT)
-				height = hHint;
-
-			cwidth = width;
-
-			if (client != null && !client.isDisposed()) {
-				if (toggle != null && toggle.getSelection() && compactMode) {
-				}
-				else {
-				//Point csize = client.computeSize(SWT.DEFAULT, SWT.DEFAULT, flush);
-				Point csize = client.computeSize(wHint, SWT.DEFAULT);
-				if (width == 0) {
-					width = csize.x;
-					cwidth = width;
-				}
-				if (height == 0)
-					height = csize.y;
-				}
-			}
-
-			Point toggleSize = null;
-
-			if (collapsable && toggle != null)
-				toggleSize =
-					toggle.computeSize(SWT.DEFAULT, SWT.DEFAULT, flush);
-
-			if (hHint == SWT.DEFAULT && headerPainted && header != null) {
-				int hwidth = cwidth;
-				if (toggleSize != null)
-					hwidth = cwidth - toggleSize.x - 5;
-				Point hsize = header.computeSize(hwidth, SWT.DEFAULT, flush);
-				height += hsize.y;
-				collapsedHeight = hsize.y;
-				height += vspacing;
-			}
-
-			if (hHint == SWT.DEFAULT && addSeparator) {
-				height += sepHeight;
-				height += vspacing;
-				collapsedHeight += vspacing + sepHeight;
-			}
-			if (hHint == SWT.DEFAULT
-				&& descriptionPainted
-				&& descriptionLabel != null) {
-				Point dsize =
-					descriptionLabel.computeSize(cwidth, SWT.DEFAULT, flush);
-				height += dsize.y;
-				height += vspacing;
-			}
-			if (toggle != null && toggle.getSelection()) {
-				// collapsed state
-				height = collapsedHeight;
-			}
-			return new Point(width, height);
-		}
-		protected void layout(Composite parent, boolean flush) {
-			int width = parent.getClientArea().width;
-			int height = parent.getClientArea().height;
-			int y = 0;
-			Point toggleSize = null;
-
-			if (collapsable) {
-				toggleSize =
-					toggle.computeSize(SWT.DEFAULT, SWT.DEFAULT, flush);
-			}
-			if (headerPainted && header != null) {
-				Point hsize;
-
-				int availableWidth = width;
-				if (toggleSize != null)
-					availableWidth = width - toggleSize.x - 5;
-				hsize = header.computeSize(availableWidth, SWT.DEFAULT, flush);
-				int hx = 0;
-				if (toggle != null) {
-					int ty = y + hsize.y - toggleSize.y;
-					toggle.setBounds(0, ty, toggleSize.x, toggleSize.y);
-					hx = toggleSize.x; // + 5;
-				}
-				header.setBounds(hx, y, availableWidth, hsize.y);
-
-				y += hsize.y + vspacing;
-			}
-			if (addSeparator && separator != null) {
-				separator.setBounds(0, y, width, 2);
-				y += sepHeight + vspacing;
-			}
-			if (toggle != null && toggle.getSelection()) {
-				return;
-			}
-			if (descriptionPainted && descriptionLabel != null) {
-				Point dsize =
-					descriptionLabel.computeSize(width, SWT.DEFAULT, flush);
-				descriptionLabel.setBounds(0, y, width, dsize.y);
-				y += dsize.y + vspacing;
-			}
-			if (client != null) {
-				client.setBounds(0, y, width, height - y);
-			}
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	public boolean isCompactMode() {
-		return compactMode;
-	}
-
-	/**
-	 * @param compactMode
-	 */
-	public void setCompactMode(boolean compactMode) {
-		this.compactMode = compactMode;
-	}
-
-	public FormSection() {
-		/*
-		// Description causes problems re word wrapping
-		// and causes bad layout in schema and
-		// feature editors when in Motif - turning off
-		if (SWT.getPlatform().equals("motif")) {
-			descriptionPainted = false;
-		}
-		*/
-		JFaceResources.getFontRegistry().addListener(this);
-	}
-	public void commitChanges(boolean onSave) {
-	}
-	public abstract Composite createClient(
-		Composite parent,
-		FormWidgetFactory factory);
-	public final Control createControl(
-		Composite parent,
-		final FormWidgetFactory factory) {
-		Composite section = factory.createComposite(parent);
-		SectionLayout slayout = new SectionLayout();
-		section.setLayout(slayout);
-		section.setData(this);
-
-		if (headerPainted) {
-			Color headerColor = factory.getColor(getHeaderColorKey());
-			header =
-				factory.createHeadingLabel(
-					section,
-					getHeaderText(),
-					headerColor,
-					SWT.WRAP);
-			if (collapsable) {
-				toggle = new ToggleControl(section, SWT.NULL);
-				toggle.setSelection(collapsed);
-				toggle.setBackground(factory.getBackgroundColor());
-				toggle.setActiveDecorationColor(factory.getHyperlinkColor());
-				toggle.setDecorationColor(
-					factory.getColor(
-						FormWidgetFactory.COLOR_COMPOSITE_SEPARATOR));
-				toggle.setActiveCursor(factory.getHyperlinkCursor());
-				toggle.addFocusListener(factory.visibilityHandler);
-				toggle.addKeyListener(factory.keyboardHandler);
-				toggle.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						doToggle();
-					}
-				});
-				header.addMouseListener(new MouseAdapter() {
-					public void mouseDown(MouseEvent e) {
-						toggle.setSelection(!toggle.getSelection());
-						toggle.redraw();
-						doToggle();
-					}
-				});
-				header.addMouseTrackListener(new MouseTrackAdapter() {
-					public void mouseEnter(MouseEvent e) {
-						header.setCursor(factory.getHyperlinkCursor());
-					}
-					public void mouseExit(MouseEvent e) {
-						header.setCursor(null);
-					}
-				});
-			}
-		}
-
-		if (addSeparator) {
-			//separator = factory.createSeparator(section, SWT.HORIZONTAL);
-			separator = factory.createCompositeSeparator(section);
-		}
-
-		if (descriptionPainted && description != null) {
-			descriptionLabel =
-				factory.createLabel(section, description, SWT.WRAP);
-		}
-		client = createClient(section, factory);
-		section.setData(this);
-		control = section;
-		return section;
-	}
-
-	private void doToggle() {
-		collapsed = toggle.getSelection();
-		reflow();
-		if (descriptionLabel != null)
-			descriptionLabel.setVisible(!collapsed);
-		if (client != null)
-			client.setVisible(!collapsed);
-	}
-
-	protected void reflow() {
-		control.setRedraw(false);
-		control.getParent().setRedraw(false);
-		control.layout(true);
-		control.getParent().layout(true);
-		control.setRedraw(true);
-		control.getParent().setRedraw(true);
-	}
-
-	protected Text createText(
-		Composite parent,
-		String label,
-		FormWidgetFactory factory) {
-		return createText(parent, label, factory, 1);
-	}
-	protected Text createText(
-		Composite parent,
-		String label,
-		FormWidgetFactory factory,
-		int span) {
-		factory.createLabel(parent, label);
-		Text text = factory.createText(parent, "");
-		int hfill =
-			span == 1
-				? GridData.FILL_HORIZONTAL
-				: GridData.HORIZONTAL_ALIGN_FILL;
-		GridData gd = new GridData(hfill | GridData.VERTICAL_ALIGN_CENTER);
-		gd.horizontalSpan = span;
-		text.setLayoutData(gd);
-		return text;
-	}
-	protected Text createText(
-		Composite parent,
-		String label,
-		FormWidgetFactory factory,
-		int span,
-		int style) {
-		Label l = factory.createLabel(parent, label);
-		if ((style & SWT.MULTI) != 0) {
-			GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-			l.setLayoutData(gd);
-		}
-		Text text = factory.createText(parent, "", style);
-		int hfill =
-			span == 1
-				? GridData.FILL_HORIZONTAL
-				: GridData.HORIZONTAL_ALIGN_FILL;
-		GridData gd = new GridData(hfill | GridData.VERTICAL_ALIGN_CENTER);
-		gd.horizontalSpan = span;
-		text.setLayoutData(gd);
-		return text;
-	}
-	protected Text createText(
-		Composite parent,
-		FormWidgetFactory factory,
-		int span) {
-		Text text = factory.createText(parent, "");
-		int hfill =
-			span == 1
-				? GridData.FILL_HORIZONTAL
-				: GridData.HORIZONTAL_ALIGN_FILL;
-		GridData gd = new GridData(hfill | GridData.VERTICAL_ALIGN_CENTER);
-		//gd.grabExcessHorizontalSpace = true;
-		gd.horizontalSpan = span;
-		text.setLayoutData(gd);
-		return text;
-	}
-	public void dispose() {
-		JFaceResources.getFontRegistry().removeListener(this);
-	}
-	public boolean doGlobalAction(String actionId) {
-		return false;
-	}
-	public void expandTo(Object object) {
-	}
-	public final void fireChangeNotification(
-		int changeType,
-		Object changeObject) {
-		if (sectionManager == null)
-			return;
-		sectionManager.dispatchNotification(this, changeType, changeObject);
-	}
-	public final void fireSelectionNotification(Object changeObject) {
-		fireChangeNotification(SELECTION, changeObject);
-	}
-	public java.lang.String getDescription() {
-		return description;
-	}
-	public java.lang.String getHeaderColorKey() {
-		return headerColorKey;
-	}
-	public java.lang.String getHeaderText() {
-		return headerText;
-	}
-	public int getHeightHint() {
-		return heightHint;
-	}
-	public int getWidthHint() {
-		return widthHint;
-	}
-	public void initialize(Object input) {
-	}
-	public boolean isAddSeparator() {
-		return addSeparator;
-	}
-	public boolean isDescriptionPainted() {
-		return descriptionPainted;
-	}
-	public boolean isDirty() {
-		return dirty;
-	}
-	public boolean isHeaderPainted() {
-		return headerPainted;
-	}
-	public boolean isReadOnly() {
-		return readOnly;
-	}
-	public void sectionChanged(
-		FormSection source,
-		int changeType,
-		Object changeObject) {
-	}
-	public void setAddSeparator(boolean newAddSeparator) {
-		addSeparator = newAddSeparator;
-	}
-
-	private String trimNewLines(String text) {
-		StringBuffer buff = new StringBuffer();
-		for (int i = 0; i < text.length(); i++) {
-			char c = text.charAt(i);
-			if (c == '\n')
-				buff.append(' ');
-			else
-				buff.append(c);
-		}
-		return buff.toString();
-	}
-
-	public void setDescription(java.lang.String newDescription) {
-		// we will trim the new lines so that we can
-		// use layout-based word wrapping instead
-		// of hard-coded one
-		description = trimNewLines(newDescription);
-		//description = newDescription;
-		if (descriptionLabel != null)
-			descriptionLabel.setText(newDescription);
-	}
-	public void setDescriptionPainted(boolean newDescriptionPainted) {
-		descriptionPainted = newDescriptionPainted;
-	}
-	public void setDirty(boolean newDirty) {
-		dirty = newDirty;
-	}
-	public void setFocus() {
-		if (toggle != null)
-			toggle.setFocus();
-	}
-	public void setHeaderColorKey(java.lang.String newHeaderColorKey) {
-		headerColorKey = newHeaderColorKey;
-	}
-	public void setHeaderPainted(boolean newHeaderPainted) {
-		headerPainted = newHeaderPainted;
-	}
-	public void setHeaderText(java.lang.String newHeaderText) {
-		headerText = newHeaderText;
-		if (header != null)
-			header.setText(headerText);
-	}
-	public void setHeightHint(int newHeightHint) {
-		heightHint = newHeightHint;
-	}
-	void setManager(SectionChangeManager manager) {
-		this.sectionManager = manager;
-	}
-	public void setReadOnly(boolean newReadOnly) {
-		readOnly = newReadOnly;
-	}
-
-	public void setWidthHint(int newWidthHint) {
-		widthHint = newWidthHint;
-	}
-
-	public void update() {
-	}
-
-	public void propertyChange(PropertyChangeEvent arg0) {
-		if (control != null && header != null && !control.isDisposed() && !header.isDisposed()) {
-			header.setFont(JFaceResources.getBannerFont());
-			control.layout(true);
-		}
-	}
-
-	/**
-	 * Gets the collapsable.
-	 * @return Returns a boolean
-	 */
-	public boolean getCollapsable() {
-		return collapsable;
-	}
-
-	/**
-	 * Sets the collapsable.
-	 * @param collapsable The collapsable to set
-	 */
-	public void setCollapsable(boolean collapsable) {
-		this.collapsable = collapsable;
-	}
-
-	public void setCollapsed(boolean collapsed) {
-		this.collapsed = collapsed;
-	}
-	
-	public boolean isCollapsed() {
-		return collapsed;
-	}
-
-	public boolean canPaste(Clipboard clipboard) {
-		return false;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormWidgetFactory.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormWidgetFactory.java
deleted file mode 100644
index 74b9cd7..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormWidgetFactory.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.graphics.*;
-import java.util.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.ui.actions.*;
-import org.eclipse.update.ui.forms.internal.engine.FormEngine;
-
-public class FormWidgetFactory {
-	public static final String KEY_DRAW_BORDER = "FormWidgetFactory.drawBorder";
-	public static final String TREE_BORDER = "treeBorder";
-	public static final String DEFAULT_HEADER_COLOR = "__default__header__";
-	public static final String COLOR_BORDER = "__border";
-	public static final String COLOR_COMPOSITE_SEPARATOR = "__compSep";
-
-	private Hashtable colorRegistry = new Hashtable();
-	private Color backgroundColor;
-	private KeyListener deleteListener;
-	private Color foregroundColor;
-	private Display display;
-	public static final int BORDER_STYLE = SWT.NONE; //SWT.BORDER;
-	private BorderPainter borderPainter;
-	private Color borderColor;
-	private HyperlinkHandler hyperlinkHandler;
-	/* default */ VisibilityHandler visibilityHandler;
-	/* default */ KeyboardHandler keyboardHandler;
-
-	class BorderPainter implements PaintListener {
-		public void paintControl(PaintEvent event) {
-			Composite composite = (Composite) event.widget;
-			Control[] children = composite.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				Control c = children[i];
-				boolean inactiveBorder=false;
-				if (c.getEnabled() == false && !(c instanceof CCombo))
-					continue;
-				if (c instanceof SelectableFormLabel)
-					continue;
-				Object flag = c.getData(KEY_DRAW_BORDER);
-				if (flag!=null) {
-					if (flag.equals(Boolean.FALSE)) continue;
-					if (flag.equals(TREE_BORDER)) inactiveBorder=true;
-				}
-				 
-				if (!inactiveBorder && (c instanceof Text || c instanceof Canvas || c instanceof CCombo)) {
-					Rectangle b = c.getBounds();
-					GC gc = event.gc;
-					gc.setForeground(c.getBackground());
-					gc.drawRectangle(b.x - 1, b.y - 1, b.width + 1, b.height + 1);
-					gc.setForeground(foregroundColor);
-					if (c instanceof CCombo)
-						gc.drawRectangle(b.x - 1, b.y - 1, b.width + 1, b.height + 1);
-					else 
-						gc.drawRectangle(b.x - 1, b.y - 2, b.width + 1, b.height + 3);
-				} else if (inactiveBorder ||c instanceof Table || c instanceof Tree || c instanceof TableTree) {
-					Rectangle b = c.getBounds();
-					GC gc = event.gc;
-					gc.setForeground(borderColor);
-					//gc.drawRectangle(b.x - 2, b.y - 2, b.width + 3, b.height + 3);
-					gc.drawRectangle(b.x - 1, b.y - 1, b.width + 2, b.height + 2);
-				}
-			}
-		}
-	}
-
-	class VisibilityHandler extends FocusAdapter {
-		public void focusGained(FocusEvent e) {
-			Widget w = e.widget;
-			if (w instanceof Control) {
-				ensureVisible((Control) w);
-			}
-		}
-	}
-
-	class KeyboardHandler extends KeyAdapter {
-		public void keyPressed(KeyEvent e) {
-			Widget w = e.widget;
-			if (w instanceof Control) {
-				processKey(e.keyCode, (Control) w);
-			}
-		}
-	}
-
-	public FormWidgetFactory() {
-		this(Display.getCurrent());
-	}
-
-	public FormWidgetFactory(Display display) {
-		this.display = display;
-		initialize();
-	}
-
-	public static ScrolledComposite getScrolledComposite(Control c) {
-		Composite parent = c.getParent();
-
-		while (parent != null) {
-			if (parent instanceof ScrolledComposite) {
-				return (ScrolledComposite) parent;
-			}
-			parent = parent.getParent();
-		}
-		return null;
-	}
-
-	public static void ensureVisible(Control c) {
-		ScrolledComposite scomp = getScrolledComposite(c);
-		if (scomp != null) {
-			AbstractSectionForm.ensureVisible(scomp, c);
-		}
-	}
-
-	public static void processKey(int keyCode, Control c) {
-		ScrolledComposite scomp = getScrolledComposite(c);
-		if (scomp != null) {
-			switch (keyCode) {
-				case SWT.ARROW_DOWN :
-					AbstractSectionForm.scrollVertical(scomp, false);
-					break;
-				case SWT.ARROW_UP :
-					AbstractSectionForm.scrollVertical(scomp, true);
-					break;
-				case SWT.ARROW_LEFT :
-					AbstractSectionForm.scrollHorizontal(scomp, true);
-					break;
-				case SWT.ARROW_RIGHT :
-					AbstractSectionForm.scrollHorizontal(scomp, false);
-					break;
-				case SWT.PAGE_UP :
-					AbstractSectionForm.scrollPage(scomp, true);
-					break;
-				case SWT.PAGE_DOWN :
-					AbstractSectionForm.scrollPage(scomp, false);
-					break;
-			}
-		}
-	}
-
-	public Button createButton(Composite parent, String text, int style) {
-		int flatStyle = BORDER_STYLE == SWT.BORDER ? SWT.NULL : SWT.FLAT;
-		//int flatStyle = SWT.NULL;
-		Button button = new Button(parent, style | flatStyle);
-		button.setBackground(backgroundColor);
-		button.setForeground(foregroundColor);
-		if (text != null)
-			button.setText(text);
-		button.addFocusListener(visibilityHandler);
-		return button;
-	}
-	public Composite createComposite(Composite parent) {
-		return createComposite(parent, SWT.NULL);
-	}
-	public Composite createComposite(Composite parent, int style) {
-		Composite composite = new Composite(parent, style);
-		composite.setBackground(backgroundColor);
-		composite.addMouseListener(new MouseAdapter() {
-			public void mousePressed(MouseEvent e) {
-				((Control) e.widget).setFocus();
-			}
-		});
-		composite.setMenu(parent.getMenu());
-		return composite;
-	}
-	public Composite createCompositeSeparator(Composite parent) {
-		final Composite composite = new Composite(parent, SWT.NONE);
-		composite.addListener(SWT.Paint, new Listener() {
-			public void handleEvent(Event e) {
-				if (composite.isDisposed()) return;
-				Rectangle bounds = composite.getBounds();
-				GC gc = e.gc;
-				gc.setForeground(getColor(COLOR_COMPOSITE_SEPARATOR));
-				gc.setBackground(getBackgroundColor());
-				gc.fillGradientRectangle(0, 0, bounds.width, bounds.height, false);	
-			}
-		});
-		return composite;
-	}
-
-	public Label createHeadingLabel(Composite parent, String text) {
-		return createHeadingLabel(parent, text, null, SWT.NONE);
-	}
-
-	public Label createHeadingLabel(Composite parent, String text, int style) {
-		return createHeadingLabel(parent, text, null, style);
-	}
-
-	public Label createHeadingLabel(Composite parent, String text, Color bg) {
-		return createHeadingLabel(parent, text, bg, SWT.NONE);
-	}
-
-	public Label createHeadingLabel(
-		Composite parent,
-		String text,
-		Color bg,
-		int style) {
-		Label label = new Label(parent, style);
-		if (text != null)
-			label.setText(text);
-		label.setBackground(backgroundColor);
-		label.setForeground(foregroundColor);
-		label.setFont(JFaceResources.getFontRegistry().get(JFaceResources.BANNER_FONT));
-		return label;
-	}
-
-	public Label createHyperlinkLabel(
-		Composite parent,
-		String text,
-		IHyperlinkListener listener) {
-		return createHyperlinkLabel(parent, text, listener, SWT.NULL);
-	}
-	public Label createHyperlinkLabel(
-		Composite parent,
-		String text,
-		IHyperlinkListener listener,
-		int style) {
-		Label label = createLabel(parent, text, style);
-		turnIntoHyperlink(label, listener);
-		return label;
-	}
-	public Label createLabel(Composite parent, String text) {
-		return createLabel(parent, text, SWT.NONE);
-	}
-	public Label createLabel(Composite parent, String text, int style) {
-		Label label = new Label(parent, style);
-		if (text != null)
-			label.setText(text);
-		label.setBackground(backgroundColor);
-		label.setForeground(foregroundColor);
-		return label;
-	}
-
-	public SelectableFormLabel createSelectableLabel(
-		Composite parent,
-		String text) {
-		return createSelectableLabel(parent, text, SWT.NONE);
-	}
-
-	public SelectableFormLabel createSelectableLabel(
-		Composite parent,
-		String text,
-		int style) {
-		SelectableFormLabel label = new SelectableFormLabel(parent, style);
-		if (text != null)
-			label.setText(text);
-		label.setBackground(backgroundColor);
-		label.setForeground(foregroundColor);
-		label.addFocusListener(visibilityHandler);
-		label.addKeyListener(keyboardHandler);
-		return label;
-	}
-
-	public FormEngine createFormEngine(Composite parent) {
-		return createFormEngine(parent, false);
-	}
-	
-	public FormEngine createFormEngine(Composite parent, boolean trackFocus) {
-		FormEngine engine = new FormEngine(parent, SWT.WRAP);
-		engine.setBackground(backgroundColor);
-		engine.setForeground(foregroundColor);
-		engine.marginWidth = 1;
-		engine.marginHeight = 0;
-		engine.setHyperlinkSettings(getHyperlinkHandler());
-		if (trackFocus) engine.addFocusListener(visibilityHandler);
-		engine.addKeyListener(keyboardHandler);
-		engine.setMenu(parent.getMenu());
-		return engine;
-	}
-	
-	public Label createSeparator(Composite parent, int style) {
-		Label label = new Label(parent, SWT.SEPARATOR | style);
-		label.setBackground(backgroundColor);
-		label.setForeground(borderColor);
-		return label;
-	}
-	public Table createTable(Composite parent, int style) {
-		Table table = new Table(parent, BORDER_STYLE | style);
-		table.setBackground(backgroundColor);
-		table.setForeground(foregroundColor);
-		hookDeleteListener(table);
-		return table;
-	}
-	public Text createText(Composite parent, String value) {
-		return createText(parent, value, BORDER_STYLE | SWT.SINGLE);
-	}
-	public Text createText(Composite parent, String value, int style) {
-		Text text = new Text(parent, style);
-		if (value != null)
-			text.setText(value);
-		text.setBackground(backgroundColor);
-		text.setForeground(foregroundColor);
-		text.addFocusListener(visibilityHandler);
-		return text;
-	}
-	public Tree createTree(Composite parent, int style) {
-		Tree tree = new Tree(parent, BORDER_STYLE | style);
-		tree.setBackground(backgroundColor);
-		tree.setForeground(foregroundColor);
-		hookDeleteListener(tree);
-		return tree;
-	}
-	private void deleteKeyPressed(Widget widget) {
-		if (!(widget instanceof Control))
-			return;
-		Control control = (Control) widget;
-		for (Control parent = control.getParent();
-			parent != null;
-			parent = parent.getParent()) {
-			if (parent.getData() instanceof FormSection) {
-				FormSection section = (FormSection) parent.getData();
-				section.doGlobalAction(ActionFactory.DELETE.getId());
-				break;
-			}
-		}
-	}
-	public void dispose() {
-		Enumeration colors = colorRegistry.elements();
-		while (colors.hasMoreElements()) {
-			Color c = (Color) colors.nextElement();
-			c.dispose();
-		}
-		hyperlinkHandler.dispose();
-		colorRegistry = null;
-	}
-	public Color getBackgroundColor() {
-		return backgroundColor;
-	}
-	public Color getBorderColor() {
-		return borderColor;
-	}
-	public Cursor getBusyCursor() {
-		return hyperlinkHandler.getBusyCursor();
-	}
-	public Color getColor(String key) {
-		return (Color) colorRegistry.get(key);
-	}
-	public Color getForegroundColor() {
-		return foregroundColor;
-	}
-	public HyperlinkHandler getHyperlinkHandler() {
-		return hyperlinkHandler;
-	}
-	public Cursor getHyperlinkCursor() {
-		return hyperlinkHandler.getHyperlinkCursor();
-	}
-	public Color getHyperlinkColor() {
-		return hyperlinkHandler.getForeground();
-	}
-	public Color getHyperlinkHoverColor() {
-		return hyperlinkHandler.getActiveForeground();
-	}
-	public int getHyperlinkUnderlineMode() {
-		return hyperlinkHandler.getHyperlinkUnderlineMode();
-	}
-	public void hookDeleteListener(Control control) {
-		if (deleteListener == null) {
-			deleteListener = new KeyAdapter() {
-				public void keyPressed(KeyEvent event) {
-					if (event.character == SWT.DEL && event.stateMask == 0) {
-						deleteKeyPressed(event.widget);
-					}
-				}
-			};
-		}
-		control.addKeyListener(deleteListener);
-	}
-	private void initialize() {
-		backgroundColor = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
-		registerColor(COLOR_BORDER, 195, 191, 179);
-		registerColor(COLOR_COMPOSITE_SEPARATOR, 152, 170, 203);
-		registerColor(DEFAULT_HEADER_COLOR, 0x48, 0x70, 0x98);
-		if (isWhiteBackground())
-			borderColor = getColor(COLOR_BORDER);
-		else
-			borderColor = display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-		foregroundColor = display.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
-		hyperlinkHandler = new HyperlinkHandler();
-		hyperlinkHandler.setBackground(backgroundColor);
-		updateHyperlinkColors();
-		visibilityHandler = new VisibilityHandler();
-		keyboardHandler = new KeyboardHandler();
-	}
-	
-	public boolean isWhiteBackground() {
-		return backgroundColor.getRed()==255 && backgroundColor.getGreen()==255 &&
-			backgroundColor.getBlue()==255;
-	}
-
-	public void updateHyperlinkColors() {
-		Color hyperlinkColor = JFaceColors.getHyperlinkText(display);
-		Color activeHyperlinkColor = JFaceColors.getActiveHyperlinkText(display);
-		hyperlinkHandler.setForeground(hyperlinkColor);
-		hyperlinkHandler.setActiveForeground(activeHyperlinkColor);
-	}
-
-	public void paintBordersFor(Composite parent) {
-		if (BORDER_STYLE == SWT.BORDER)
-			return;
-		if (borderPainter == null)
-			borderPainter = new BorderPainter();
-		parent.addPaintListener(borderPainter);
-	}
-	public Color registerColor(String key, int r, int g, int b) {
-		Color c = new Color(display, r, g, b);
-		colorRegistry.put(key, c);
-		return c;
-	}
-	public void setBackgroundColor(Color color) {
-		backgroundColor = color;
-	}
-	public void setHyperlinkColor(Color color) {
-		hyperlinkHandler.setForeground(color);
-	}
-	public void setHyperlinkHoverColor(org.eclipse.swt.graphics.Color hoverColor) {
-		hyperlinkHandler.setActiveForeground(hoverColor);
-	}
-	public void setHyperlinkUnderlineMode(int newHyperlinkUnderlineMode) {
-		hyperlinkHandler.setHyperlinkUnderlineMode(newHyperlinkUnderlineMode);
-	}
-	public void turnIntoHyperlink(Control control, IHyperlinkListener listener) {
-		hyperlinkHandler.registerHyperlink(control, listener);
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormsPlugin.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormsPlugin.java
deleted file mode 100644
index 5448093..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormsPlugin.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.*;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-public class FormsPlugin extends AbstractUIPlugin {
-	private static FormsPlugin instance;
-	private ResourceBundle resourceBundle;
-
-	/**
-	 * Constructor for FormsPlugin.
-	 * @param descriptor
-	 */
-	public FormsPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		instance = this;
-		try {
-			resourceBundle =
-				ResourceBundle.getBundle(
-					"org.eclipse.update.ui.forms.internal.FormsPluginResources");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle,
-	 * or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		FormsPlugin inst = FormsPlugin.getDefault();
-		if (inst==null) return key;
-		ResourceBundle bundle = FormsPlugin.getDefault().getResourceBundle();
-		try {
-			return bundle.getString(key);
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	public static String getFormattedMessage(String key, String[] args) {
-		String text = getResourceString(key);
-		return java.text.MessageFormat.format(text, args);
-	}
-
-	public static String getFormattedMessage(String key, String arg) {
-		String text = getResourceString(key);
-		return java.text.MessageFormat.format(text, new Object[] { arg });
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	public static FormsPlugin getDefault() {
-		return instance;
-	}
-
-	public static IWorkbenchPage getActivePage() {
-		return getDefault().internalGetActivePage();
-	}
-
-	private IWorkbenchPage internalGetActivePage() {
-		return getWorkbench().getActiveWorkbenchWindow().getActivePage();
-	}
-
-	public static Shell getActiveWorkbenchShell() {
-		return getActiveWorkbenchWindow().getShell();
-	}
-
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	public static String getPluginId() {
-		return getDefault().getDescriptor().getUniqueIdentifier();
-	}
-
-	public static void logException(Throwable e) {
-		logException(e, true);
-	}
-
-	public static void logException(Throwable e, boolean showErrorDialog) {
-		if (e instanceof InvocationTargetException) {
-			e = ((InvocationTargetException) e).getTargetException();
-		}
-
-		IStatus status = null;
-		if (e instanceof CoreException) {
-			status = ((CoreException) e).getStatus();
-		} else {
-			String message = e.getMessage();
-			if (message == null)
-				message = e.toString();
-			status =
-				new Status(
-					IStatus.ERROR,
-					getPluginId(),
-					IStatus.OK,
-					message,
-					e);
-		}
-		log(status, showErrorDialog);
-	}
-
-	public static void log(IStatus status, boolean showErrorDialog) {
-		if (showErrorDialog)
-			ErrorDialog.openError(
-				getActiveWorkbenchShell(),
-				null,
-				null,
-				status);
-		Platform.getPlugin("org.eclipse.core.runtime").getLog().log(status);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormsPluginResources.properties b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormsPluginResources.properties
deleted file mode 100644
index 6d45e06..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormsPluginResources.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-FormEgine.linkPopup.open = &Open
-FormEgine.linkPopup.copyShortcut = &Copy as Shortcut
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HTMLTableLayout.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HTMLTableLayout.java
deleted file mode 100644
index 0dd2126..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HTMLTableLayout.java
+++ /dev/null
@@ -1,678 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-import java.util.Vector;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-
-/**
- * This implementation of the layout algorithm attempts to position controls in
- * the composite using a two-pass autolayout HTML table altorithm recommeded by
- * HTML 4.01 W3C specification. The main differences with GridLayout is that it
- * has two passes and that width and height are not calculated in the same
- * pass.
- * <p>
- * The advantage of the algorithm over GridLayout is that it is capable of
- * flowing text controls capable of line wrap. These controls do not have
- * natural 'preferred size'. Instead, they are capable of providing the
- * required height if the width is set. Consequently, this algorithm first
- * calculates the widths that will be assigned to columns, and then passes
- * those widths to the controls to calculate the height. When a composite with
- * this layout is a child of the scrolling composite, they should interact in
- * such a way that reduction in the scrolling composite width results in the
- * reflow and increase of the overall height.
- * <p>
- * If none of the columns contain expandable and wrappable controls, the
- * end-result will be similar to the one provided by GridLayout. The difference
- * will show up for layouts that contain controls whose minimum and maximum
- * widths are not the same.
- */
-
-public class HTMLTableLayout extends Layout implements ILayoutExtension {
-	public int numColumns = 1;
-	public int leftMargin = 5;
-	public int rightMargin = 5;
-	public int topMargin = 5;
-	public int bottomMargin = 5;
-	public int horizontalSpacing = 5;
-	public int verticalSpacing = 5;
-	public boolean makeColumnsEqualWidth = false;
-
-	private boolean initialLayout = true;
-	private Vector grid = null;
-	private int[] minColumnWidths, maxColumnWidths;
-	private int widestColumnWidth;
-	private int[] growingColumns;
-
-	public int getMinimumWidth(Composite parent, boolean changed) {
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-			changed = true;
-			initialLayout = false;
-		}
-		if (grid == null || changed) {
-			changed = true;
-			grid = new Vector();
-			createGrid(parent);
-		}
-		if (minColumnWidths == null)
-			minColumnWidths = new int[numColumns];
-		for (int i = 0; i < numColumns; i++) {
-			minColumnWidths[i] = 0;
-		}
-		return internalGetMinimumWidth(parent, changed);
-	}
-
-	public int getMaximumWidth(Composite parent, boolean changed) {
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-			changed = true;
-			initialLayout = false;
-		}
-		if (grid == null || changed) {
-			changed = true;
-			grid = new Vector();
-			createGrid(parent);
-		}
-		if (maxColumnWidths == null)
-			maxColumnWidths = new int[numColumns];
-		for (int i = 0; i < numColumns; i++) {
-			maxColumnWidths[i] = 0;
-		}
-		return internalGetMaximumWidth(parent, changed);
-	}
-
-	/**
-	 * @see Layout#layout(Composite, boolean)
-	 */
-	protected void layout(Composite parent, boolean changed) {
-		Rectangle clientArea = parent.getClientArea();
-		Control[] children = parent.getChildren();
-		if (children.length == 0)
-			return;
-		int parentWidth = clientArea.width;
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-			changed = true;
-			initialLayout = false;
-		}
-		if (grid == null || changed) {
-			changed = true;
-			grid = new Vector();
-			createGrid(parent);
-		}
-		resetColumnWidths();
-		int minWidth = internalGetMinimumWidth(parent, changed);
-		int maxWidth = internalGetMaximumWidth(parent, changed);
-
-		int tableWidth = parentWidth;
-
-		int[] columnWidths;
-
-		if (parentWidth < minWidth) {
-			tableWidth = minWidth;
-			if (makeColumnsEqualWidth) {
-				columnWidths = new int[numColumns];
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = widestColumnWidth;
-				}
-			} else
-				columnWidths = minColumnWidths;
-		} else if (parentWidth > maxWidth) {
-			if (growingColumns.length == 0) {
-				tableWidth = maxWidth;
-				columnWidths = maxColumnWidths;
-			} else {
-				columnWidths = new int[numColumns];
-				int colSpace = tableWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns - 1) * horizontalSpacing;
-				int extra = parentWidth - maxWidth;
-				int colExtra = extra / growingColumns.length;
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = maxColumnWidths[i];
-
-					if (isGrowingColumn(i)) {
-						columnWidths[i] += colExtra;
-					}
-				}
-			}
-		} else {
-			columnWidths = new int[numColumns];
-			if (makeColumnsEqualWidth) {
-				int colSpace = tableWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns - 1) * horizontalSpacing;
-				int col = colSpace / numColumns;
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = col;
-				}
-			} else {
-				int[] extraSpace =
-					calculateExtraSpace(tableWidth, maxWidth, minWidth);
-				for (int i = 0; i < numColumns; i++) {
-					int minCWidth = minColumnWidths[i];
-					columnWidths[i] = minCWidth + extraSpace[i];
-				}
-			}
-		}
-		int x = 0;
-		int y = topMargin;
-		// assign widths
-		for (int i = 0; i < grid.size(); i++) {
-			TableData[] row = (TableData[]) grid.elementAt(i);
-			// assign widths, calculate heights
-			int rowHeight = 0;
-			x = leftMargin;
-			for (int j = 0; j < numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData == false) {
-					continue;
-				}
-				Control child = children[td.childIndex];
-				int span = td.colspan;
-				int cwidth = 0;
-				for (int k = j; k < j + span; k++) {
-					cwidth += columnWidths[k];
-					if (k < j + span - 1)
-						cwidth += horizontalSpacing;
-				}
-				Point size = computeSize(child, cwidth, changed);
-				td.compWidth = cwidth;
-				if (td.heightHint != SWT.DEFAULT) {
-					size = new Point(size.x, td.heightHint);
-				}
-				td.compSize = size;
-				rowHeight = Math.max(rowHeight, size.y);
-			}
-			for (int j = 0; j < numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData == false) {
-					continue;
-				}
-				Control child = children[td.childIndex];
-				placeControl(child, td, x, y, rowHeight);
-				x += td.compWidth;
-				if (j < numColumns - 1)
-					x += horizontalSpacing;
-			}
-			y += rowHeight + verticalSpacing;
-		}
-	}
-
-	boolean isGrowingColumn(int col) {
-		if (growingColumns == null)
-			return false;
-		for (int i = 0; i < growingColumns.length; i++) {
-			if (col == growingColumns[i])
-				return true;
-		}
-		return false;
-	}
-
-	int[] calculateExtraSpace(int tableWidth, int maxWidth, int minWidth) {
-		int fixedPart =
-			leftMargin + rightMargin + (numColumns - 1) * horizontalSpacing;
-		int D = maxWidth - minWidth;
-
-		int W = tableWidth - fixedPart - minWidth;
-
-		int extraSpace[] = new int[numColumns];
-
-		int rem = 0;
-		for (int i = 0; i < numColumns; i++) {
-			int cmin = minColumnWidths[i];
-			int cmax = maxColumnWidths[i];
-			int d = cmax - cmin;
-			int extra = D != 0 ? (d * W) / D : 0;
-			if (i < numColumns - 1) {
-				extraSpace[i] = extra;
-				rem += extra;
-			} else {
-				extraSpace[i] = W - rem;
-			}
-		}
-		return extraSpace;
-	}
-
-	Point computeSize(Control child, int width, boolean changed) {
-		int widthArg = width;
-		if (!isWrap(child))
-			widthArg = SWT.DEFAULT;
-		Point size = child.computeSize(widthArg, SWT.DEFAULT, changed);
-		return size;
-	}
-
-	void placeControl(
-		Control control,
-		TableData td,
-		int x,
-		int y,
-		int rowHeight) {
-		int xloc = x + td.indent;
-		int yloc = y;
-		int width = td.compSize.x;
-		int height = td.compSize.y;
-		int colWidth = td.compWidth;
-
-		// align horizontally
-		if (td.align == TableData.CENTER) {
-			xloc = x + colWidth / 2 - width / 2;
-		} else if (td.align == TableData.RIGHT) {
-			xloc = x + colWidth - width;
-		} else if (td.align == TableData.FILL) {
-			width = colWidth;
-		}
-		// align vertically
-		if (td.valign == TableData.MIDDLE) {
-			yloc = y + rowHeight / 2 - height / 2;
-		} else if (td.valign == TableData.BOTTOM) {
-			yloc = y + rowHeight - height;
-		} else if (td.valign == TableData.FILL) {
-			height = rowHeight;
-		}
-		control.setBounds(xloc, yloc, width, height);
-	}
-
-	void createGrid(Composite composite) {
-		int row, column, rowFill, columnFill;
-		Control[] children;
-		TableData spacerSpec;
-		Vector growingCols = new Vector();
-
-		// 
-		children = composite.getChildren();
-		if (children.length == 0)
-			return;
-
-		// 
-		grid.addElement(createEmptyRow());
-		row = 0;
-		column = 0;
-
-		// Loop through the children and place their associated layout specs in
-		// the
-		// grid. Placement occurs left to right, top to bottom (i.e., by row).
-		for (int i = 0; i < children.length; i++) {
-			// Find the first available spot in the grid.
-			Control child = children[i];
-			TableData spec = (TableData) child.getLayoutData();
-			while (((TableData[]) grid.elementAt(row))[column] != null) {
-				column = column + 1;
-				if (column >= numColumns) {
-					row = row + 1;
-					column = 0;
-					if (row >= grid.size()) {
-						grid.addElement(createEmptyRow());
-					}
-				}
-			}
-			// See if the place will support the widget's horizontal span. If
-			// not, go to the
-			// next row.
-			if (column + spec.colspan - 1 >= numColumns) {
-				grid.addElement(createEmptyRow());
-				row = row + 1;
-				column = 0;
-			}
-
-			// The vertical span for the item will be at least 1. If it is > 1,
-			// add other rows to the grid.
-			for (int j = 2; j <= spec.rowspan; j++) {
-				if (row + j > grid.size()) {
-					grid.addElement(createEmptyRow());
-				}
-			}
-
-			// Store the layout spec. Also cache the childIndex. NOTE: That we
-			// assume the children of a
-			// composite are maintained in the order in which they are created
-			// and added to the composite.
-			 ((TableData[]) grid.elementAt(row))[column] = spec;
-			spec.childIndex = i;
-
-			if (spec.grabHorizontal) {
-				updateGrowingColumns(growingCols, spec, column);
-			}
-
-			// Put spacers in the grid to account for the item's vertical and
-			// horizontal
-			// span.
-			rowFill = spec.rowspan - 1;
-			columnFill = spec.colspan - 1;
-			for (int r = 1; r <= rowFill; r++) {
-				for (int c = 0; c < spec.colspan; c++) {
-					spacerSpec = new TableData();
-					spacerSpec.isItemData = false;
-					((TableData[]) grid.elementAt(row + r))[column + c] =
-						spacerSpec;
-				}
-			}
-			for (int c = 1; c <= columnFill; c++) {
-				for (int r = 0; r < spec.rowspan; r++) {
-					spacerSpec = new TableData();
-					spacerSpec.isItemData = false;
-					((TableData[]) grid.elementAt(row + r))[column + c] =
-						spacerSpec;
-				}
-			}
-			column = column + spec.colspan - 1;
-		}
-
-		// Fill out empty grid cells with spacers.
-		for (int k = column + 1; k < numColumns; k++) {
-			spacerSpec = new TableData();
-			spacerSpec.isItemData = false;
-			((TableData[]) grid.elementAt(row))[k] = spacerSpec;
-		}
-		for (int k = row + 1; k < grid.size(); k++) {
-			spacerSpec = new TableData();
-			spacerSpec.isItemData = false;
-			((TableData[]) grid.elementAt(k))[column] = spacerSpec;
-		}
-		growingColumns = new int[growingCols.size()];
-		for (int i = 0; i < growingCols.size(); i++) {
-			growingColumns[i] = ((Integer) growingCols.get(i)).intValue();
-		}
-	}
-
-	private void updateGrowingColumns(
-		Vector growingColumns,
-		TableData spec,
-		int column) {
-		int affectedColumn = column + spec.colspan - 1;
-		for (int i = 0; i < growingColumns.size(); i++) {
-			Integer col = (Integer) growingColumns.get(i);
-			if (col.intValue() == affectedColumn)
-				return;
-		}
-		growingColumns.add(new Integer(affectedColumn));
-	}
-
-	private TableData[] createEmptyRow() {
-		TableData[] row = new TableData[numColumns];
-		for (int i = 0; i < numColumns; i++)
-			row[i] = null;
-		return row;
-	}
-
-	/**
-	 * @see Layout#computeSize(Composite, int, int, boolean)
-	 */
-	protected Point computeSize(
-		Composite parent,
-		int wHint,
-		int hHint,
-		boolean changed) {
-		Control[] children = parent.getChildren();
-		if (children.length == 0) {
-			return new Point(0, 0);
-		}
-		int parentWidth = wHint;
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-			changed = true;
-			initialLayout = false;
-		}
-		if (grid == null || changed) {
-			changed = true;
-			grid = new Vector();
-			createGrid(parent);
-		}
-		resetColumnWidths();
-		int minWidth = internalGetMinimumWidth(parent, changed);
-		int maxWidth = internalGetMaximumWidth(parent, changed);
-
-		int tableWidth = parentWidth;
-
-		int[] columnWidths;
-
-		if (parentWidth < minWidth) {
-			tableWidth = minWidth;
-			if (makeColumnsEqualWidth) {
-				columnWidths = new int[numColumns];
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = widestColumnWidth;
-				}
-			} else
-				columnWidths = minColumnWidths;
-		} else if (parentWidth > maxWidth) {
-			if (makeColumnsEqualWidth) {
-				columnWidths = new int[numColumns];
-				int colSpace = parentWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns - 1) * horizontalSpacing;
-				int col = colSpace / numColumns;
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = col;
-				}
-			} else {
-				tableWidth = maxWidth;
-				columnWidths = maxColumnWidths;
-			}
-		} else {
-			columnWidths = new int[numColumns];
-			if (makeColumnsEqualWidth) {
-				int colSpace = tableWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns - 1) * horizontalSpacing;
-				int col = colSpace / numColumns;
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = col;
-				}
-			} else {
-				int[] extraSpace =
-					calculateExtraSpace(tableWidth, maxWidth, minWidth);
-				for (int i = 0; i < numColumns; i++) {
-					int minCWidth = minColumnWidths[i];
-					columnWidths[i] = minCWidth + extraSpace[i];
-				}
-			}
-		}
-		int totalHeight = 0;
-		int y = topMargin;
-		// compute widths
-		for (int i = 0; i < grid.size(); i++) {
-			TableData[] row = (TableData[]) grid.elementAt(i);
-			// assign widths, calculate heights
-			int rowHeight = 0;
-			for (int j = 0; j < numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData == false) {
-					continue;
-				}
-				Control child = children[td.childIndex];
-				int span = td.colspan;
-				int cwidth = 0;
-				for (int k = j; k < j + span; k++) {
-					if (k > j)
-						cwidth += horizontalSpacing;
-					cwidth += columnWidths[k];
-				}
-				int cy = td.heightHint;
-				if (cy == SWT.DEFAULT) {
-					Point size = computeSize(child, cwidth, changed);
-					cy = size.y;
-				}
-				rowHeight = Math.max(rowHeight, cy);
-			}
-			y += rowHeight + verticalSpacing;
-		}
-		totalHeight = y + bottomMargin;
-		return new Point(tableWidth, totalHeight);
-	}
-
-	int internalGetMinimumWidth(Composite parent, boolean changed) {
-		if (changed)
-			calculateMinimumColumnWidths(parent, true);
-		int minimumWidth = 0;
-
-		widestColumnWidth = 0;
-
-		if (makeColumnsEqualWidth) {
-			for (int i = 0; i < numColumns; i++) {
-				widestColumnWidth =
-					Math.max(widestColumnWidth, minColumnWidths[i]);
-			}
-		}
-		for (int i = 0; i < numColumns; i++) {
-			if (i > 0)
-				minimumWidth += horizontalSpacing;
-			if (makeColumnsEqualWidth)
-				minimumWidth += widestColumnWidth;
-			else
-				minimumWidth += minColumnWidths[i];
-		}
-		// add margins
-		minimumWidth += leftMargin + rightMargin;
-		return minimumWidth;
-	}
-
-	int internalGetMaximumWidth(Composite parent, boolean changed) {
-		if (changed)
-			calculateMaximumColumnWidths(parent, true);
-		int maximumWidth = 0;
-		for (int i = 0; i < numColumns; i++) {
-			if (i > 0)
-				maximumWidth += horizontalSpacing;
-			maximumWidth += maxColumnWidths[i];
-		}
-		// add margins
-		maximumWidth += leftMargin + rightMargin;
-		return maximumWidth;
-	}
-
-	void resetColumnWidths() {
-		if (minColumnWidths == null)
-			minColumnWidths = new int[numColumns];
-		if (maxColumnWidths == null)
-			maxColumnWidths = new int[numColumns];
-		for (int i = 0; i < numColumns; i++) {
-			minColumnWidths[i] = 0;
-		}
-		for (int i = 0; i < numColumns; i++) {
-			maxColumnWidths[i] = 0;
-		}
-	}
-
-	void calculateMinimumColumnWidths(Composite parent, boolean changed) {
-		Control[] children = parent.getChildren();
-
-		for (int i = 0; i < grid.size(); i++) {
-			TableData[] row = (TableData[]) grid.elementAt(i);
-			for (int j = 0; j < numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData == false)
-					continue;
-				Control child = children[td.childIndex];
-				int minWidth = -1;
-				if (child instanceof Composite) {
-					Composite cc = (Composite) child;
-					Layout l = cc.getLayout();
-					if (l instanceof ILayoutExtension) {
-						minWidth =
-							((ILayoutExtension) l).getMinimumWidth(cc, changed);
-					}
-				}
-				if (minWidth == -1) {
-					if (isWrap(child)) {
-						// Should be the width of the
-						// longest word, we'll pick
-						// some small number instead
-						minWidth = 30;
-					} else {
-						Point size =
-							child.computeSize(
-								SWT.DEFAULT,
-								SWT.DEFAULT,
-								changed);
-						minWidth = size.x;
-					}
-				}
-				minWidth += td.indent;
-				minColumnWidths[j] = Math.max(minColumnWidths[j], minWidth);
-			}
-		}
-	}
-
-	boolean isWrap(Control control) {
-		if (control instanceof Composite
-			&& ((Composite) control).getLayout() instanceof ILayoutExtension)
-			return true;
-		return (control.getStyle() & SWT.WRAP) != 0;
-	}
-
-	void calculateMaximumColumnWidths(Composite parent, boolean changed) {
-		Control[] children = parent.getChildren();
-
-		for (int i = 0; i < numColumns; i++) {
-			maxColumnWidths[i] = 0;
-		}
-		for (int i = 0; i < grid.size(); i++) {
-			TableData[] row = (TableData[]) grid.elementAt(i);
-			for (int j = 0; j < numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData == false)
-					continue;
-				Control child = children[td.childIndex];
-				int maxWidth = -1;
-				if (child instanceof Composite) {
-					Composite cc = (Composite) child;
-					Layout l = cc.getLayout();
-					if (l instanceof ILayoutExtension) {
-						maxWidth =
-							((ILayoutExtension) l).getMaximumWidth(cc, changed);
-					}
-				}
-				if (maxWidth == -1) {
-					Point size =
-						child.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-					maxWidth = size.x;
-				}
-				maxWidth += td.indent;
-				if (td.colspan == 1)
-					maxColumnWidths[j] = Math.max(maxColumnWidths[j], maxWidth);
-				else {
-					// grow the last column
-					int last = j + td.colspan - 1;
-					int rem = 0;
-					for (int k = j; k < j + td.colspan - 1; k++) {
-						rem += maxColumnWidths[k];
-					}
-					int reduced = maxWidth - rem;
-					maxColumnWidths[last] =
-						Math.max(maxColumnWidths[last], reduced);
-				}
-			}
-		}
-	}
-
-	private void initializeIfNeeded(Composite parent, boolean changed) {
-		if (changed)
-			initialLayout = true;
-		if (initialLayout) {
-			initializeLayoutData(parent);
-			initialLayout = false;
-		}
-	}
-
-	void initializeLayoutData(Composite composite) {
-		Control[] children = composite.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			Control child = children[i];
-			if (child.getLayoutData() == null) {
-				child.setLayoutData(new TableData());
-			}
-		}
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkAdapter.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkAdapter.java
deleted file mode 100644
index 8180a2d..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkAdapter.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-public class HyperlinkAdapter implements IHyperlinkListener {
-
-public HyperlinkAdapter() {
-	super();
-}
-public void linkActivated(org.eclipse.swt.widgets.Control linkLabel) {}
-public void linkEntered(org.eclipse.swt.widgets.Control linkLabel) {}
-public void linkExited(org.eclipse.swt.widgets.Control linkLabel) {}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkHandler.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkHandler.java
deleted file mode 100644
index 031aef6..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkHandler.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-
-public class HyperlinkHandler
-	extends HyperlinkSettings
-	implements MouseListener, MouseTrackListener, SelectionListener, PaintListener {
-	private Hashtable hyperlinkListeners;
-	private Control lastActivated;
-	private Control lastEntered;
-
-	public HyperlinkHandler() {
-		hyperlinkListeners = new Hashtable();
-	}
-
-	public Control getLastLink() {
-		return lastActivated;
-	}
-
-	public void mouseDoubleClick(MouseEvent e) {
-	}
-
-	public void mouseDown(MouseEvent e) {
-		if (e.button == 1)
-			return;
-		lastActivated = (Control) e.widget;
-	}
-	public void mouseEnter(MouseEvent e) {
-		Control control = (Control) e.widget;
-		linkEntered(control);
-	}
-	public void mouseExit(MouseEvent e) {
-		Control control = (Control) e.widget;
-		linkExited(control);
-	}
-	public void mouseHover(MouseEvent e) {
-	}
-
-	public void mouseUp(MouseEvent e) {
-		if (e.button != 1)
-			return;
-		Control linkControl = (Control) e.widget;
-		Point size = linkControl.getSize();
-		// Filter out mouse up events outside
-		// the link. This can happen when mouse is
-		// clicked, dragged outside the link, then
-		// released.
-		if (e.x < 0)
-			return;
-		if (e.y < 0)
-			return;
-		if (e.x >= size.x)
-			return;
-		if (e.y >= size.y)
-			return;
-		linkActivated(linkControl);
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-		Control link = (Control) e.widget;
-		linkActivated(link);
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-		Control link = (Control) e.widget;
-		SelectableFormLabel l = (SelectableFormLabel) link;
-		if (l.getSelection())
-			linkEntered(link);
-		else
-			linkExited(link);
-	}
-
-	private void linkActivated(Control link) {
-		IHyperlinkListener action =
-			(IHyperlinkListener) hyperlinkListeners.get(link);
-		if (action != null) {
-			link.setCursor(getBusyCursor());
-			action.linkActivated(link);
-			if (!link.isDisposed())
-				link.setCursor(
-					isHyperlinkCursorUsed() ? getHyperlinkCursor() : null);
-		}
-	}
-
-	private void linkEntered(Control link) {
-		if (lastEntered != null
-			&& lastEntered instanceof SelectableFormLabel) {
-			SelectableFormLabel fl = (SelectableFormLabel) lastEntered;
-			linkExited(fl);
-		}
-		if (isHyperlinkCursorUsed())
-			link.setCursor(getHyperlinkCursor());
-		if (activeBackground != null)
-			link.setBackground(activeBackground);
-		if (activeForeground != null)
-			link.setForeground(activeForeground);
-		if (hyperlinkUnderlineMode == UNDERLINE_ROLLOVER)
-			underline(link, true);
-
-		IHyperlinkListener action =
-			(IHyperlinkListener) hyperlinkListeners.get(link);
-		if (action != null)
-			action.linkEntered(link);
-		lastEntered = link;
-	}
-
-	private void linkExited(Control link) {
-		if (isHyperlinkCursorUsed())
-			link.setCursor(null);
-		if (hyperlinkUnderlineMode == UNDERLINE_ROLLOVER)
-			underline(link, false);
-		if (background != null)
-			link.setBackground(background);
-		if (foreground != null)
-			link.setForeground(foreground);
-		IHyperlinkListener action =
-			(IHyperlinkListener) hyperlinkListeners.get(link);
-		if (action != null)
-			action.linkExited(link);
-		if (lastEntered == link)
-			lastEntered = null;
-	}
-
-	public void paintControl(PaintEvent e) {
-		Control label = (Control) e.widget;
-		if (hyperlinkUnderlineMode == UNDERLINE_ALWAYS)
-			HyperlinkHandler.underline(label, true);
-	}
-
-	public void registerHyperlink(
-		Control control,
-		IHyperlinkListener listener) {
-		if (background != null)
-			control.setBackground(background);
-		if (foreground != null)
-			control.setForeground(foreground);
-		control.addMouseListener(this);
-		control.addMouseTrackListener(this);
-
-		if (hyperlinkUnderlineMode == UNDERLINE_ALWAYS
-			&& control instanceof Label)
-			control.addPaintListener(this);
-		if (control instanceof SelectableFormLabel) {
-			SelectableFormLabel sl = (SelectableFormLabel) control;
-			sl.addSelectionListener(this);
-			if (hyperlinkUnderlineMode == UNDERLINE_ALWAYS)
-				sl.setUnderlined(true);
-		}
-		hyperlinkListeners.put(control, listener);
-		removeDisposedLinks();
-	}
-
-	private void removeDisposedLinks() {
-		for (Enumeration keys = hyperlinkListeners.keys();
-			keys.hasMoreElements();
-			) {
-			Control control = (Control) keys.nextElement();
-			if (control.isDisposed()) {
-				hyperlinkListeners.remove(control);
-			}
-		}
-	}
-
-	public void reset() {
-		hyperlinkListeners.clear();
-	}
-
-	public static void underline(Control control, boolean inside) {
-		if (control instanceof SelectableFormLabel) {
-			SelectableFormLabel l = (SelectableFormLabel) control;
-			l.setUnderlined(inside);
-			l.redraw();
-			return;
-		}
-		if (!(control instanceof Label))
-			return;
-		Composite parent = control.getParent();
-		Rectangle bounds = control.getBounds();
-		GC gc = new GC(parent);
-		Color color =
-			inside ? control.getForeground() : control.getBackground();
-		gc.setForeground(color);
-		int y = bounds.y + bounds.height;
-		gc.drawLine(bounds.x, y, bounds.x + bounds.width, y);
-		gc.dispose();
-	}
-
-	public void setForeground(Color color) {
-		super.setForeground(color);
-		removeDisposedLinks();
-		for (Enumeration links = hyperlinkListeners.keys();
-			links.hasMoreElements();
-			) {
-			Control control = (Control) links.nextElement();
-			control.setForeground(color);
-		}
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkSettings.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkSettings.java
deleted file mode 100644
index 3a1c6a0..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkSettings.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.*;
-
-public class HyperlinkSettings {
-	public static final int UNDERLINE_NEVER = 1;
-	public static final int UNDERLINE_ROLLOVER = 2;
-	public static final int UNDERLINE_ALWAYS = 3;
-
-	protected boolean hyperlinkCursorUsed = true;
-	protected int hyperlinkUnderlineMode = UNDERLINE_ALWAYS;
-	protected Color background;
-	protected Color foreground;
-	protected Color activeBackground;
-	protected Color activeForeground;
-	protected static Cursors cursors = new Cursors();
-
-	static class Cursors {
-		Cursor hyperlinkCursor;
-		Cursor busyCursor;
-		Cursor textCursor;
-		int counter = 0;
-
-		public void allocate() {
-			if (counter == 0) {
-				hyperlinkCursor =
-					new Cursor(Display.getCurrent(), SWT.CURSOR_HAND);
-				busyCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_WAIT);
-				textCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_IBEAM);
-			}
-			counter++;
-		}
-		public void dispose() {
-			counter--;
-			if (counter == 0) {
-				hyperlinkCursor.dispose();
-				busyCursor.dispose();
-				textCursor.dispose();
-				hyperlinkCursor = null;
-				busyCursor = null;
-				textCursor = null;
-			}
-		}
-	}
-
-	public HyperlinkSettings() {
-		cursors.allocate();
-	}
-
-	public void dispose() {
-		if (cursors != null)
-			cursors.dispose();
-	}
-
-	public Color getActiveBackground() {
-		return activeBackground;
-	}
-	public Color getActiveForeground() {
-		return activeForeground;
-	}
-	public Color getBackground() {
-		return background;
-	}
-	public Cursor getBusyCursor() {
-		return cursors.busyCursor;
-	}
-	public Cursor getTextCursor() {
-		return cursors.textCursor;
-	}
-	public Color getForeground() {
-		return foreground;
-	}
-	public Cursor getHyperlinkCursor() {
-		return cursors.hyperlinkCursor;
-	}
-	public int getHyperlinkUnderlineMode() {
-		return hyperlinkUnderlineMode;
-	}
-
-	public boolean isHyperlinkCursorUsed() {
-		return hyperlinkCursorUsed;
-	}
-
-	public void setActiveBackground(Color newActiveBackground) {
-		activeBackground = newActiveBackground;
-	}
-	public void setActiveForeground(Color newActiveForeground) {
-		activeForeground = newActiveForeground;
-	}
-	public void setBackground(Color newBackground) {
-		background = newBackground;
-	}
-	public void setForeground(Color newForeground) {
-		foreground = newForeground;
-	}
-	public void setHyperlinkCursorUsed(boolean newHyperlinkCursorUsed) {
-		hyperlinkCursorUsed = newHyperlinkCursorUsed;
-	}
-	public void setHyperlinkUnderlineMode(int newHyperlinkUnderlineMode) {
-		hyperlinkUnderlineMode = newHyperlinkUnderlineMode;
-	}
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IForm.java
deleted file mode 100644
index 1661485..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IForm.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-
-public interface IForm {
-public void commitChanges(boolean onSave);
-public Control createControl(Composite parent);
-public void dispose();
-public boolean doGlobalAction(String actionId);
-public void expandTo(Object object);
-public Control getControl();
-public FormWidgetFactory getFactory();
-public Color getHeadingBackground();
-public Color getHeadingForeground();
-public Image getHeadingImage();
-public String getHeadingText();
-public void initialize(Object model);
-public boolean isHeadingVisible();
-public void registerSection(FormSection section);
-public void setFocus();
-public void setHeadingBackground(Color newHeadingBackground);
-public void setHeadingForeground(Color newHeadingForeground);
-public void setHeadingImage(Image headingImage);
-public void setHeadingVisible(boolean newHeadingVisible);
-public void setHeadingText(String heading);
-public void update();
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormPage.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormPage.java
deleted file mode 100644
index 8839598..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormPage.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.widgets.*;
-
-public interface IFormPage {
-
-boolean becomesInvisible(IFormPage newPage);
-void becomesVisible(IFormPage previousPage);
-void createControl(Composite parent);
-Control getControl();
-String getLabel();
-String getTitle();
-boolean isSource();
-boolean isVisible();
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormSelectionListener.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormSelectionListener.java
deleted file mode 100644
index a334d41..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormSelectionListener.java
+++ /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 Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-public interface IFormSelectionListener {
-	public void formSelected(IFormPage page, boolean setFocus);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormTextListener.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormTextListener.java
deleted file mode 100644
index 237f714..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormTextListener.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-public interface IFormTextListener {
-	public void textValueChanged(FormEntry text);
-	public void textDirty(FormEntry text);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormWorkbook.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormWorkbook.java
deleted file mode 100644
index 9fe78ab..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormWorkbook.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.widgets.*;
-
-public interface IFormWorkbook {
-
-	void addFormSelectionListener(IFormSelectionListener listener);
-	public void addPage(IFormPage page);
-	public void createControl(Composite parent);
-	Control getControl();
-	public IFormPage getCurrentPage();
-	boolean isFirstPageSelected();
-	void removeFormSelectionListener(IFormSelectionListener listener);
-	public void removePage(IFormPage page);
-	public void selectPage(final IFormPage page, boolean setFocus);
-	void setFirstPageSelected(boolean selected);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IHyperlinkListener.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IHyperlinkListener.java
deleted file mode 100644
index d69af34..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IHyperlinkListener.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.widgets.*;
-
-public interface IHyperlinkListener {
-
-public void linkActivated(Control linkLabel);
-public void linkEntered(Control linkLabel);
-public void linkExited(Control linkLabel);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ILayoutExtension.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ILayoutExtension.java
deleted file mode 100644
index c6d947b..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ILayoutExtension.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Classes that extend abstract class Layout and implement
- * this interface can take part in layout computation of
- * the HTMLTableLayout manager. The said layout uses
- * alternative algorithm that computes columns before rows.
- * It allows it to 'flow' wrapped text proportionally
- * (as in the popular web browsers). Custom layout managers
- * that implement this interface allow recursive reflow
- * to be performed.
- */
-public interface ILayoutExtension {
-	public int getMinimumWidth(Composite parent, boolean changed);
-	public int getMaximumWidth(Composite parent, boolean changed); 
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/NoTabsWorkbook.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/NoTabsWorkbook.java
deleted file mode 100644
index 8355501..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/NoTabsWorkbook.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import java.util.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.*;
-import org.eclipse.ui.part.*;
-import org.eclipse.swt.custom.*;
-
-public class NoTabsWorkbook implements IFormWorkbook {
-	private Vector pages;
-	private boolean firstPageSelected = true;
-	private PageBook pageBook;
-	private Vector listeners = new Vector();
-	private IFormPage currentPage;
-
-	public NoTabsWorkbook() {
-		pages = new Vector();
-	}
-	public void addFormSelectionListener(IFormSelectionListener listener) {
-		listeners.addElement(listener);
-	}
-	public void addPage(IFormPage page) {
-		pages.add(page);
-
-		if (firstPageSelected && currentPage == null)
-			selectPage(page, true);
-	}
-
-	public void createControl(Composite parent) {
-		pageBook = new PageBook(parent, SWT.NULL);
-	}
-
-	private void fireSelectionChanged(IFormPage page, boolean setFocus) {
-		for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-			IFormSelectionListener listener = (IFormSelectionListener) iter.next();
-			listener.formSelected(page, setFocus);
-		}
-	}
-	
-	public IFormPage [] getPages() {
-		return (IFormPage[])pages.toArray(new IFormPage[pages.size()]);
-	}
-
-	public Control getControl() {
-		return pageBook;
-	}
-
-	public IFormPage getCurrentPage() {
-		return currentPage;
-	}
-
-	public boolean isFirstPageSelected() {
-		return firstPageSelected;
-	}
-	public void removeFormSelectionListener(IFormSelectionListener listener) {
-		listeners.removeElement(listener);
-	}
-
-	public void removePage(IFormPage page) {
-		if (pages.contains(page)) {
-			Control c = page.getControl();
-			if (c!=null && !c.isDisposed())
-				c.dispose();
-			pages.remove(page);
-		}
-	}
-
-	public void selectPage(final IFormPage page, final boolean setFocus) {
-		final IFormPage oldPage = currentPage;
-		currentPage = page;
-
-		if (pageBook != null) {
-
-			// It may take a while
-			BusyIndicator.showWhile(pageBook.getDisplay(), new Runnable() {
-				public void run() {
-					switchPages(oldPage, page, setFocus);
-				}
-			});
-		}
-	}
-
-	public void setFirstPageSelected(boolean newFirstPageSelected) {
-		firstPageSelected = newFirstPageSelected;
-	}
-
-	private void switchPages(IFormPage oldPage, IFormPage newPage, boolean setFocus) {
-		if (oldPage != null && oldPage != newPage) {
-			oldPage.becomesInvisible(newPage);
-		}
-		if (newPage.getControl() == null)
-			newPage.createControl(pageBook);
-		pageBook.showPage(newPage.getControl());
-
-		newPage.becomesVisible(oldPage);
-		fireSelectionChanged(newPage, setFocus);
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ScrollableSectionForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ScrollableSectionForm.java
deleted file mode 100644
index 8abd1ff..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ScrollableSectionForm.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.*;
-
-/**
- * This version of the section form adds scrolling
- * capability. However, scrolling can be disabled
- * using 'setScrollable' method. For this reason,
- * this class can be used instead of the SectionForm.
- */
-
-public class ScrollableSectionForm extends SectionForm {
-	private Composite container;
-	private boolean verticalFit;
-	private boolean scrollable = true;
-
-	public ScrollableSectionForm() {
-	}
-	public Control createControl(Composite parent) {
-		container = createParent(parent);
-		Control formControl = super.createControl(container);
-		if (container instanceof ScrolledComposite) {
-			ScrolledComposite sc = (ScrolledComposite) container;
-			sc.setContent(formControl);
-		}
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		formControl.setLayoutData(gd);
-		container.setBackground(formControl.getBackground());
-		return container;
-	}
-	protected Composite createParent(Composite parent) {
-		Composite result = null;
-		if (isScrollable()) {
-			ScrolledComposite scomp =
-				new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-			if (isVerticalFit()) {
-				scomp.setExpandHorizontal(true);
-				scomp.setExpandVertical(true);
-			}
-			initializeScrollBars(scomp);
-			result = scomp;
-		} else {
-			result = new Composite(parent, SWT.NONE);
-			GridLayout layout = new GridLayout();
-			layout.marginHeight = 0;
-			layout.marginWidth = 0;
-			result.setLayout(layout);
-		}
-		result.setMenu(parent.getMenu());
-		return result;
-	}
-	public boolean isScrollable() {
-		return scrollable;
-	}
-	public boolean isVerticalFit() {
-		return verticalFit;
-	}
-	public void setScrollable(boolean newScrollable) {
-		scrollable = newScrollable;
-	}
-
-	public void setVerticalFit(boolean newVerticalFit) {
-		verticalFit = newVerticalFit;
-	}
-
-	private void initializeScrollBars(ScrolledComposite scomp) {
-		ScrollBar hbar = scomp.getHorizontalBar();
-		if (hbar != null) {
-			hbar.setIncrement(H_SCROLL_INCREMENT);
-		}
-		ScrollBar vbar = scomp.getVerticalBar();
-		if (vbar != null) {
-			vbar.setIncrement(V_SCROLL_INCREMENT);
-		}
-		updatePageIncrement(scomp);
-	}
-
-	public void update() {
-		super.update();
-		if (container instanceof ScrolledComposite) {
-			updateScrolledComposite();
-		} else {
-			container.layout(true);
-		}
-	}
-	public void updateScrollBars() {
-		if (container instanceof ScrolledComposite) {
-			updateScrolledComposite();
-		}
-	}
-	public void updateScrolledComposite() {
-		ScrolledComposite sc = (ScrolledComposite) container;
-		Control formControl = getControl();
-		Point newSize = formControl.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		formControl.setSize(newSize);
-		sc.setMinSize(newSize);
-		updatePageIncrement(sc);
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionChangeManager.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionChangeManager.java
deleted file mode 100644
index 52d301b..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionChangeManager.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import java.util.*;
-
-public class SectionChangeManager {
-	Hashtable sources = new Hashtable();
-
-	public SectionChangeManager() {
-		super();
-	}
-	public void dispatchNotification(
-		FormSection source,
-		int type,
-		Object changeObject) {
-		Vector targets = (Vector) sources.get(source);
-		if (targets != null) {
-			for (Iterator iter = targets.iterator(); iter.hasNext();) {
-				FormSection section = (FormSection) iter.next();
-				section.sectionChanged(source, type, changeObject);
-			}
-		}
-	}
-	public void linkSections(FormSection source, FormSection target) {
-		source.setManager(this);
-		Vector targets = null;
-
-		targets = (Vector) sources.get(source);
-		if (targets == null) {
-			targets = new Vector();
-			sources.put(source, targets);
-		}
-		targets.addElement(target);
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionForm.java
deleted file mode 100644
index be28b6c..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionForm.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * This form implementation assumes that it contains
- * form sections and that they fill up the screen.
- * Typically, the form client will use up the entire
- * parent area below the heading. Sections must
- * be able to return their preferred size in both
- * dimensions. If they contain wrappable text,
- * WebForm should be used instead.
- */
-
-public class SectionForm extends AbstractSectionForm implements PaintListener {
-	private Composite control;
-	private int TITLE_HMARGIN = 10;
-	private int TITLE_VMARGIN = 5;
-
-	class FormLayout extends Layout {
-		protected Point computeSize(
-			Composite composite,
-			int wHint,
-			int hHint,
-			boolean flushCache) {
-			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
-				return new Point(wHint, hHint);
-			Control client = composite.getChildren()[0];
-			Point csize = client.computeSize(widthHint, heightHint, flushCache);
-			if (headingVisible)
-				csize.y += getTitleHeight();
-			return csize;
-		}
-		protected void layout(Composite composite, boolean flushCache) {
-			Rectangle clientArea = composite.getClientArea();
-			Control client = composite.getChildren()[0];
-			if (client != null && !client.isDisposed()) {
-				int theight = headingVisible ? getTitleHeight() : 0;
-				client.setBounds(
-					clientArea.x,
-					clientArea.y + theight,
-					clientArea.width,
-					clientArea.height - theight);
-			}
-		}
-	}
-	private int widthHint = SWT.DEFAULT;
-	private int heightHint = SWT.DEFAULT;
-
-	public SectionForm() {
-	}
-
-	public Control createControl(Composite parent) {
-		Composite canvas = new Composite(parent, SWT.NONE);
-		canvas.setBackground(factory.getBackgroundColor());
-		canvas.setForeground(factory.getForegroundColor());
-		canvas.addPaintListener(this);
-		canvas.setLayout(new FormLayout());
-		canvas.setMenu(parent.getMenu());
-		Composite formParent = factory.createComposite(canvas);
-		createFormClient(formParent);
-		this.control = canvas;
-		//canvas.setFocus();
-		return canvas;
-	}
-
-	protected void createFormClient(Composite parent) {
-		factory.createComposite(parent);
-	}
-
-	public Control getControl() {
-		return control;
-	}
-
-	private int getTitleHeight() {
-		int imageHeight = 0;
-		if (headingImage != null
-			&& SWT.getPlatform().equals("motif") == false) {
-			imageHeight = headingImage.getBounds().height;
-		}
-		GC gc = new GC(control);
-		gc.setFont(titleFont);
-		FontMetrics fm = gc.getFontMetrics();
-		int fontHeight = fm.getHeight();
-		gc.dispose();
-
-		int height = fontHeight + TITLE_VMARGIN + TITLE_VMARGIN;
-		return Math.max(height, imageHeight);
-	}
-
-	private void paint(Control form, GC gc) {
-		Rectangle bounds = form.getBounds();
-		int height = getTitleHeight();
-		if (headingImage != null) {
-			Rectangle imageBounds = headingImage.getBounds();
-			int x = bounds.width - imageBounds.width;
-			int y = 0;
-			//x = Math.max(x, 0);
-			x = 0;
-			if (headingBackground != null) {
-				gc.setBackground(headingBackground);
-				gc.fillRectangle(0, 0, bounds.width, height);
-			}
-			if (SWT.getPlatform().equals("motif") == false) {
-				gc.drawImage(headingImage, x, y);
-			}
-			if (headingForeground != null)
-				gc.setForeground(headingForeground);
-			else
-				gc.setForeground(factory.getForegroundColor());
-			gc.setFont(titleFont);
-			gc.drawText(getHeadingText(), TITLE_HMARGIN, TITLE_VMARGIN, true);
-		} else {
-			gc.setFont(titleFont);
-			gc.setBackground(factory.getColor(FormWidgetFactory.DEFAULT_HEADER_COLOR));
-			//gc.fillRectangle(TITLE_HMARGIN, TITLE_VMARGIN, bounds.width-TITLE_HMARGIN*2, height-TITLE_VMARGIN*2);
-			gc.setForeground(factory.getForegroundColor());
-			gc.drawText(getHeadingText(), TITLE_HMARGIN, TITLE_VMARGIN, true);
-		}
-	}
-
-	public final void paintControl(PaintEvent event) {
-		if (!headingVisible)
-			return;
-		GC gc = event.gc;
-		Control form = (Control) event.widget;
-		paint(form, gc);
-	}
-
-	public void setHeadingVisible(boolean newHeadingVisible) {
-		super.setHeadingVisible(newHeadingVisible);
-		if (control != null)
-			control.layout(true);
-	}
-	public void setHeadingText(String headingText) {
-		super.setHeadingText(headingText);
-		if (control != null) {
-			control.layout(true);
-			control.redraw();
-		}
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		titleFont = JFaceResources.getHeaderFont();
-		if (control != null && !control.isDisposed()) {
-			control.layout(true);
-			control.redraw();
-		}
-	}
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableControl.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableControl.java
deleted file mode 100644
index 8479133..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableControl.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-
-/**
- * FormText is a windowless control that
- * draws text in the provided context.
- */
-public abstract class SelectableControl extends Canvas {
-	private boolean hasFocus;
-
-	public SelectableControl(Composite parent, int style) {
-		super(parent, style);
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		addMouseListener(new MouseAdapter () {
-			public void mouseUp(MouseEvent e) {
-				notifyListeners(SWT.Selection);
-			}
-		});
-		addKeyListener(new KeyAdapter() {
-			public void keyPressed(KeyEvent e) {
-				if (e.character == '\r') {
-					// Activation
-					notifyListeners(SWT.Selection);
-				}
-			}
-		});
-		addListener(SWT.Traverse, new Listener () {
-			public void handleEvent(Event e) {
-				if (e.detail != SWT.TRAVERSE_RETURN)
-					e.doit = true;
-			}
-		});
-		addFocusListener(new FocusListener() {
-			public void focusGained(FocusEvent e) {
-				if (!hasFocus) {
-				   hasFocus=true;
-				   redraw();
-				}
-			}
-			public void focusLost(FocusEvent e) {
-				if (hasFocus) {
-					hasFocus=false;
-					redraw();
-				}
-			}
-		});
-	}
-
-	protected void paint(PaintEvent e) {
-		GC gc = e.gc;
-		Point size = getSize();
-	   	gc.setFont(getFont());
-	   	paint(gc);
-		if (hasFocus) {
-	   		gc.setForeground(getForeground());
-	   		gc.drawFocus(0, 0, size.x, size.y);
-		}
-	}
-	
-	protected abstract void paint(GC gc);
-	
-	private void notifyListeners(int eventType) {
-		Event event = new Event();
-		event.type = eventType;
-		event.widget = this;
-		notifyListeners(eventType, event);
-	}
-	
-	public void addSelectionListener(SelectionListener listener) {
-		checkWidget ();
-		if (listener == null) return;
-		TypedListener typedListener = new TypedListener (listener);
-		addListener (SWT.Selection,typedListener);
-	}
-	
-	public void removeSelectionListener(SelectionListener listener) {
-		checkWidget ();
-		if (listener == null) return;
-		removeListener (SWT.Selection, listener);
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableFormLabel.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableFormLabel.java
deleted file mode 100644
index ea5d5c4..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableFormLabel.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-
-public class SelectableFormLabel extends FormLabel {
-	private boolean hasFocus;
-
-	public boolean getSelection() {
-		return hasFocus;
-	}
-	
-	/**
-	 * Constructor for SelectableFormLabel
-	 */
-	public SelectableFormLabel(Composite parent, int style) {
-		super(parent, style);
-		addKeyListener(new KeyAdapter() {
-			public void keyPressed(KeyEvent e) {
-				if (e.character == '\r') {
-					// Activation
-					notifyListeners(SWT.DefaultSelection);
-				}
-			}
-		});
-		addListener(SWT.Traverse, new Listener () {
-			public void handleEvent(Event e) {
-				switch (e.detail) {
-					case SWT.TRAVERSE_PAGE_NEXT:
-					case SWT.TRAVERSE_PAGE_PREVIOUS:
-					case SWT.TRAVERSE_ARROW_NEXT:
-					case SWT.TRAVERSE_ARROW_PREVIOUS:
-					case SWT.TRAVERSE_RETURN:
-					e.doit = false;
-					return;
-				}
-				e.doit = true;
-			}
-		});
-		addFocusListener(new FocusListener() {
-			public void focusGained(FocusEvent e) {
-				if (!hasFocus) {
-				   hasFocus=true;
-				   notifyListeners(SWT.Selection);
-				   redraw();
-				}
-			}
-			public void focusLost(FocusEvent e) {
-				if (hasFocus) {
-					hasFocus=false;
-					notifyListeners(SWT.Selection);
-					redraw();
-				}
-			}
-		});
-		textMarginWidth = 1;
-		textMarginHeight = 1;
-	}
-	
-	protected void initAccessible() {
-		Accessible accessible = getAccessible();
-		accessible.addAccessibleListener(new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				e.result = getText();
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-		});
-
-		accessible
-			.addAccessibleControlListener(new AccessibleControlAdapter() {
-			public void getChildAtPoint(AccessibleControlEvent e) {
-				Point pt = toControl(new Point(e.x, e.y));
-				e.childID =
-					(getBounds().contains(pt))
-						? ACC.CHILDID_SELF
-						: ACC.CHILDID_NONE;
-			}
-
-			public void getLocation(AccessibleControlEvent e) {
-				Rectangle location = getBounds();
-				Point pt = toDisplay(new Point(location.x, location.y));
-				e.x = pt.x;
-				e.y = pt.y;
-				e.width = location.width;
-				e.height = location.height;
-			}
-
-			public void getChildCount(AccessibleControlEvent e) {
-				e.detail = 0;
-			}
-
-			public void getRole(AccessibleControlEvent e) {
-				e.detail = ACC.ROLE_PUSHBUTTON;
-			}
-
-			public void getState(AccessibleControlEvent e) {
-				e.detail = SelectableFormLabel.this.getSelection()?ACC.STATE_SELECTED:ACC.STATE_NORMAL;
-			}
-		});
-	}
-	
-	private void notifyListeners(int eventType) {
-		Event event = new Event();
-		event.type = eventType;
-		event.widget = this;
-		notifyListeners(eventType, event);
-	}
-
-	protected void paint(PaintEvent e) {
-		super.paint(e);
-	   	if (hasFocus) {
-	   		GC gc = e.gc;
-	   		Point size = getSize();
-	   		gc.setForeground(getForeground());
-	   		gc.drawFocus(0, 0, size.x, size.y);
-		}
-	}
-
-	public void addSelectionListener(SelectionListener listener) {
-		checkWidget ();
-		if (listener == null) return;
-		TypedListener typedListener = new TypedListener (listener);
-		addListener (SWT.Selection,typedListener);
-		addListener (SWT.DefaultSelection,typedListener);
-	}
-	
-	public void removeSelectionListener(SelectionListener listener) {
-		checkWidget ();
-		if (listener == null) return;
-		removeListener (SWT.Selection, listener);
-		removeListener (SWT.DefaultSelection, listener);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableData.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableData.java
deleted file mode 100644
index bd3cfc4..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableData.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * 
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-
-public class TableData {
-	public static final int LEFT = 1;
-	public static final int CENTER = 2;
-	public static final int RIGHT = 3;
-	public static final int TOP = 4;
-	public static final int MIDDLE = 5;
-	public static final int BOTTOM = 6;
-	public static final int FILL = 7;
-	public int colspan=1;
-	public int rowspan=1;
-	public int align = LEFT;
-	public int valign = TOP;
-	public int indent = 0;
-	public int maxWidth = SWT.DEFAULT;
-	public int maxHeight = SWT.DEFAULT;
-	public int heightHint = SWT.DEFAULT;
-	public boolean grabHorizontal=false;
-	
-	//private
-	int childIndex;
-	boolean isItemData=true; 
-	int compWidth;
-	Point compSize;
-		
-	public TableData() {
-	}
-	
-	public TableData(int align, int valign) {
-		this(align, valign, 1, 1);
-	}
-	
-	public TableData(int align, int valign, int rowspan, int colspan) {
-		this.align = align;
-		this.valign = valign;
-		this.rowspan = rowspan;
-		this.colspan = colspan;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableLayoutTest.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableLayoutTest.java
deleted file mode 100644
index 417e4e2..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableLayoutTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-import org.eclipse.jface.action.StatusLineManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-
-public class TableLayoutTest {
-
-public static void main (String [] args) {
-     Display display = new Display ();
-     Shell shell = new Shell (display);
-     shell.setLayout(new FillLayout());
-     final ScrolledComposite sc = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL);
-    // sc.setAlwaysShowScrollBars(true);
-     sc.setBackground(sc.getDisplay().getSystemColor(SWT.COLOR_WHITE));
-     final Composite c = new Composite(sc, SWT.NONE);
-     //c.setBackground(c.getDisplay().getSystemColor(SWT.COLOR_RED));
-     sc.setContent(c);
-     sc.addListener (SWT.Resize,  new Listener () {
-		public void handleEvent (Event e) {
-			Rectangle ssize = sc.getClientArea();
-			int swidth = ssize.width;
-			HTMLTableLayout layout = (HTMLTableLayout)c.getLayout();
-			Point size = layout.computeSize(c, swidth, SWT.DEFAULT, true);
-			//if (size.x < swidth) size.x = swidth;
-			Rectangle trim = c.computeTrim(0, 0, size.x, size.y);
-			size = new Point(trim.width, trim.height);
-			/*
-			Point size = c.computeSize(swidth, SWT.DEFAULT, true);
-			*/
-			//System.out.println("in: "+swidth+", out: "+size.x);
-			c.setSize(size);
-		}
-	});
-     c.setBackground(c.getDisplay().getSystemColor(SWT.COLOR_WHITE));
-     HTMLTableLayout layout = new HTMLTableLayout();
-     layout.numColumns = 2;
-     //layout.horizontalSpacing = 0;
-     layout.leftMargin = 0;
-     layout.rightMargin = 0;
-     layout.makeColumnsEqualWidth=false;
-     //layout.marginWidth = layout.marginHeight = 0;
-     //layout.horizontalSpacing = 0;
-     c.setLayout(layout);
-     
-     Label label;
-     Button b;
-     TableData td;
-/*     
-     label = new Label(c, SWT.NULL);
-     label.setText("Single line1");
-     
-     //label = new Label(c, SWT.WRAP);
-     Text text = new Text(c, SWT.MULTI | SWT.WRAP);
-     text.setEditable(false);
-     text.setText("This is a much longer text that I want wrapped,"+
-     " but depending on the window size it can be rendered completely.");
-     
-     b = new Button(c, SWT.PUSH);
-     b.setText("Simple button");
-     
-     label = new Label(c, SWT.WRAP);
-     label.setText("Another text that may or may not be wrapped");
-
-     label = new Label(c, SWT.NULL);
-     td = new TableData(TableData.RIGHT, TableData.BOTTOM);
-     label.setLayoutData(td);
-     label.setText("Fixed label");
-     
-     Composite nested = new Composite(c, SWT.NULL);
-     layout = new HTMLTableLayout();
-     layout.numColumns = 2;
-     nested.setLayout(layout);
-     b = new Button(nested, SWT.PUSH);
-     b.setText("Button2");
-     label = new Label(nested, SWT.WRAP);
-     td = new TableData(TableData.LEFT, TableData.MIDDLE);
-     label.setLayoutData(td);
-     label.setText("Some text in the nested label that can be wrapped");
-*/     
-     label = new Label(c, SWT.NULL);
-     label.setText("Text in the left column");
-     
-     b = new Button(c, SWT.CHECK);
-     b.setText("Checkbox in the right column");
-
-     
-     label = new Label(c, SWT.WRAP);
-     label.setText("This assignment step is then repeated for nested tables using the minimum and maximum widths derived for all such tables in the first pass. In this case, the width of the parent table cell plays the role of the current window size in the above description. This process is repeated recursively for all nested tables. The topmost table is then rendered using the assigned widths. Nested tables are subsequently rendered as part of the parent table's cell contents.");
-     td = new TableData();
-     td.colspan = 2;
-     td.align = TableData.FILL;
-     label.setLayoutData(td);
-     
-     ExpandableGroup exp = new ExpandableGroup (SWT.WRAP) {
-     	public void fillExpansion(Composite container, FormWidgetFactory factory) {
-     		HTMLTableLayout layout = new HTMLTableLayout();
-     		container.setLayout(layout);
-     		layout.leftMargin = layout.rightMargin = 0;
-     		Button button = factory.createButton(container, null, SWT.PUSH);
-     		button.setText("Button");
-    	}
-     	public void expanded() {
-     		c.layout(true);
-     		updateSize(sc, c);
-     	}
-     	public void collapsed() {
-     		c.layout(true);
-     		updateSize(sc, c);
-     	}
-     };
-     exp.setText("Expandable Section");
-     //exp.setExpandable(false);
-     FormWidgetFactory factory = new FormWidgetFactory();
-     exp.createControl(c, factory);
-     //exp.getControl().setBackground(label.getDisplay().getSystemColor(SWT.COLOR_GREEN));
-     td = new TableData();
-     td.colspan = 2;
-     td.align = TableData.FILL;
-     exp.getControl().setLayoutData(td);
-     
-	 StatusLineManager manager = new StatusLineManager();
-     //addFormEngine(c, factory, manager);
-     //addFormEngine(c, factory, manager);
-     //addFormEngine(c, factory, manager);
-     
-     addRow(c);
- 
-     Control mcontrol = manager.createControl(c);
-     td = new TableData();
-     td.colspan = 2;
-     td.align = TableData.FILL;
-     mcontrol.setLayoutData(td);
-     
-     factory.setHyperlinkUnderlineMode(HyperlinkHandler.UNDERLINE_ROLLOVER);
-     
-     SelectableFormLabel ft = new SelectableFormLabel(c, SWT.WRAP);
-     ft.setText("Some text in the form text that should also wrap");
-     factory.turnIntoHyperlink(ft, new IHyperlinkListener() {
-     	public void linkEntered(Control link) {
-     		System.out.println("Link entered");
-     	}
-     	public void linkExited(Control link) {
-    		System.out.println("Link exited");
-     	}
-     	public void linkActivated(Control link) {
-     		System.out.println("Link activated");
-     	}
-     });
-
-     ft = new SelectableFormLabel(c, SWT.WRAP);
-     ft.setText("Some more form text here");
-     factory.turnIntoHyperlink(ft, new IHyperlinkListener() {
-     	public void linkEntered(Control link) {
-     		System.out.println("Link entered");
-     	}
-     	public void linkExited(Control link) {
-    		System.out.println("Link exited");
-     	}
-     	public void linkActivated(Control link) {
-     		System.out.println("Link activated");
-     	}
-     });
-   
-     shell.open ();
-     while (!shell.isDisposed ()) {
-          if (!display.readAndDispatch ()) display.sleep ();
-     }
-     display.dispose ();
-}
-
-/*
-
-public static void addFormEngine(Composite c, FormWidgetFactory factory, IStatusLineManager manager) {
-     new Label(c, SWT.NULL);
-     RichText html = new RichText(c, SWT.WRAP);
-     html.setHyperlinkSettings(factory.getHyperlinkHandler());
-     RichTextHTTPAction action = new RichTextHTTPAction(manager);
-     URL i1URL = TableLayoutTest.class.getResource("image1.gif");
-     ImageDescriptor id1 = ImageDescriptor.createFromURL(i1URL);
-     html.registerTextObject("urlHandler", action);
-     html.registerTextObject("image1", id1.createImage());
-     //html.setBackground(factory.getBackgroundColor());
-     html.setForeground(factory.getForegroundColor());
-     InputStream is = TableLayoutTest.class.getResourceAsStream("index.xml");
-     //html.setParagraphsSeparated(false);
-     html.setContents(is, true);
-     TableData td = new TableData();
-     td.colspan = 1;
-     td.align = TableData.FILL;
-     html.setLayoutData(td);
-}
-*/
-
-public static void addRow(Composite c) {
-	Composite row = new Composite(c, SWT.WRAP);
-	RowLayout layout = new RowLayout();
-	layout.wrap = true;
-	row.setLayout(layout);
-	
-	for (int i=0; i<10; i++) {
-		Button button = new Button(row, SWT.PUSH);
-		button.setText("Button that should be wrapped");
-	}
-	TableData td = new TableData();
-	td.colspan = 2;
-	td.align = TableData.FILL;
-	td.grabHorizontal = true;
-	row.setLayoutData(td);
-}
-
-private static void updateSize(ScrolledComposite sc, Composite c) {
-	Rectangle ssize = sc.getClientArea();
-	int swidth = ssize.width;
-	HTMLTableLayout layout = (HTMLTableLayout)c.getLayout();
-	Point size = layout.computeSize(c, swidth, SWT.DEFAULT, true);
-	Rectangle trim = c.computeTrim(0, 0, size.x, size.y);
-	size = new Point(trim.width, trim.height);
-	c.setSize(size);
-}
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ToggleControl.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ToggleControl.java
deleted file mode 100644
index f4a127e..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ToggleControl.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.Composite;
-
-public class ToggleControl extends SelectableControl {
-	private boolean selection;
-	private Color decorationColor;
-	private Color activeColor;
-	private Cursor activeCursor;
-	private boolean hover=false;
-	private static final int marginWidth = 2;
-	private static final int marginHeight = 2;
-	private static final int WIDTH = 9;
-	private static final int HEIGHT = 9;
-	private static final int [] offPoints = { 0,2, 8,2, 4,6 };
-	private static final int [] onPoints = { 2, -1, 2,8, 6,4 };	
-
-	public ToggleControl(Composite parent, int style) {
-		super(parent, style);
-		addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				selection = !selection;
-				redraw();
-			}
-		});
-
-		addMouseTrackListener(new MouseTrackAdapter() {
-			public void mouseEnter(MouseEvent e) {
-				hover = true;
-				if (activeCursor!=null)
-				   setCursor(activeCursor);
-				redraw();
-			}
-			public void mouseExit(MouseEvent e) {
-				hover = false;
-				if (activeCursor!=null)
-				   setCursor(null);
-				redraw();
-			}
-		});
-		initAccessible();
-	}
-	void initAccessible() {
-		getAccessible().addAccessibleListener(new AccessibleAdapter() {
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-		});
-		
-		getAccessible().addAccessibleControlListener(new AccessibleControlAdapter() {
-			public void getChildAtPoint(AccessibleControlEvent e) {
-				Point testPoint = toControl(new Point(e.x, e.y));
-				if (getBounds().contains(testPoint)) {
-					e.childID = ACC.CHILDID_SELF;
-				}
-			}
-		
-			public void getLocation(AccessibleControlEvent e) {
-				Rectangle location = getBounds();
-				Point pt = toDisplay(new Point(location.x, location.y));
-				e.x = pt.x;
-				e.y = pt.y;
-				e.width = location.width;
-				e.height = location.height;
-			}
-		
-			public void getChildCount(AccessibleControlEvent e) {
-				e.detail = 0;
-			}
-		
-			public void getRole(AccessibleControlEvent e) {
-				e.detail = ACC.ROLE_TREE;
-			}
-		
-			public void getState(AccessibleControlEvent e) {
-				e.detail = ToggleControl.this.getSelection()?ACC.STATE_EXPANDED:ACC.STATE_COLLAPSED;
-			}
-
-			public void getValue(AccessibleControlEvent e) {
-				e.result = ToggleControl.this.getSelection()?"1":"0";
-			}
-		});
-	}
-	
-	public void setDecorationColor(Color decorationColor) {
-		this.decorationColor = decorationColor;
-	}
-	
-	public Color getDecorationColor() {
-		return decorationColor;
-	}
-	
-	public void setActiveDecorationColor(Color activeColor) {
-		this.activeColor = activeColor;
-	}
-	
-	public void setActiveCursor(Cursor activeCursor) {
-		this.activeCursor = activeCursor;
-	}
-	
-	public Color getActiveDecorationColor() {
-		return activeColor;
-	}
-	
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		int width, height;
-		
-		if (wHint!=SWT.DEFAULT) width = wHint; 
-		else 
-		   width = WIDTH + 2*marginWidth;
-		if (hHint!=SWT.DEFAULT) height = hHint;
-		else height = HEIGHT + 2*marginHeight;
-		return new Point(width, height);
-	}
-
-	/*
-	 * @see SelectableControl#paint(GC)
-	 */
-	protected void paint(GC gc) {
-		if (hover && activeColor!=null)
-			gc.setBackground(activeColor);
-		else if (decorationColor!=null)
-	   	   gc.setBackground(decorationColor);
-	   	else
-	   			gc.setBackground(getForeground());
-		int [] data;
-		Point size = getSize();
-		int x = (size.x - 9)/2;
-		int y = (size.y - 9)/2;
-		if (selection)
-			data = translate(onPoints, x, y);
-		else 
-			data = translate(offPoints, x, y);
-		gc.fillPolygon(data);
-		gc.setBackground(getBackground());
-	}
-	
-	private int [] translate(int [] data, int x, int y) {
-		int [] target = new int [data.length];
-		for (int i=0; i<data.length; i+=2) {
-			target[i] = data[i]+ x;
-		}
-		for (int i=1; i<data.length; i+=2) {
-			target[i] = data[i]+y;
-		}
-		return target;
-	}
-
-	public boolean getSelection() {
-		return selection;
-	}
-	
-	public void setSelection(boolean selection) {
-		this.selection = selection;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/WebForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/WebForm.java
deleted file mode 100644
index ee6c76e..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/WebForm.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.custom.*;
-
-/**
- * This form implementation assumes that it contains
- * children that do not have independent dimensions.
- * In other words, these widgets are not capable
- * of answering their preferred size. Instead,
- * desired width must be supplied to get the
- * preferred height. These forms are layed out
- * top to bottom, left to right and use
- * a layout algorithm very similar to
- * HTML tables. Scrolling is not optional
- * for this type of presentation - 
- * scroll bars will show up when needed.
- */
-
-public class WebForm extends AbstractSectionForm {
-	protected ScrolledComposite scrollComposite;
-	private Composite control;
-	private Composite client;
-	private final static int HMARGIN = 5;
-	private final static int VMARGIN = 5;
-	private Image headingUnderlineImage;
-
-	class WebFormLayout extends Layout {
-
-		protected void layout(Composite parent, boolean changed) {
-			Rectangle bounds = parent.getClientArea();
-			int x = 0;
-			int y = 0;
-			if (isHeadingVisible()) {
-				y = getHeadingHeight(parent);
-			}
-			Point csize;
-
-			Layout layout = client.getLayout();
-			if (layout != null && layout instanceof HTMLTableLayout) {
-				HTMLTableLayout hlayout = (HTMLTableLayout) layout;
-				csize = hlayout.computeSize(client, bounds.width, SWT.DEFAULT, true);
-				if (csize.x < bounds.width)
-					csize.x = bounds.width;
-				Rectangle trim = control.computeTrim(0, 0, csize.x, csize.y);
-				csize = new Point(trim.width, trim.height);
-			} else {
-				csize = client.computeSize(bounds.width, SWT.DEFAULT, changed);
-			}
-			client.setBounds(x, y, csize.x, csize.y);
-		}
-
-		protected Point computeSize(
-			Composite parent,
-			int wHint,
-			int hHint,
-			boolean changed) {
-			int width = wHint;
-			int height = 0;
-			if (isHeadingVisible()) {
-				height = getHeadingHeight(parent);
-			}
-			Point csize;
-			Layout layout = client.getLayout();
-
-			if (layout != null && layout instanceof HTMLTableLayout) {
-				HTMLTableLayout hlayout = (HTMLTableLayout) layout;
-				csize = hlayout.computeSize(client, width, SWT.DEFAULT, true);
-				if (csize.x < width)
-					csize.x = width;
-				Rectangle trim = control.computeTrim(0, 0, csize.x, csize.y);
-				csize = new Point(trim.width, trim.height);
-			} else {
-				csize = client.computeSize(width, SWT.DEFAULT, changed);
-			}
-			width = csize.x;
-			height += csize.y;
-			return new Point(width, height);
-		}
-	}
-
-	public WebForm() {
-	}
-
-	public Control createControl(Composite parent) {
-		scrollComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-		scrollComposite.setBackground(factory.getBackgroundColor());
-		scrollComposite.setMenu(parent.getMenu());
-		final Composite form = factory.createComposite(scrollComposite);
-
-		scrollComposite.setContent(form);
-		scrollComposite.addListener(SWT.Resize, new Listener() {
-			public void handleEvent(Event e) {
-				updateSize();
-			}
-		});
-		WebFormLayout layout = new WebFormLayout();
-		form.setLayout(layout);
-		form.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		this.control = form;
-		client = factory.createComposite(form);
-		createContents(client);
-		initializeScrollBars(scrollComposite);
-		//form.setFocus();
-		return scrollComposite;
-	}
-	private void initializeScrollBars(ScrolledComposite scomp) {
-		ScrollBar hbar = scomp.getHorizontalBar();
-		if (hbar != null) {
-			hbar.setIncrement(H_SCROLL_INCREMENT);
-		}
-		ScrollBar vbar = scomp.getVerticalBar();
-		if (vbar != null) {
-			vbar.setIncrement(V_SCROLL_INCREMENT);
-		}
-		updatePageIncrement(scomp);
-	}
-
-	public int getHeadingHeight(Composite parent) {
-		int width = parent.getSize().x;
-		int height = 0;
-		int imageHeight = 0;
-		if (getHeadingImage() != null) {
-			Rectangle ibounds = getHeadingImage().getBounds();
-			imageHeight = ibounds.height;
-		}
-		GC gc = new GC(parent);
-		gc.setFont(titleFont);
-		int textWidth = width - 2 * HMARGIN;
-		height = FormLabel.computeWrapHeight(gc, getHeadingText(), textWidth);
-		height += 2 * VMARGIN;
-		height = Math.max(height, imageHeight);
-		if (headingUnderlineImage != null) {
-			Rectangle ibounds = headingUnderlineImage.getBounds();
-			height += ibounds.height;
-		}
-		gc.dispose();
-		return height;
-	}
-
-	protected void createContents(Composite parent) {
-	}
-
-	public Control getControl() {
-		return control;
-	}
-
-	public void setHeadingVisible(boolean newHeadingVisible) {
-		super.setHeadingVisible(newHeadingVisible);
-		if (control != null)
-			control.layout();
-	}
-
-	public Image getHeadingUnderlineImage() {
-		return headingUnderlineImage;
-	}
-
-	public void setHeadingUnderlineImage(Image image) {
-		this.headingUnderlineImage = image;
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		titleFont = JFaceResources.getHeaderFont();
-		if (control != null && !control.isDisposed()) {
-			control.layout();
-		}
-	}
-	
-	protected void updateHyperlinkColors() {
-		factory.updateHyperlinkColors();
-		if (control != null && !control.isDisposed()) {
-			control.redraw();
-		}
-	}
-
-	public void updateSize() {
-		Rectangle ssize = scrollComposite.getClientArea();
-		int swidth = ssize.width;
-		WebFormLayout layout = (WebFormLayout) control.getLayout();
-		Point size = layout.computeSize(control, swidth, SWT.DEFAULT, true);
-		if (size.x < swidth)
-			size.x = swidth;
-		Rectangle trim = control.computeTrim(0, 0, size.x, size.y);
-		size = new Point(trim.width, trim.height);
-		control.setSize(size);
-		updatePageIncrement(scrollComposite);
-	}
-
-	private void paint(PaintEvent e) {
-		if (isHeadingVisible() == false)
-			return;
-		GC gc = e.gc;
-		if (headingImage != null) {
-			gc.drawImage(headingImage, 0, 0);
-		}
-		Point size = control.getSize();
-		if (getHeadingBackground() != null)
-			gc.setBackground(getHeadingBackground());
-		if (getHeadingForeground() != null)
-			gc.setForeground(getHeadingForeground());
-		gc.setFont(titleFont);
-		FormLabel.paintWrapText(gc, size, getHeadingText(), HMARGIN, VMARGIN);
-		if (headingUnderlineImage != null) {
-			int y =
-				getHeadingHeight(control)
-					- headingUnderlineImage.getBounds().height;
-			gc.drawImage(headingUnderlineImage, 0, y);
-		}
-	}
-	public void setHeadingText(String headingText) {
-		super.setHeadingText(headingText);
-		if (control!=null)
-			control.redraw();
-	}
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/BulletParagraph.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/BulletParagraph.java
deleted file mode 100644
index de3f838..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/BulletParagraph.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.GC;
-import java.util.Hashtable;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Color;
-
-public class BulletParagraph extends Paragraph implements IBulletParagraph {
-	private int style = CIRCLE;
-	private String text;
-	private int CIRCLE_DIAM = 5;
-	private int SPACING = 10;
-	private int indent = -1;
-	/**
-	 * Constructor for BulletParagraph.
-	 * @param addVerticalSpace
-	 */
-	public BulletParagraph(boolean addVerticalSpace) {
-		super(addVerticalSpace);
-	}
-
-	public int getIndent() {
-		if (indent != -1)
-			return indent;
-		switch (style) {
-			case CIRCLE :
-				return CIRCLE_DIAM + SPACING;
-		}
-		return 20;
-	}
-
-	/*
-	 * @see IBulletParagraph#getBulletStyle()
-	 */
-	public int getBulletStyle() {
-		return style;
-	}
-
-	public void setBulletStyle(int style) {
-		this.style = style;
-	}
-
-	public void setBulletText(String text) {
-		this.text = text;
-	}
-
-	public void setIndent(int indent) {
-		this.indent = indent;
-	}
-
-	/*
-	 * @see IBulletParagraph#getBulletText()
-	 */
-	public String getBulletText() {
-		return text;
-	}
-
-	public void paint(
-		GC gc,
-		int width,
-		Locator loc,
-		int lineHeight,
-		Hashtable objectTable,
-		IHyperlinkSegment selectedLink) {
-		paintBullet(gc, loc, lineHeight, objectTable);
-		super.paint(gc, width, loc, lineHeight, objectTable, selectedLink);
-	}
-
-	public void paintBullet(
-		GC gc,
-		Locator loc,
-		int lineHeight,
-		Hashtable objectTable) {
-		int x = loc.x - getIndent();
-		if (style == CIRCLE) {
-			int y = loc.y + lineHeight / 2 - CIRCLE_DIAM / 2;
-			Color bg = gc.getBackground();
-			Color fg = gc.getForeground();
-			gc.setBackground(fg);
-			gc.fillRectangle(x, y + 1, 5, 3);
-			gc.fillRectangle(x + 1, y, 3, 5);
-			gc.setBackground(bg);
-		} else if (style == TEXT && text != null) {
-			gc.drawText(text, x, loc.y);
-		} else if (style == IMAGE && text != null) {
-			Image image = (Image) objectTable.get(text);
-			if (image != null) {
-				int y = loc.y + lineHeight / 2 - image.getBounds().height / 2;
-				gc.drawImage(image, x, y);
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngine.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngine.java
deleted file mode 100644
index 53c8c7f..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngine.java
+++ /dev/null
@@ -1,560 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.io.InputStream;
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.*;
-import org.eclipse.swt.accessibility.Accessible;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.dnd.*;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.update.ui.forms.internal.*;
-
-public class FormEngine extends Canvas {
-	public static final String URL_HANDLER_ID = "urlHandler";
-	boolean hasFocus;
-	boolean paragraphsSeparated = true;
-	TextModel model;
-	Hashtable objectTable = new Hashtable();
-	public int marginWidth = 0;
-	public int marginHeight = 1;
-	IHyperlinkSegment entered;
-	boolean mouseDown = false;
-	Point dragOrigin;
-	private Action openAction;
-	private Action copyShortcutAction;
-	private boolean loading=true;
-	private String loadingText="Loading...";
-
-	public boolean getFocus() {
-		return hasFocus;
-	}
-	
-	public boolean isLoading() {
-		return loading;
-	}
-	
-	public String getLoadingText() {
-		return loadingText;
-	}
-	
-	public void setLoadingText(String loadingText) {
-		this.loadingText = loadingText;
-	}
-
-	public int getParagraphSpacing(int lineHeight) {
-		return lineHeight / 2;
-	}
-
-	public void setParagraphsSeparated(boolean value) {
-		paragraphsSeparated = value;
-	}
-
-	/**
-	 * Constructor for SelectableFormLabel
-	 */
-	public FormEngine(Composite parent, int style) {
-		super(parent, style);
-		setLayout(new FormEngineLayout());
-		model = new TextModel();
-
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				model.dispose();
-			}
-		});
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		addListener(SWT.KeyDown, new Listener() {
-			public void handleEvent(Event e) {
-				if (e.character == '\r') {
-					activateSelectedLink();
-					return;
-				}
-			}
-		});
-		addListener(SWT.Traverse, new Listener() {
-			public void handleEvent(Event e) {
-				switch (e.detail) {
-					case SWT.TRAVERSE_PAGE_NEXT :
-					case SWT.TRAVERSE_PAGE_PREVIOUS :
-					case SWT.TRAVERSE_ARROW_NEXT :
-					case SWT.TRAVERSE_ARROW_PREVIOUS :
-						e.doit = false;
-						return;
-				}
-				if (!model.hasFocusSegments()) {
-					e.doit = true;
-					return;
-				}
-				if (e.detail == SWT.TRAVERSE_TAB_NEXT)
-					e.doit = advance(true);
-				else if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS)
-					e.doit = advance(false);
-				else if (e.detail != SWT.TRAVERSE_RETURN)
-					e.doit = true;
-			}
-		});
-		addFocusListener(new FocusListener() {
-			public void focusGained(FocusEvent e) {
-				if (!hasFocus) {
-					hasFocus = true;
-					handleFocusChange();
-				}
-			}
-			public void focusLost(FocusEvent e) {
-				if (hasFocus) {
-					hasFocus = false;
-					handleFocusChange();
-				}
-			}
-		});
-		addMouseListener(new MouseListener() {
-			public void mouseDoubleClick(MouseEvent e) {
-			}
-			public void mouseDown(MouseEvent e) {
-				// select a link
-				handleMouseClick(e, true);
-			}
-			public void mouseUp(MouseEvent e) {
-				// activate a link
-				handleMouseClick(e, false);
-			}
-		});
-		addMouseTrackListener(new MouseTrackListener() {
-			public void mouseEnter(MouseEvent e) {
-				handleMouseMove(e);
-			}
-			public void mouseExit(MouseEvent e) {
-				if (entered != null) {
-					exitLink(entered);
-					paintLinkHover(entered, false);
-					entered = null;
-					setCursor(null);
-				}
-			}
-			public void mouseHover(MouseEvent e) {
-				handleMouseHover(e);
-			}
-		});
-		addMouseMoveListener(new MouseMoveListener() {
-			public void mouseMove(MouseEvent e) {
-				handleMouseMove(e);
-			}
-		});
-		initAccessible();
-		makeActions();
-	}
-
-	private void makeActions() {
-		openAction = new Action() {
-			public void run() {
-				activateSelectedLink();
-			}
-		};
-		openAction.setText(
-			FormsPlugin.getResourceString("FormEgine.linkPopup.open"));
-		copyShortcutAction = new Action() {
-			public void run() {
-				copyShortcut(getSelectedLink());
-			}
-		};
-		copyShortcutAction.setText(
-			FormsPlugin.getResourceString("FormEgine.linkPopup.copyShortcut"));
-	}
-
-	private String getAcessibleText() {
-		return model.getAccessibleText();
-	}
-
-	private void initAccessible() {
-		Accessible accessible = getAccessible();
-		accessible.addAccessibleListener(new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				e.result = getAcessibleText();
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-		});
-
-		accessible
-			.addAccessibleControlListener(new AccessibleControlAdapter() {
-			public void getChildAtPoint(AccessibleControlEvent e) {
-				Point pt = toControl(new Point(e.x, e.y));
-				e.childID =
-					(getBounds().contains(pt))
-						? ACC.CHILDID_SELF
-						: ACC.CHILDID_NONE;
-			}
-
-			public void getLocation(AccessibleControlEvent e) {
-				Rectangle location = getBounds();
-				Point pt = toDisplay(new Point(location.x, location.y));
-				e.x = pt.x;
-				e.y = pt.y;
-				e.width = location.width;
-				e.height = location.height;
-			}
-
-			public void getChildCount(AccessibleControlEvent e) {
-				e.detail = 0;
-			}
-
-			public void getRole(AccessibleControlEvent e) {
-				e.detail = ACC.ROLE_TEXT;
-			}
-
-			public void getState(AccessibleControlEvent e) {
-				e.detail = ACC.STATE_READONLY;
-			}
-		});
-	}
-
-	private void handleMouseClick(MouseEvent e, boolean down) {
-		if (down) {
-			// select a hyperlink
-			IHyperlinkSegment segmentUnder = model.findHyperlinkAt(e.x, e.y);
-			if (segmentUnder != null) {
-				IHyperlinkSegment oldLink = model.getSelectedLink();
-				model.selectLink(segmentUnder);
-				enterLink(segmentUnder);
-				paintFocusTransfer(oldLink, segmentUnder);
-			}
-			mouseDown = true;
-			dragOrigin = new Point(e.x, e.y);
-		} else {
-			if (e.button == 1) {
-				IHyperlinkSegment segmentUnder =
-					model.findHyperlinkAt(e.x, e.y);
-				if (segmentUnder != null) {
-					activateLink(segmentUnder);
-				}
-			}
-			mouseDown = false;
-		}
-	}
-	private void handleMouseHover(MouseEvent e) {
-	}
-	private void handleMouseMove(MouseEvent e) {
-		if (mouseDown) {
-			handleDrag(e);
-			return;
-		}
-		ITextSegment segmentUnder = model.findSegmentAt(e.x, e.y);
-
-		if (segmentUnder == null) {
-			if (entered != null) {
-				exitLink(entered);
-				paintLinkHover(entered, false);
-				entered = null;
-			}
-			setCursor(null);
-		} else {
-			if (segmentUnder instanceof IHyperlinkSegment) {
-				IHyperlinkSegment linkUnder = (IHyperlinkSegment) segmentUnder;
-				if (entered == null) {
-					entered = linkUnder;
-					enterLink(linkUnder);
-					paintLinkHover(entered, true);
-					setCursor(
-						model.getHyperlinkSettings().getHyperlinkCursor());
-				}
-			} else {
-				if (entered != null) {
-					exitLink(entered);
-					paintLinkHover(entered, false);
-					entered = null;
-				}
-				setCursor(model.getHyperlinkSettings().getTextCursor());
-			}
-		}
-	}
-
-	private void handleDrag(MouseEvent e) {
-	}
-
-	public HyperlinkSettings getHyperlinkSettings() {
-		return model.getHyperlinkSettings();
-	}
-
-	public void setHyperlinkSettings(HyperlinkSettings settings) {
-		model.setHyperlinkSettings(settings);
-	}
-
-	private boolean advance(boolean next) {
-		IHyperlinkSegment current = model.getSelectedLink();
-		if (current != null)
-			exitLink(current);
-
-		boolean valid = model.traverseLinks(next);
-		
-		IHyperlinkSegment newLink = model.getSelectedLink();
-
-		if (valid)
-			enterLink(newLink);
-		paintFocusTransfer(current, newLink);
-		if (newLink!=null) ensureVisible(newLink);
-		return !valid;
-	}
-
-	public IHyperlinkSegment getSelectedLink() {
-		return model.getSelectedLink();
-	}
-
-	private void handleFocusChange() {
-		if (hasFocus) {
-			model.traverseLinks(true);
-			enterLink(model.getSelectedLink());
-			paintFocusTransfer(null, model.getSelectedLink());
-		} else {
-			paintFocusTransfer(model.getSelectedLink(), null);
-			model.selectLink(null);
-		}
-	}
-
-	private void enterLink(IHyperlinkSegment link) {
-		if (link == null)
-			return;
-		HyperlinkAction action = link.getAction(objectTable);
-		if (action != null)
-			action.linkEntered(link);
-	}
-
-	private void exitLink(IHyperlinkSegment link) {
-		if (link == null)
-			return;
-		HyperlinkAction action = link.getAction(objectTable);
-		if (action != null)
-			action.linkExited(link);
-	}
-
-	private void paintLinkHover(IHyperlinkSegment link, boolean hover) {
-		GC gc = new GC(this);
-
-		HyperlinkSettings settings = getHyperlinkSettings();
-
-		gc.setForeground(
-			hover ? settings.getActiveForeground() : settings.getForeground());
-		gc.setBackground(getBackground());
-		gc.setFont(getFont());
-		boolean selected = (link == getSelectedLink());
-		link.repaint(gc, hover);
-		if (selected) {
-			link.paintFocus(gc, getBackground(), getForeground(), false);
-			link.paintFocus(gc, getBackground(), getForeground(), true);
-		}
-		gc.dispose();
-	}
-
-	private void activateSelectedLink() {
-		IHyperlinkSegment link = model.getSelectedLink();
-		if (link != null)
-			activateLink(link);
-	}
-
-	private void activateLink(IHyperlinkSegment link) {
-		setCursor(model.getHyperlinkSettings().getBusyCursor());
-		HyperlinkAction action = link.getAction(objectTable);
-		if (action != null)
-			action.linkActivated(link);
-		if (!isDisposed())
-			setCursor(model.getHyperlinkSettings().getHyperlinkCursor());
-	}
-
-	protected void paint(PaintEvent e) {
-		int width = getClientArea().width;
-
-		GC gc = e.gc;
-		gc.setFont(getFont());
-		gc.setForeground(getForeground());
-		gc.setBackground(getBackground());
-
-		Locator loc = new Locator();
-		loc.marginWidth = marginWidth;
-		loc.marginHeight = marginHeight;
-		loc.x = marginWidth;
-		loc.y = marginHeight;
-
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		
-		if (loading) {
-			int textWidth = gc.textExtent(loadingText).x;
-			gc.drawText(loadingText, width/2-textWidth/2, getClientArea().height/2-lineHeight/2);
-			return;
-		}
-		
-		IParagraph[] paragraphs = model.getParagraphs();
-
-		IHyperlinkSegment selectedLink = model.getSelectedLink();
-
-		for (int i = 0; i < paragraphs.length; i++) {
-			IParagraph p = paragraphs[i];
-
-			if (i > 0 && paragraphsSeparated && p.getAddVerticalSpace())
-				loc.y += getParagraphSpacing(lineHeight);
-
-			loc.indent = p.getIndent();
-			loc.resetCaret();
-			loc.rowHeight = 0;
-			p.paint(gc, width, loc, lineHeight, objectTable, selectedLink);
-		}
-	}
-
-	public void registerTextObject(String key, Object value) {
-		objectTable.put(key, value);
-	}
-
-	public void load(String text, boolean parseTags, boolean expandURLs) {
-		try {
-			if (parseTags)
-				model.parseTaggedText(text, expandURLs);
-			else
-				model.parseRegularText(text, expandURLs);
-		} catch (CoreException e) {
-			FormsPlugin.logException(e);
-		}
-		finally {
-			loading = false;
-		}
-	}
-	public void load(InputStream is, boolean expandURLs) {
-		try {
-			model.parseInputStream(is, expandURLs);
-		} catch (CoreException e) {
-			FormsPlugin.logException(e);
-		}
-		finally {
-			loading = false;
-		}
-	}
-
-	public boolean setFocus() {
-		/*
-		if (!model.hasFocusSegments())
-			return false;
-		*/
-		return super.setFocus();
-	}
-
-	private void paintFocusTransfer(
-		IHyperlinkSegment oldLink,
-		IHyperlinkSegment newLink) {
-		GC gc = new GC(this);
-		Color bg = getBackground();
-		Color fg = getForeground();
-
-		gc.setFont(getFont());
-
-		if (oldLink != null) {
-			gc.setBackground(bg);
-			gc.setForeground(fg);
-			oldLink.paintFocus(gc, bg, fg, false);
-		}
-		if (newLink != null) {
-			//ensureVisible(newLink);
-			gc.setBackground(bg);
-			gc.setForeground(fg);
-			newLink.paintFocus(gc, bg, fg, true);
-		}
-		gc.dispose();
-	}
-	/**
-	 * Gets the marginWidth.
-	 * @return Returns a int
-	 */
-	public int getMarginWidth() {
-		return marginWidth;
-	}
-
-	/**
-	 * Sets the marginWidth.
-	 * @param marginWidth The marginWidth to set
-	 */
-	public void setMarginWidth(int marginWidth) {
-		this.marginWidth = marginWidth;
-	}
-
-	/**
-	 * Gets the marginHeight.
-	 * @return Returns a int
-	 */
-	public int getMarginHeight() {
-		return marginHeight;
-	}
-
-	/**
-	 * Sets the marginHeight.
-	 * @param marginHeight The marginHeight to set
-	 */
-	public void setMarginHeight(int marginHeight) {
-		this.marginHeight = marginHeight;
-	}
-
-	public void contextMenuAboutToShow(IMenuManager manager) {
-		IHyperlinkSegment link = getSelectedLink();
-		if (link != null)
-			contributeLinkActions(manager, link);
-	}
-
-	private void contributeLinkActions(
-		IMenuManager manager,
-		IHyperlinkSegment link) {
-		manager.add(openAction);
-		manager.add(copyShortcutAction);
-		manager.add(new Separator());
-	}
-
-	private void copyShortcut(IHyperlinkSegment link) {
-		String text = link.getText();
-		Clipboard clipboard = new Clipboard(getDisplay());
-		clipboard.setContents(
-			new Object[] { text },
-			new Transfer[] { TextTransfer.getInstance()});
-	}
-
-	private void ensureVisible(IHyperlinkSegment segment) {
-		Rectangle bounds = segment.getBounds();
-		ScrolledComposite scomp = getScrolledComposite();
-		if (scomp == null)
-			return;
-		Point origin = AbstractSectionForm.getControlLocation(scomp, this);
-		origin.x += bounds.x;
-		origin.y += bounds.y;
-		AbstractSectionForm.ensureVisible(
-			scomp,
-			origin,
-			new Point(bounds.width, bounds.height));
-	}
-	ScrolledComposite getScrolledComposite() {
-		Composite parent = getParent();
-		while (parent != null) {
-			if (parent instanceof ScrolledComposite)
-				return (ScrolledComposite) parent;
-			parent = parent.getParent();
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngineLayout.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngineLayout.java
deleted file mode 100644
index ecaee4d..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngineLayout.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.update.ui.forms.internal.ILayoutExtension;
-
-/**
- * @version 	1.0
- * @author
- */
-public class FormEngineLayout extends Layout implements ILayoutExtension {
-
-	public int getMaximumWidth(Composite parent, boolean changed) {
-		return computeSize(parent, SWT.DEFAULT, SWT.DEFAULT, changed).x;
-	}
-
-	public int getMinimumWidth(Composite parent, boolean changed) {
-		return 30;
-	}
-
-	/*
-	 * @see Layout#computeSize(Composite, int, int, boolean)
-	 */
-
-	public Point computeSize(
-		Composite composite,
-		int wHint,
-		int hHint,
-		boolean changed) {
-		FormEngine engine = (FormEngine) composite;
-		int innerWidth = wHint;
-		if (engine.isLoading()) {
-			return computeLoading(engine);
-		}
-		if (innerWidth != SWT.DEFAULT)
-			innerWidth -= engine.marginWidth * 2;
-		Point textSize = computeTextSize(engine, innerWidth);
-		int textWidth = textSize.x + 2 * engine.marginWidth;
-		int textHeight = textSize.y + 2 * engine.marginHeight;
-		Point result = new Point(textWidth, textHeight);
-		return result;
-	}
-	
-	private Point computeLoading(FormEngine engine) {
-		GC gc = new GC(engine);
-		gc.setFont(engine.getFont());
-		String loadingText = engine.getLoadingText();
-		Point size = gc.textExtent(loadingText);
-		gc.dispose();
-		size.x += 2 * engine.marginWidth;
-		size.y += 2 * engine.marginHeight;
-		return size;
-	}
-
-	private Point computeTextSize(FormEngine engine, int wHint) {
-		IParagraph[] paragraphs = engine.model.getParagraphs();
-
-		GC gc = new GC(engine);
-		gc.setFont(engine.getFont());
-
-		Locator loc = new Locator();
-
-		int width = wHint != SWT.DEFAULT ? wHint : 0;
-
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-
-		for (int i = 0; i < paragraphs.length; i++) {
-			IParagraph p = paragraphs[i];
-
-			if (i > 0 && engine.paragraphsSeparated && p.getAddVerticalSpace())
-				loc.y += engine.getParagraphSpacing(lineHeight);
-
-			loc.rowHeight = 0;
-			loc.indent = p.getIndent();
-			loc.x = p.getIndent();
-
-			IParagraphSegment[] segments = p.getSegments();
-			if (segments.length > 0) {
-				for (int j = 0; j < segments.length; j++) {
-					IParagraphSegment segment = segments[j];
-					segment.advanceLocator(gc, wHint, loc, engine.objectTable);
-					width = Math.max(width, loc.width);
-				}
-				loc.y += loc.rowHeight;
-			} else {
-				// empty new line
-				loc.y += lineHeight;
-			}
-		}
-		gc.dispose();
-		return new Point(width, loc.y);
-	}
-
-	/*
-	 * @see Layout#layout(Composite, boolean)
-	 */
-	protected void layout(Composite composite, boolean flushCache) {
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HTTPAction.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HTTPAction.java
deleted file mode 100644
index cd3d0b5..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HTTPAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-import org.eclipse.swt.program.Program;
-
-/**
- * @version 	1.0
- * @author
- */
-public class HTTPAction extends HyperlinkAction {
-	public HTTPAction () {
-	}
-	
-	public void linkActivated(IHyperlinkSegment link) {
-		Program.launch(link.getText());
-	}
-	
-	public void linkEntered(IHyperlinkSegment link) {
-		setDescription(link.getText());
-		super.linkEntered(link);
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkAction.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkAction.java
deleted file mode 100644
index 3b11a68..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.jface.action.IStatusLineManager;
-
-/**
- * @version 	1.0
- * @author
- */
-public class HyperlinkAction {
-	IStatusLineManager manager;
-	private String description;
-	
-	public HyperlinkAction() {
-	}
-	
-	public void linkActivated(final IHyperlinkSegment link) {
-	}
-	
-	public void linkEntered(IHyperlinkSegment link) {
-		if (manager!=null && description!=null) {
-			manager.setMessage(description);
-		}
-	}
-
-	public void linkExited(IHyperlinkSegment link) {
-		if (manager!=null && description!=null) {
-			manager.setMessage(null);
-		}
-	}
-	
-	public void setStatusLineManager(IStatusLineManager manager) {
-		this.manager = manager;
-	}
-	
-	public String getDescription() {
-		return description;
-	}
-	public void setDescription(String description) {
-		this.description = description;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkSegment.java
deleted file mode 100644
index 2c41587..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkSegment.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.util.Hashtable;
-import org.eclipse.update.ui.forms.internal.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.graphics.GC;
-
-/**
- * @version 	1.0
- * @author
- */
-public class HyperlinkSegment
-	extends TextSegment
-	implements IHyperlinkSegment {
-	private String actionId;
-	private String arg;
-	private HyperlinkSettings settings;
-	
-	public HyperlinkSegment(String text, HyperlinkSettings settings, String fontId) {
-		super(text, fontId);
-		this.settings = settings;
-		underline = settings.getHyperlinkUnderlineMode()==HyperlinkSettings.UNDERLINE_ALWAYS;
-	}
-	
-	/*
-	 * @see IHyperlinkSegment#getListener(Hashtable)
-	 */
-	public HyperlinkAction getAction(Hashtable objectTable) {
-		if (actionId==null) return null;
-		Object obj = objectTable.get(actionId);
-		if (obj==null) return null;
-		if (obj instanceof HyperlinkAction) return (HyperlinkAction)obj;
-		return null;
-	}
-	
-	/*
-	 * @see IObjectReference#getObjectId()
-	 */
-	public String getObjectId() {
-		return actionId;
-	}
-	
-	void setActionId(String id) {
-		this.actionId = id;
-	}
-	public void paint(GC gc, int width, Locator locator, Hashtable objectTable, boolean selected) {
-		setColor(settings.getForeground());
-		super.paint(gc, width, locator, objectTable, selected);
-	}
-	
-	public void repaint(GC gc, boolean hover) {
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		int descent = fm.getDescent();
-		boolean rolloverMode = settings.getHyperlinkUnderlineMode()==HyperlinkSettings.UNDERLINE_ROLLOVER;
-		for (int i=0; i<areaRectangles.size(); i++) {
-			AreaRectangle areaRectangle = (AreaRectangle)areaRectangles.get(i);
-			Rectangle rect = areaRectangle.rect;
-			String text = areaRectangle.getText();
-			Point extent = gc.textExtent(text);
-			int textX = rect.x + 1;
-			gc.drawString(text, textX, rect.y, true);
-			if (underline || hover || rolloverMode) {
-				int lineY = rect.y + lineHeight - descent + 1;
-				Color saved=null;
-				if (rolloverMode && !hover) {
-					saved = gc.getForeground();
-					gc.setForeground(gc.getBackground());
-				}
-				gc.drawLine(textX, lineY, textX+extent.x, lineY);
-				if (saved!=null)
-					gc.setForeground(saved);
-			}
-		}
-	}
-	/**
-	 * @return
-	 */
-	public String getArg() {
-		return arg;
-	}
-
-	/**
-	 * @param string
-	 */
-	public void setArg(String string) {
-		arg = string;
-	}
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IBulletParagraph.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IBulletParagraph.java
deleted file mode 100644
index 55f3383..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IBulletParagraph.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.GC;
-import java.util.Hashtable;
-
-public interface IBulletParagraph extends IParagraph {
-	int CIRCLE = 0;
-	int TEXT = 1;
-	int IMAGE = 2;
-	public int getBulletStyle();
-	public String getBulletText();
-
-	public void paintBullet(GC gc, Locator loc, int lineHeight, Hashtable objectTable);
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IHyperlinkSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IHyperlinkSegment.java
deleted file mode 100644
index ea5b58a..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IHyperlinkSegment.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.graphics.GC;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IHyperlinkSegment extends ITextSegment, IObjectReference {
-	HyperlinkAction getAction(Hashtable objectTable);
-	
-	boolean contains(int x, int y);
-	
-	String getArg();
-	
-	public void repaint(GC gc, boolean hover);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IImageSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IImageSegment.java
deleted file mode 100644
index 1e9bd56..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IImageSegment.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-import org.eclipse.swt.graphics.Image;
-import java.util.Hashtable;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IImageSegment extends IParagraphSegment, IObjectReference {
-	public static final int TOP = 1;
-	public static final int MIDDLE = 2;
-	public static final int BOTTOM = 3;
-	
-	public int getVerticalAlignment();
-
-	Image getImage(Hashtable objectTable);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IObjectReference.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IObjectReference.java
deleted file mode 100644
index f12a7eb..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IObjectReference.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IObjectReference {
-	public String getObjectId();
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraph.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraph.java
deleted file mode 100644
index fb336eb..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraph.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-
-import org.eclipse.swt.graphics.GC;
-import java.util.Hashtable;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IParagraph {
-	public int getIndent();
-	public IParagraphSegment [] getSegments();
-	public void addSegment(IParagraphSegment segment);
-	public boolean getAddVerticalSpace();
-	public ITextSegment findSegmentAt(int x, int y);
-	public void paint(GC gc, int width, Locator loc, int lineHeight, Hashtable objectTable, IHyperlinkSegment selectedLink);
-	public String getAccessibleText();
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraphSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraphSegment.java
deleted file mode 100644
index 9217105..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraphSegment.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.GC;
-import java.util.Hashtable;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IParagraphSegment {
-	
-	public void advanceLocator(GC gc, int wHint, Locator loc, Hashtable objectTable);
-	
-	public void paint(GC gc, int width, Locator loc, Hashtable objectTable, boolean selected);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextModel.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextModel.java
deleted file mode 100644
index 4071ad2..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextModel.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface ITextModel {
-	IParagraph [] getParagraphs();
-	public void parseTaggedText(String taggedText, boolean expandURLs) throws CoreException;
-	public void parseRegularText(String regularText, boolean expandURLs) throws CoreException;
-	public void dispose();
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextSegment.java
deleted file mode 100644
index 47e5fb0..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextSegment.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface ITextSegment extends IParagraphSegment {
-	String getText();
-	Color getColor();
-	Font getFont();
-	boolean isWordWrapAllowed();
-	boolean isSelectable();
-	boolean contains(int x, int y);
-	Rectangle getBounds();
-	void paintFocus(GC gc, Color bg, Color fg, boolean selected);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ImageSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ImageSegment.java
deleted file mode 100644
index 4c84cb9..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ImageSegment.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.*;
-import java.util.Hashtable;
-import org.eclipse.swt.SWT;
-
-/**
- * @version 	1.0
- * @author
- */
-public class ImageSegment extends ParagraphSegment implements IImageSegment {
-	private int alignment = BOTTOM;
-	private String imageId;
-	
-	public int getVerticalAlignment() {
-		return alignment;
-	}
-	
-	void setVerticalAlignment(int alignment) {
-		this.alignment = alignment;
-	}
-	
-	public Image getImage(Hashtable objectTable) {
-		if (imageId==null) return null;
-		Object obj = objectTable.get(imageId);
-		if (obj==null) return null;
-		if (obj instanceof Image) return (Image)obj;
-		return null;
-	}
-	
-	public String getObjectId() {
-		return imageId;
-	}
-	
-	void setObjectId(String imageId) {
-		this.imageId = imageId;
-	}
-	
-	public void advanceLocator(GC gc, int wHint, Locator loc, Hashtable objectTable) {
-		Image image = getImage(objectTable);
-		int iwidth = 0;
-		int iheight = 0;
-		if (image!=null) {
-			Rectangle rect = image.getBounds();
-			iwidth = rect.width;
-			iheight = rect.height;
-		}
-		if (wHint != SWT.DEFAULT && loc.x + iwidth > wHint) {
-			// new line
-			loc.x = loc.indent + iwidth;
-			loc.width = loc.x;
-			loc.y += loc.rowHeight;
-			loc.rowHeight = iheight;
-		}
-		else {
-			loc.x += iwidth;
-			loc.rowHeight = Math.max(loc.rowHeight, iheight);
-		}
-	}
-
-	public void paint(GC gc, int width, Locator loc, Hashtable objectTable, boolean selected) {
-		Image image = getImage(objectTable);
-		int iwidth = 0;
-		int iheight = 0;
-		if (image!=null) {
-			Rectangle rect = image.getBounds();
-			iwidth = rect.width;
-			iheight = rect.height;
-		}
-		else return;
-		loc.width = iwidth;
-		loc.height = iheight;
-		
-		int ix = loc.x;
-		int iy = loc.y;
-		
-		if (ix + iwidth > width) {
-			// new row
-			ix = loc.indent + loc.marginWidth;
-			iy += loc.rowHeight;
-			loc.rowHeight = 0;
-		}
-		
-		gc.drawImage(image, ix, iy);
-		loc.x = ix + iwidth;
-		loc.y = iy;
-		loc.rowHeight = Math.max(loc.rowHeight, iheight);
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java
deleted file mode 100644
index 350154b..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-/**
- * @version 	1.0
- * @author
- */
-public class Locator { 
-	public int indent;
-	public int x, y;
-	public int width, height;
-	public int rowHeight;
-	public int marginWidth;
-	public int marginHeight;
-	
-	public void newLine() {
-		resetCaret();
-		y += rowHeight;
-		rowHeight = 0;
-	}
-	
-	public void resetCaret() {
-		x = marginWidth + indent;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Paragraph.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Paragraph.java
deleted file mode 100644
index a9a4352..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Paragraph.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.io.*;
-import java.util.*;
-
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.update.ui.forms.internal.HyperlinkSettings;
-
-/**
- * @version 	1.0
- * @author
- */
-public class Paragraph implements IParagraph {
-	public static final String HTTP = "http://";
-	private Vector segments;
-	private boolean addVerticalSpace = true;
-
-	public Paragraph(boolean addVerticalSpace) {
-		this.addVerticalSpace = addVerticalSpace;
-	}
-
-	public int getIndent() {
-		return 0;
-	}
-
-	public boolean getAddVerticalSpace() {
-		return addVerticalSpace;
-	}
-
-	/*
-	 * @see IParagraph#getSegments()
-	 */
-	public IParagraphSegment[] getSegments() {
-		if (segments == null)
-			return new IParagraphSegment[0];
-		return (IParagraphSegment[]) segments.toArray(
-			new IParagraphSegment[segments.size()]);
-	}
-
-	public void addSegment(IParagraphSegment segment) {
-		if (segments == null)
-			segments = new Vector();
-		segments.add(segment);
-	}
-
-	public void parseRegularText(
-		String text,
-		boolean expandURLs,
-		HyperlinkSettings settings,
-		String fontId) {
-		if (text.length() == 0)
-			return;
-		if (expandURLs) {
-			int loc = text.indexOf(HTTP);
-
-			if (loc == -1)
-				addSegment(new TextSegment(text, fontId));
-			else {
-				int textLoc = 0;
-				while (loc != -1) {
-					addSegment(new TextSegment(text.substring(textLoc, loc), fontId));
-					boolean added = false;
-					for (textLoc = loc; textLoc < text.length(); textLoc++) {
-						char c = text.charAt(textLoc);
-						if (Character.isSpaceChar(c)) {
-							addHyperlinkSegment(text.substring(loc, textLoc), settings, fontId);
-							added = true;
-							break;
-						}
-					}
-					if (!added) {
-						// there was no space - just end of text
-						addHyperlinkSegment(text.substring(loc), settings, fontId);
-						break;
-					}
-					loc = text.indexOf(HTTP, textLoc);
-				}
-				if (textLoc < text.length()) {
-					addSegment(new TextSegment(text.substring(textLoc), fontId));
-				}
-			}
-		} else {
-			addSegment(new TextSegment(text, fontId));
-		}
-	}
-
-	private void addHyperlinkSegment(
-		String text,
-		HyperlinkSettings settings,
-		String fontId) {
-		HyperlinkSegment hs = new HyperlinkSegment(text, settings, fontId);
-		hs.setWordWrapAllowed(false);
-		hs.setActionId(FormEngine.URL_HANDLER_ID);
-		addSegment(hs);
-	}
-
-	public void paint(
-		GC gc,
-		int width,
-		Locator loc,
-		int lineHeight,
-		Hashtable objectTable,
-		IHyperlinkSegment selectedLink) {
-		IParagraphSegment [] segments = getSegments();
-		if (segments.length > 0) {
-			if (segments[0] instanceof ITextSegment
-				&& ((ITextSegment) segments[0]).isSelectable())
-				loc.x += 1;
-			for (int j = 0; j < segments.length; j++) {
-				IParagraphSegment segment = segments[j];
-				boolean doSelect = false;
-				if (selectedLink != null && segment.equals(selectedLink))
-					doSelect = true;
-				segment.paint(gc, width, loc, objectTable, doSelect);
-			}
-			loc.y += loc.rowHeight;
-		} else {
-			loc.y += lineHeight;
-		}
-	}
-	public String getAccessibleText() {
-		IParagraphSegment [] segments = getSegments();
-		StringWriter swriter = new StringWriter();
-		PrintWriter writer = new PrintWriter(swriter);
-		for (int i = 0; i < segments.length; i++) {
-			IParagraphSegment segment = segments[i];
-			if (segment instanceof ITextSegment) {
-				String text = ((ITextSegment)segment).getText();
-				writer.print(text);
-			}
-		}
-		writer.println();
-		swriter.flush();
-		return swriter.toString();
-	}
-	public ITextSegment findSegmentAt(int x, int y) {
-		if (segments!=null) {
-			for (int i=0; i<segments.size(); i++) {
-				IParagraphSegment segment = (IParagraphSegment)segments.get(i);
-				if (segment instanceof ITextSegment) {
-					ITextSegment textSegment = (ITextSegment)segment;
-					if (textSegment.contains(x, y))
-						return textSegment;
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ParagraphSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ParagraphSegment.java
deleted file mode 100644
index 7d16aac..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ParagraphSegment.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-/**
- * @version 	1.0
- * @author
- */
-public abstract class ParagraphSegment implements IParagraphSegment {
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextModel.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextModel.java
deleted file mode 100644
index 0ec9682..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextModel.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.io.*;
-import java.util.*;
-import javax.xml.parsers.*;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.update.ui.forms.internal.*;
-import org.w3c.dom.*;
-import org.xml.sax.*;
-
-/**
- * @version 	1.0
- * @author
- */
-public class TextModel implements ITextModel {
-	private static final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-
-	Vector paragraphs;
-	IHyperlinkListener urlListener;
-	IHyperlinkSegment[] hyperlinks;
-	int selectedLinkIndex = -1;
-	HyperlinkSettings hyperlinkSettings;
-	
-	public TextModel() {
-		reset();
-	}
-
-	class LocalHyperlinkSettings extends HyperlinkSettings {
-	}
-
-	/*
-	 * @see ITextModel#getParagraphs()
-	 */
-	public IParagraph[] getParagraphs() {
-		if (paragraphs == null)
-			return new IParagraph[0];
-		return (IParagraph[]) paragraphs.toArray(
-			new IParagraph[paragraphs.size()]);
-	}
-	
-	public String getAccessibleText() {
-		if (paragraphs == null)
-			return "";
-		StringBuffer sbuf = new StringBuffer();
-		for (int i=0; i<paragraphs.size(); i++) {
-			IParagraph paragraph  = (IParagraph)paragraphs.get(i);
-			String text = paragraph.getAccessibleText();
-			sbuf.append(text);
-		}
-		return sbuf.toString();
-	}
-
-	/*
-	 * @see ITextModel#parse(String)
-	 */
-	public void parseTaggedText(String taggedText, boolean expandURLs)
-		throws CoreException {
-		if (taggedText==null) {
-			reset();
-			return;
-		}
-		try {
-			InputStream stream =
-				new ByteArrayInputStream(taggedText.getBytes("UTF8"));
-			parseInputStream(stream, expandURLs);
-		} catch (UnsupportedEncodingException e) {
-		}
-	}
-
-	public void parseInputStream(InputStream is, boolean expandURLs)
-		throws CoreException {
-			
-		documentBuilderFactory.setNamespaceAware(true);
-	
-		reset();
-		try {
-			DocumentBuilder parser = documentBuilderFactory.newDocumentBuilder();
-			InputSource source = new InputSource(is);
-			Document doc = parser.parse(source);
-			processDocument(doc, expandURLs);
-		} catch (ParserConfigurationException e) {
-			FormsPlugin.logException(e);
-		} catch (SAXException e) {
-			FormsPlugin.logException(e);
-		} catch (IOException e) {
-			FormsPlugin.logException(e);
-		}
-	}
-
-	private void processDocument(Document doc, boolean expandURLs) {
-		Node root = doc.getDocumentElement();
-		NodeList children = root.getChildNodes();
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			if (child.getNodeType() == Node.TEXT_NODE) {
-				// Make an implicit paragraph
-				String text = child.getNodeValue();
-				if (text != null && !isIgnorableWhiteSpace(text, true)) {
-					Paragraph p = new Paragraph(true);
-					p.parseRegularText(
-						text,
-						expandURLs,
-						getHyperlinkSettings(),
-						null);
-					paragraphs.add(p);
-				}
-			} else if (child.getNodeType() == Node.ELEMENT_NODE) {
-				String tag = child.getNodeName().toLowerCase();
-				if (tag.equals("p")) {
-					IParagraph p = processParagraph(child, expandURLs);
-					if (p != null)
-						paragraphs.add(p);
-				} else if (tag.equals("li")) {
-					IParagraph p = processListItem(child, expandURLs);
-					if (p != null)
-						paragraphs.add(p);
-				}
-			}
-		}
-	}
-	private IParagraph processParagraph(Node paragraph, boolean expandURLs) {
-		NodeList children = paragraph.getChildNodes();
-		NamedNodeMap atts = paragraph.getAttributes();
-		Node addSpaceAtt = atts.getNamedItem("addVerticalSpace");
-		boolean addSpace = true;
-
-		if (addSpaceAtt != null) {
-			String value = addSpaceAtt.getNodeValue();
-			addSpace = value.equalsIgnoreCase("true");
-		}
-		Paragraph p = new Paragraph(addSpace);
-
-		processSegments(p, children, expandURLs);
-		return p;
-	}
-	private IParagraph processListItem(Node listItem, boolean expandURLs) {
-		NodeList children = listItem.getChildNodes();
-		NamedNodeMap atts = listItem.getAttributes();
-		Node addSpaceAtt = atts.getNamedItem("addVerticalSpace");
-		Node styleAtt = atts.getNamedItem("style");
-		Node valueAtt = atts.getNamedItem("value");
-		Node indentAtt = atts.getNamedItem("indent");
-		int style = IBulletParagraph.CIRCLE;
-		int indent = -1;
-		String text = null;
-		boolean addSpace = true;
-
-		if (addSpaceAtt != null) {
-			String value = addSpaceAtt.getNodeValue();
-			addSpace = value.equalsIgnoreCase("true");
-		}
-		if (styleAtt != null) {
-			String value = styleAtt.getNodeValue();
-			if (value.equalsIgnoreCase("text")) {
-				style = IBulletParagraph.TEXT;
-			} else if (value.equalsIgnoreCase("image")) {
-				style = IBulletParagraph.IMAGE;
-			}
-		}
-		if (valueAtt != null) {
-			text = valueAtt.getNodeValue();
-		}
-		if (indentAtt != null) {
-			String value = indentAtt.getNodeValue();
-			try {
-				indent = Integer.parseInt(value);
-			} catch (NumberFormatException e) {
-			}
-		}
-
-		BulletParagraph p = new BulletParagraph(addSpace);
-		p.setIndent(indent);
-		p.setBulletStyle(style);
-		p.setBulletText(text);
-
-		processSegments(p, children, expandURLs);
-		return p;
-	}
-
-	private void processSegments(
-		Paragraph p,
-		NodeList children,
-		boolean expandURLs) {
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			IParagraphSegment segment = null;
-
-			if (child.getNodeType() == Node.TEXT_NODE) {
-				String value = child.getNodeValue();
-
-				if (value != null && !isIgnorableWhiteSpace(value, false)) {
-					p.parseRegularText(
-						value,
-						expandURLs,
-						getHyperlinkSettings(),
-						null);
-				}
-			} else if (child.getNodeType() == Node.ELEMENT_NODE) {
-				String name = child.getNodeName();
-				if (name.equalsIgnoreCase("img")) {
-					segment = processImageSegment(child);
-				} else if (name.equalsIgnoreCase("a")) {
-					segment =
-						processHyperlinkSegment(child, getHyperlinkSettings());
-				} else if (name.equalsIgnoreCase("text")) {
-					processTextSegment(p, expandURLs, child);
-				} else if (name.equalsIgnoreCase("b")) {
-					String text = getNodeText(child).trim();
-					String fontId = JFaceResources.BANNER_FONT;
-					p.parseRegularText(
-						text,
-						expandURLs,
-						getHyperlinkSettings(),
-						fontId);
-				}
-			}
-			if (segment != null) {
-				p.addSegment(segment);
-			}
-		}
-	}
-
-	private boolean isIgnorableWhiteSpace(String text, boolean ignoreSpaces) {
-		for (int i = 0; i < text.length(); i++) {
-			char c = text.charAt(i);
-			if (ignoreSpaces && c == ' ')
-				continue;
-			if (c == '\n' || c == '\r' || c == '\f')
-				continue;
-			return false;
-		}
-		return true;
-	}
-
-	private IParagraphSegment processImageSegment(Node image) {
-		ImageSegment segment = new ImageSegment();
-		NamedNodeMap atts = image.getAttributes();
-		Node id = atts.getNamedItem("href");
-		Node align = atts.getNamedItem("align");
-		if (id != null) {
-			String value = id.getNodeValue();
-			segment.setObjectId(value);
-		}
-		if (align != null) {
-			String value = align.getNodeValue().toLowerCase();
-			if (value.equals("top"))
-				segment.setVerticalAlignment(ImageSegment.TOP);
-			else if (value.equals("middle"))
-				segment.setVerticalAlignment(ImageSegment.MIDDLE);
-			else if (value.equals("bottom"))
-				segment.setVerticalAlignment(ImageSegment.BOTTOM);
-		}
-		return segment;
-	}
-
-	private String getNodeText(Node node) {
-		NodeList children = node.getChildNodes();
-		String text = "";
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			if (child.getNodeType() == Node.TEXT_NODE) {
-				text += child.getNodeValue();
-			}
-		}
-		return text;
-	}
-
-	private IParagraphSegment processHyperlinkSegment(
-		Node link,
-		HyperlinkSettings settings) {
-		String text = getNodeText(link);
-		HyperlinkSegment segment = new HyperlinkSegment(text, settings, null);
-		NamedNodeMap atts = link.getAttributes();
-		Node href = atts.getNamedItem("href");
-		if (href != null) {
-			String value = href.getNodeValue();
-			segment.setActionId(value);
-		}
-		Node arg = atts.getNamedItem("arg");
-		if (arg != null) {
-			String value = arg.getNodeValue();
-			segment.setArg(value);
-		}
-		return segment;
-	}
-
-	private void processTextSegment(
-		Paragraph p,
-		boolean expandURLs,
-		Node textNode) {
-		String text = getNodeText(textNode).trim();
-
-		NamedNodeMap atts = textNode.getAttributes();
-		Node font = atts.getNamedItem("font");
-		String fontId = null;
-		if (font != null) {
-			fontId = font.getNodeValue();
-		}
-		p.parseRegularText(text, expandURLs, getHyperlinkSettings(), fontId);
-	}
-
-	public void parseRegularText(String regularText, boolean convertURLs)
-		throws CoreException {
-		reset();
-		
-		if (regularText==null) return;
-
-		Paragraph p = new Paragraph(true);
-		paragraphs.add(p);
-		int pstart = 0;
-
-		for (int i = 0; i < regularText.length(); i++) {
-			char c = regularText.charAt(i);
-			if (p == null) {
-				p = new Paragraph(true);
-				paragraphs.add(p);
-			}
-			if (c == '\n') {
-				String text = regularText.substring(pstart, i);
-				pstart = i + 1;
-				p.parseRegularText(
-					text,
-					convertURLs,
-					getHyperlinkSettings(),
-					null);
-				p = null;
-			}
-		}
-		if (p != null) {
-			// no new line
-			String text = regularText.substring(pstart);
-			p.parseRegularText(text, convertURLs, getHyperlinkSettings(), null);
-		}
-	}
-
-	public HyperlinkSettings getHyperlinkSettings() {
-		if (hyperlinkSettings == null) {
-			hyperlinkSettings = new LocalHyperlinkSettings();
-		}
-		return hyperlinkSettings;
-	}
-
-	public void setHyperlinkSettings(HyperlinkSettings settings) {
-		this.hyperlinkSettings = settings;
-	}
-
-	public void setURLListener(IHyperlinkListener urlListener) {
-		this.urlListener = urlListener;
-	}
-
-	private void reset() {
-		if (paragraphs == null)
-			paragraphs = new Vector();
-		paragraphs.clear();
-		selectedLinkIndex = -1;
-		hyperlinks = null;
-	}
-
-	IHyperlinkSegment[] getHyperlinks() {
-		if (hyperlinks != null || paragraphs == null)
-			return hyperlinks;
-		Vector result = new Vector();
-		for (int i = 0; i < paragraphs.size(); i++) {
-			IParagraph p = (IParagraph) paragraphs.get(i);
-			IParagraphSegment[] segments = p.getSegments();
-			for (int j = 0; j < segments.length; j++) {
-				if (segments[j] instanceof IHyperlinkSegment)
-					result.add(segments[j]);
-			}
-		}
-		hyperlinks =
-			(IHyperlinkSegment[]) result.toArray(
-				new IHyperlinkSegment[result.size()]);
-		return hyperlinks;
-	}
-
-	public IHyperlinkSegment findHyperlinkAt(int x, int y) {
-		IHyperlinkSegment[] links = getHyperlinks();
-		for (int i = 0; i < links.length; i++) {
-			if (links[i].contains(x, y))
-				return links[i];
-		}
-		return null;
-	}
-	public ITextSegment findSegmentAt(int x, int y) {
-		for (int i = 0; i < paragraphs.size(); i++) {
-			IParagraph p = (IParagraph) paragraphs.get(i);
-			ITextSegment segment = p.findSegmentAt(x, y);
-			if (segment != null)
-				return segment;
-		}
-		return null;
-	}
-
-	public IHyperlinkSegment getSelectedLink() {
-		if (selectedLinkIndex == -1)
-			return null;
-		return hyperlinks[selectedLinkIndex];
-	}
-
-	public boolean traverseLinks(boolean next) {
-		IHyperlinkSegment[] links = getHyperlinks();
-		if (links == null)
-			return false;
-		int size = links.length;
-		if (next) {
-			selectedLinkIndex++;
-		} else
-			selectedLinkIndex--;
-
-		if (selectedLinkIndex < 0 || selectedLinkIndex > size - 1) {
-			selectedLinkIndex = -1;
-		}
-		return selectedLinkIndex != -1;
-	}
-
-	public void selectLink(IHyperlinkSegment link) {
-		if (link == null)
-			selectedLinkIndex = -1;
-		else {
-			IHyperlinkSegment[] links = getHyperlinks();
-			selectedLinkIndex = -1;
-			if (links == null)
-				return;
-			for (int i = 0; i < links.length; i++) {
-				if (links[i].equals(link)) {
-					selectedLinkIndex = i;
-					break;
-				}
-			}
-		}
-	}
-
-	public boolean hasFocusSegments() {
-		IHyperlinkSegment[] links = getHyperlinks();
-		if (links.length > 0)
-			return true;
-		return false;
-	}
-
-	public void dispose() {
-		if (hyperlinkSettings instanceof LocalHyperlinkSettings)
-			hyperlinkSettings.dispose();
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextSegment.java
deleted file mode 100644
index 49ec5d1..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextSegment.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.jface.resource.JFaceResources;
-import java.util.Hashtable;
-import org.eclipse.swt.SWT;
-import java.text.BreakIterator;
-import java.util.Vector;
-
-/**
- * @version 	1.0
- * @author
- */
-public class TextSegment extends ParagraphSegment implements ITextSegment {
-	private Color color;
-	private String fontId;
-	private String text;
-	protected boolean underline;
-	private boolean wrapAllowed = true;
-	protected Vector areaRectangles = new Vector();
-	
-	class AreaRectangle {
-		Rectangle rect;
-		int from, to;
-		public AreaRectangle(Rectangle rect, int from, int to) {
-			this.rect = rect;
-			this.from = from;
-			this.to = to;
-		}
-		public boolean contains(int x, int y) {
-			return rect.contains(x, y);
-		}
-		public String getText() {
-			if (from==0 && to== -1)
-				return TextSegment.this.getText();
-			if (from >0 && to == -1)
-				return TextSegment.this.getText().substring(from);
-			return TextSegment.this.getText().substring(from, to);
-		}
-	}
-	
-	public TextSegment(String text, String fontId) {
-		this.text = cleanup(text);
-		this.fontId = fontId;
-	}
-
-	private String cleanup(String text) {
-		StringBuffer buf = new StringBuffer();
-		for (int i = 0; i < text.length(); i++) {
-			char c = text.charAt(i);
-			if (c == '\n' || c == '\r' || c=='\f') {
-				if (i > 0)
-					buf.append(' ');
-			} else
-				buf.append(c);
-		}
-		return buf.toString();
-	}
-
-	public void setWordWrapAllowed(boolean value) {
-		wrapAllowed = value;
-	}
-
-	public boolean isWordWrapAllowed() {
-		return wrapAllowed;
-	}
-	
-	public boolean isSelectable() {
-		return false;
-	}
-
-	public Color getColor() {
-		return color;
-	}
-
-	public Font getFont() {
-		if (fontId == null)
-			return JFaceResources.getDefaultFont();
-		else
-			return JFaceResources.getFontRegistry().get(fontId);
-	}
-
-	public String getText() {
-		return text;
-	}
-
-	void setText(String text) {
-		this.text = cleanup(text);
-	}
-
-	void setColor(Color color) {
-		this.color = color;
-	}
-
-	void setFontId(String fontId) {
-		this.fontId = fontId;
-	}
-
-	public boolean contains(int x, int y) {
-		for (int i = 0; i < areaRectangles.size(); i++) {
-			AreaRectangle ar = (AreaRectangle) areaRectangles.get(i);
-			if (ar.contains(x, y))
-				return true;
-		}
-		return false;
-	}
-	
-	public Rectangle getBounds() {
-		int x=0, y=0;
-		int width = 0, height = 0;
-		
-		for (int i=0; i<areaRectangles.size(); i++) {
-			AreaRectangle ar = (AreaRectangle)areaRectangles.get(i);
-			if (i==0) y = ar.rect.y;
-			x = Math.min(ar.rect.x, x);
-			width = Math.max(ar.rect.width, width);
-			height += ar.rect.height;
-		}
-		return new Rectangle(x, y, width, height);
-	}
-
-	public void advanceLocator(
-		GC gc,
-		int wHint,
-		Locator locator,
-		Hashtable objectTable) {
-		Font oldFont = null;
-		if (fontId != null) {
-			oldFont = gc.getFont();
-			gc.setFont(getFont());
-		}
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-
-		if (wHint == SWT.DEFAULT || !wrapAllowed) {
-			Point extent = gc.textExtent(text);
-
-			if (locator.x + extent.x > wHint) {
-				// new line
-				locator.x = isSelectable()?locator.indent+1:locator.indent;
-				locator.y += locator.rowHeight;
-				locator.rowHeight = 0;
-			}
-			int width = extent.x;
-			if (isSelectable()) width+=2;
-			locator.x += width;
-			locator.width = width;
-			locator.height = extent.y;
-			locator.rowHeight = Math.max(locator.rowHeight, extent.y);
-			return;
-		}
-
-		BreakIterator wb = BreakIterator.getLineInstance();
-		wb.setText(text);
-
-		int saved = 0;
-		int last = 0;
-
-		int width = 0;
-
-		Point lastExtent = null;
-
-		for (int loc = wb.first(); loc != BreakIterator.DONE; loc = wb.next()) {
-			String word = text.substring(saved, loc);
-			Point extent = gc.textExtent(word);
-
-			if (locator.x + extent.x > wHint) {
-				// overflow
-				String savedWord = text.substring(saved, last);
-				if (lastExtent==null)
-				   lastExtent = gc.textExtent(savedWord);
-				int lineWidth = locator.x + lastExtent.x;
-				if (isSelectable()) lineWidth+=2;
-
-				saved = last;
-				locator.rowHeight = Math.max(locator.rowHeight, lastExtent.y);
-				locator.x = isSelectable()?locator.indent+1:locator.indent;
-				locator.y += locator.rowHeight;
-				locator.rowHeight = 0;
-				width = Math.max(width, lineWidth);
-			}
-			last = loc;
-			lastExtent = extent;
-		}
-		String lastString = text.substring(saved, last);
-		Point extent = gc.textExtent(lastString);
-		int lineWidth = extent.x;
-		if (isSelectable()) lineWidth += 2;
-		locator.x += lineWidth;
-		locator.width = width;
-		locator.height = lineHeight;
-		locator.rowHeight = Math.max(locator.rowHeight, extent.y);
-		if (oldFont != null) {
-			gc.setFont(oldFont);
-		}
-	}
-	
-	public void paint(
-		GC gc,
-		int width,
-		Locator locator,
-		Hashtable objectTable,
-		boolean selected) {
-		Font oldFont = null;
-		Color oldColor = null;
-
-		areaRectangles.clear();
-
-		if (fontId != null) {
-			oldFont = gc.getFont();
-			gc.setFont(getFont());
-		}
-		if (color != null) {
-			oldColor = gc.getForeground();
-			gc.setForeground(color);
-		}
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		int descent = fm.getDescent();
-
-		if (!wrapAllowed) {
-			Point extent = gc.textExtent(text);
-			int ewidth = extent.x;
-			if (isSelectable()) ewidth += 2;
-
-			if (locator.x + ewidth > width) {
-				// new line
-				locator.resetCaret();
-				if (isSelectable()) locator.x += 1;
-				locator.y += locator.rowHeight;
-				locator.rowHeight = 0;
-			}
-			gc.drawString(text, locator.x, locator.y);
-			if (underline) {
-				int lineY = locator.y + lineHeight - descent + 1;
-				gc.drawLine(locator.x, lineY, locator.x + extent.x, lineY);
-			}
-			Rectangle br =
-				new Rectangle(locator.x - 1, locator.y, extent.x + 2, lineHeight - descent + 3);
-			areaRectangles.add(new AreaRectangle(br, 0, -1));
-			if (selected) {
-				if (color != null)
-					gc.setForeground(oldColor);
-				gc.drawFocus(br.x, br.y, br.width, br.height);
-			}
-
-			locator.x += ewidth;
-			locator.width = ewidth;
-			locator.height = lineHeight;
-			locator.rowHeight = Math.max(locator.rowHeight, extent.y);
-			if (oldFont != null) {
-				gc.setFont(oldFont);
-			}
-			if (oldColor != null) {
-				gc.setForeground(oldColor);
-			}
-			return;
-		}
-
-		BreakIterator wb = BreakIterator.getLineInstance();
-		wb.setText(text);
-
-		int saved = 0;
-		int last = 0;
-
-		for (int loc = wb.first(); loc != BreakIterator.DONE; loc = wb.next()) {
-			if (loc == 0)
-				continue;
-			String word = text.substring(saved, loc);
-			Point extent = gc.textExtent(word);
-			int ewidth = extent.x;
-			if (isSelectable()) ewidth += 2;
-
-			if (locator.x + ewidth > width) {
-				// overflow
-				String prevLine = text.substring(saved, last);
-				gc.drawString(prevLine, locator.x, locator.y, true);
-				Point prevExtent = gc.textExtent(prevLine);
-				int prevWidth = prevExtent.x;
-				if (isSelectable()) prevWidth += 2;
-
-				if (underline) {
-					int lineY = locator.y + lineHeight - descent + 1;
-					gc.drawLine(locator.x, lineY, locator.x + prevWidth, lineY);
-				}
-				Rectangle br =
-					new Rectangle(
-						locator.x - 1,
-						locator.y,
-						prevExtent.x + 2,
-						lineHeight - descent + 3);
-				if (selected) {
-					if (color != null)
-						gc.setForeground(oldColor);
-					gc.drawFocus(br.x, br.y, br.width, br.height);
-					if (color != null)
-						gc.setForeground(color);
-				}
-				areaRectangles.add(new AreaRectangle(br, saved, last));
-				
-				locator.rowHeight = Math.max(locator.rowHeight, prevExtent.y);
-				locator.resetCaret();
-				if (isSelectable()) locator.x +=1;
-				locator.y += locator.rowHeight;
-				locator.rowHeight = 0;
-				saved = last;
-			}
-			last = loc;
-		}
-		// paint the last line
-		String lastLine = text.substring(saved, last);
-		gc.drawString(lastLine, locator.x, locator.y, true);
-		Point lastExtent = gc.textExtent(lastLine);
-		int lastWidth = lastExtent.x;
-		if (isSelectable()) lastWidth += 2;
-		Rectangle br =
-			new Rectangle(
-				locator.x - 1,
-				locator.y,
-				lastExtent.x + 2,
-				lineHeight - descent + 3);
-		areaRectangles.add(new AreaRectangle(br, saved, last));
-		if (underline) {
-			int lineY = locator.y + lineHeight - descent + 1;
-			gc.drawLine(locator.x, lineY, locator.x + lastExtent.x, lineY);
-		}
-		if (selected) {
-			if (color != null)
-				gc.setForeground(oldColor);
-			gc.drawFocus(br.x, br.y, br.width, br.height);
-		}
-		locator.x += lastWidth;
-		locator.rowHeight = Math.max(locator.rowHeight, lastExtent.y);
-		if (oldFont != null) {
-			gc.setFont(oldFont);
-		}
-		if (oldColor != null) {
-			gc.setForeground(oldColor);
-		}
-	}
-	
-	public void paintFocus(GC gc, Color bg, Color fg, boolean selected) {
-		if (areaRectangles==null) return;
-		for (int i=0; i<areaRectangles.size(); i++) {
-			AreaRectangle areaRectangle = (AreaRectangle)areaRectangles.get(i);
-			Rectangle br = areaRectangle.rect;
-			if (selected) {
-				gc.setBackground(bg);
-				gc.setForeground(fg);
-				gc.drawFocus(br.x, br.y, br.width, br.height);
-			}
-			else {
-				gc.setForeground(bg);
-				gc.drawRectangle(br.x, br.y, br.width-1, br.height-1);
-			}
-		}
-	}	
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/image1.gif b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/image1.gif
deleted file mode 100644
index c5c94ee..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/image1.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/index.xml b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/index.xml
deleted file mode 100644
index 4732f87..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/index.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form>
-<p>
-To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse 1</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search. 
-Now we <b>will</b> add an 
-<img href="image1"/> 
-image here. Just
- to show how wrapping should apply to images when they are 
- larger than the regular text.
-</p>
-<li style="text" value="1.">To check for updates for features you have installed, 
-go to the <a href="action2">My Eclipse 2</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.</li>
-<li style="text" value="2.">This is the item number 2.</li>
-<li style="text" value="3.">This is the item number 3.</li>
-<li>This is the bullet item.</li>
-<li>This is another bullet item.</li>
-</form>
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/.classpath b/update/org.eclipse.update.ui.win32/.classpath
deleted file mode 100644
index 314d270..0000000
--- a/update/org.eclipse.update.ui.win32/.classpath
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src/"/>
-    <classpathentry kind="src" path="/org.eclipse.core.resources"/>
-    <classpathentry kind="src" path="/org.eclipse.ui"/>
-    <classpathentry kind="src" path="/org.eclipse.update.ui.forms"/>
-    <classpathentry kind="src" path="/org.eclipse.help"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update.ui.win32/.cvsignore b/update/org.eclipse.update.ui.win32/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/update/org.eclipse.update.ui.win32/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/update/org.eclipse.update.ui.win32/.project b/update/org.eclipse.update.ui.win32/.project
deleted file mode 100644
index eb41f90..0000000
--- a/update/org.eclipse.update.ui.win32/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.ui.win32</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.help</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.update.ui.forms</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/update/org.eclipse.update.ui.win32/about.html b/update/org.eclipse.update.ui.win32/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/update/org.eclipse.update.ui.win32/about.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>20th June, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Common Public License Version 1.0 (&quot;CPL&quot;).  A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>.
-For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL (&quot;Other License&quot;), any modifications, enhancements and/or
-other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/build.properties b/update/org.eclipse.update.ui.win32/build.properties
deleted file mode 100644
index a31730b..0000000
--- a/update/org.eclipse.update.ui.win32/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-bin.includes = plugin.properties,\
-               icons/,\
-               *.jar,\
-               plugin.xml,\
-               about.html
-src.includes = about.html
-source.updateui32.jar = src/
diff --git a/update/org.eclipse.update.ui.win32/icons/full/clcl16/backward_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/clcl16/backward_nav.gif
deleted file mode 100644
index 740419b..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/clcl16/backward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/clcl16/forward_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/clcl16/forward_nav.gif
deleted file mode 100644
index 7a1511d..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/clcl16/forward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/clcl16/go_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/clcl16/go_nav.gif
deleted file mode 100644
index bb20d88..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/clcl16/go_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/clcl16/hierarchicalLayout.gif b/update/org.eclipse.update.ui.win32/icons/full/clcl16/hierarchicalLayout.gif
deleted file mode 100644
index e597c3d..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/clcl16/hierarchicalLayout.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/clcl16/home_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/clcl16/home_nav.gif
deleted file mode 100644
index 949c2db..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/clcl16/home_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/clcl16/refresh_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/clcl16/refresh_nav.gif
deleted file mode 100644
index a063c23..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/clcl16/refresh_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/clcl16/show_unconf.gif b/update/org.eclipse.update.ui.win32/icons/full/clcl16/show_unconf.gif
deleted file mode 100644
index 4c75f55..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/clcl16/show_unconf.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/clcl16/stop_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/clcl16/stop_nav.gif
deleted file mode 100644
index 4eb53ec..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/clcl16/stop_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/cview16/browser.gif b/update/org.eclipse.update.ui.win32/icons/full/cview16/browser.gif
deleted file mode 100644
index fd70277..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/cview16/browser.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/backward_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/dlcl16/backward_nav.gif
deleted file mode 100644
index e2179ad..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/backward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/forward_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/dlcl16/forward_nav.gif
deleted file mode 100644
index 0c5af08..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/forward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/go_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/dlcl16/go_nav.gif
deleted file mode 100644
index 472f005..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/go_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/hierarchicalLayout.gif b/update/org.eclipse.update.ui.win32/icons/full/dlcl16/hierarchicalLayout.gif
deleted file mode 100644
index 76f3360..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/hierarchicalLayout.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/home_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/dlcl16/home_nav.gif
deleted file mode 100644
index 3c80080..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/home_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/refresh_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/dlcl16/refresh_nav.gif
deleted file mode 100644
index b2281b4..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/refresh_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/show_unconf.gif b/update/org.eclipse.update.ui.win32/icons/full/dlcl16/show_unconf.gif
deleted file mode 100644
index 493f498..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/show_unconf.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/stop_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/dlcl16/stop_nav.gif
deleted file mode 100644
index 7f0f9b9..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/dlcl16/stop_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/elcl16/backward_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/elcl16/backward_nav.gif
deleted file mode 100644
index 85188b7..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/elcl16/backward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/elcl16/collapseall.gif b/update/org.eclipse.update.ui.win32/icons/full/elcl16/collapseall.gif
deleted file mode 100644
index 72c7ca2..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/elcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/elcl16/forward_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/elcl16/forward_nav.gif
deleted file mode 100644
index dc28ee1..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/elcl16/forward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/elcl16/go_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/elcl16/go_nav.gif
deleted file mode 100644
index 7683327..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/elcl16/go_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/elcl16/hierarchicalLayout.gif b/update/org.eclipse.update.ui.win32/icons/full/elcl16/hierarchicalLayout.gif
deleted file mode 100644
index b50b2c3..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/elcl16/hierarchicalLayout.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/elcl16/home_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/elcl16/home_nav.gif
deleted file mode 100644
index bf2ba86..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/elcl16/home_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/elcl16/refresh_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/elcl16/refresh_nav.gif
deleted file mode 100644
index 919423d..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/elcl16/refresh_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/elcl16/show_unconf.gif b/update/org.eclipse.update.ui.win32/icons/full/elcl16/show_unconf.gif
deleted file mode 100644
index bdf381a..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/elcl16/show_unconf.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/elcl16/stop_nav.gif b/update/org.eclipse.update.ui.win32/icons/full/elcl16/stop_nav.gif
deleted file mode 100644
index a519f44..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/elcl16/stop_nav.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/eview16/browser.gif b/update/org.eclipse.update.ui.win32/icons/full/eview16/browser.gif
deleted file mode 100644
index 33935b1..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/eview16/browser.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/forms/def_provider.jpg b/update/org.eclipse.update.ui.win32/icons/full/forms/def_provider.jpg
deleted file mode 100644
index a43cbeb..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/forms/def_provider.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/forms/form_banner.gif b/update/org.eclipse.update.ui.win32/icons/full/forms/form_banner.gif
deleted file mode 100644
index aebc0b2..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/forms/form_banner.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/forms/form_banner.jpg b/update/org.eclipse.update.ui.win32/icons/full/forms/form_banner.jpg
deleted file mode 100644
index 253e2d2..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/forms/form_banner.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/forms/form_underline.jpg b/update/org.eclipse.update.ui.win32/icons/full/forms/form_underline.jpg
deleted file mode 100644
index 0ff3d0b..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/forms/form_underline.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/forms/form_underline2.jpg b/update/org.eclipse.update.ui.win32/icons/full/forms/form_underline2.jpg
deleted file mode 100644
index 57414f7..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/forms/form_underline2.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/full/forms/topic.gif b/update/org.eclipse.update.ui.win32/icons/full/forms/topic.gif
deleted file mode 100644
index 10137e9..0000000
--- a/update/org.eclipse.update.ui.win32/icons/full/forms/topic.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/icons/sample.gif b/update/org.eclipse.update.ui.win32/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/update/org.eclipse.update.ui.win32/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/plugin.properties b/update/org.eclipse.update.ui.win32/plugin.properties
deleted file mode 100644
index 5288763..0000000
--- a/update/org.eclipse.update.ui.win32/plugin.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-pluginName = Welcome Portal for Windows
-providerName = Eclipse.org
-views.webBrowser.label = Web Browser
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/plugin.xml b/update/org.eclipse.update.ui.win32/plugin.xml
deleted file mode 100644
index 1b0b77a..0000000
--- a/update/org.eclipse.update.ui.win32/plugin.xml
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.update.ui.win32"
-   name="%pluginName"
-   version="2.1.0"
-   provider-name="%providerName"
-   class="org.eclipse.welcome.internal.WelcomePortal">
-
-   <runtime>
-      <library name="updateui32.jar">
-         <export name="*"/>
-         <packages prefixes="org.eclipse.welcome.internal"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime.compatibility"/>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.ui.views"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor"/>
-      <import plugin="org.eclipse.ui.editors"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.update.ui.forms"/>
-      <import plugin="org.eclipse.help"/>
-   </requires>
-
-
-   <extension-point id="welcomePages" name="Welcome Pages" schema="schema/welcomePages.exsd"/>
-   <extension-point id="welcomeSections" name="Welcome Sections" schema="schema/welcomeSections.exsd"/>
-
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="Sample Action Set"
-            visible="true"
-            id="org.eclipse.update.ui.win32.actionSet">
-         <action
-               label="Open Home Page"
-               icon="icons/sample.gif"
-               tooltip="Open Home Page"
-               class="org.eclipse.welcome.internal.ShowWelcomePageAction"
-               menubarPath="help/helpEnd"
-               id="org.eclipse.welcome.internal.ShowWelcomePageAction">
-         </action>
-      </actionSet>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.ui.resourcePerspective">
-         <actionSet
-               id="org.eclipse.update.ui.win32.actionSet">
-         </actionSet>
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            name="Web Browser"
-            icon="icons/sample.gif"
-            contributorClass="org.eclipse.welcome.internal.webbrowser.WebBrowserEditorContributor"
-            class="org.eclipse.welcome.internal.webbrowser.WebBrowserEditor"
-            id="org.eclipse.welcome.webbrowser">
-      </editor>
-      <editor
-            name="Welcome Page"
-            icon="icons/sample.gif"
-            class="org.eclipse.welcome.internal.portal.WelcomePortalEditor"
-            id="org.eclipse.welcome.portal">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.elementFactories">
-      <factory
-            class="org.eclipse.welcome.internal.webbrowser.WebBrowserEditorInputFactory"
-            id="org.eclipse.welcome.internal.webbrowser.WebBrowserEditorInputFactory">
-      </factory>
-      <factory
-            class="org.eclipse.welcome.internal.portal.WelcomePortalEditorInputFactory"
-            id="org.eclipse.welcome.internal.portal.WelcomePortalEditorInputFactory">
-      </factory>
-   </extension>
-   <extension
-         point="org.eclipse.update.ui.win32.welcomePages">
-      <page
-            name="Home"
-            numColumns="2"
-            id="org.eclipse.update.ui.win32.homePage">
-         <section
-               span="2"
-               id="community.news.remote">
-         </section>
-         <section
-               id="search">
-         </section>
-         <section
-               id="tasks.softwareUpdates">
-         </section>
-         <section
-               id="quickStart">
-         </section>
-         <section
-               id="tipsAndTricks">
-         </section>
-      </page>
-      <page
-            name="News"
-            id="org.eclipse.update.ui.win32.news">
-      </page>
-      <page
-            name="Community"
-            numColumns="1"
-            id="org.eclipse.update.ui.win32.community">
-         <section
-               id="community.links">
-         </section>
-         <section
-               id="community.articles">
-         </section>
-      </page>
-      <page
-            name="Samples"
-            id="org.eclipse.update.ui.win32.samples">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.update.ui.win32.welcomeSections">
-      <section
-            name="Software Updates"
-            id="tasks.softwareUpdates">
-         <form>
-            &lt;p&gt;
-&lt;a href=&quot;action&quot; arg=&quot;org.eclipse.update.ui:org.eclipse.update.internal.ui.InstallWizardAction&quot;&gt;
-Find updates for the currently installed features
-&lt;/a&gt;&lt;/p&gt;
-&lt;p&gt;
-&lt;a href=&quot;action&quot; arg=&quot;org.eclipse.update.ui:org.eclipse.update.internal.ui.ConfigurationManagerAction&quot;&gt;
-Manage my workbench configuration&lt;/a&gt;&lt;/p&gt;
-         </form>
-      </section>
-      <section
-            name="Eclipse Community Sites"
-            id="community.links">
-         <form>
-            &lt;li&gt;&lt;a href=&quot;url&quot; arg=&quot;http://www.eclipse.org&quot;&gt;Eclipse.org&lt;/a&gt;&lt;/li&gt;
-         </form>
-      </section>
-      <section
-            name="New Eclipse Articles"
-            id="community.articles">
-         <form
-               url="http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-update-home/welcome-articles.xml"
-               type="remote">
-         </form>
-      </section>
-      <section
-            name="Headlines"
-            id="community.news.remote">
-         <form
-               url="http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-update-home/welcome-news.xml"
-               type="remote">
-         </form>
-      </section>
-      <section
-            name="Get Help"
-            id="search">
-         <form
-               type="custom"
-               class="org.eclipse.welcome.internal.portal.HelpSection">
-         </form>
-      </section>
-      <section
-            name="Quick Start"
-            id="quickStart">
-         <form
-               type="dynamic"
-               class="org.eclipse.welcome.internal.actions.WelcomeContentProvider">
-         </form>
-      </section>
-      <section
-            name="Tips and Tricks"
-            id="tipsAndTricks">
-         <form
-               type="dynamic"
-               class="org.eclipse.welcome.internal.actions.TipsAndTricksContentProvider">
-         </form>
-      </section>
-   </extension>
-
-</plugin>
diff --git a/update/org.eclipse.update.ui.win32/schema/welcomePages.exsd b/update/org.eclipse.update.ui.win32/schema/welcomePages.exsd
deleted file mode 100644
index 7e43f1b..0000000
--- a/update/org.eclipse.update.ui.win32/schema/welcomePages.exsd
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.update.ui.win32">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.update.ui.win32" id="welcomePages" name="Welcome Pages"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="page" 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>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="page">
-      <complexType>
-         <sequence>
-            <element ref="section" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="numColumns" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="section">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="span" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/update/org.eclipse.update.ui.win32/schema/welcomeSections.exsd b/update/org.eclipse.update.ui.win32/schema/welcomeSections.exsd
deleted file mode 100644
index 9c4b5e2..0000000
--- a/update/org.eclipse.update.ui.win32/schema/welcomeSections.exsd
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.update.ui.win32">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.update.ui.win32" id="welcomeSections" name="Welcome Sections"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="section" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="section">
-      <complexType>
-         <sequence>
-            <element ref="form" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.welcome.internal.portal.IPortalSection"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="form">
-      <complexType>
-         <attribute name="type" use="default" value="local">
-            <annotation>
-               <documentation>
-                  Forms are loaded depending on the &lt;samp&gt;type&lt;/samp&gt; attribute:
-&lt;ul&gt;
-&lt;li&gt;&lt;b&gt;local&lt;/b&gt; - the content of the form will be loaded from the body text of the element.&lt;/li&gt;
-&lt;li&gt;&lt;b&gt;remote&lt;/b&gt; - the content of the form will be downloaded using the specified URL.&lt;/li&gt;
-&lt;li&gt;&lt;b&gt;custom&lt;/b&gt; - the form will be created by loading the class specified by the &lt;samp&gt;class&lt;/samp&gt; attribute that implements IPortalSection interface.&lt;/li&gt;
-&lt;li&gt;&lt;b&gt;dynamic&lt;/b&gt; - the form will be created by loading the class specified by the &lt;samp&gt;class&lt;/samp&gt; attribute that implements IFormContentProvider interface.&lt;/li&gt;
-&lt;/ul&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="local">
-                  </enumeration>
-                  <enumeration value="remote">
-                  </enumeration>
-                  <enumeration value="custom">
-                  </enumeration>
-                  <enumeration value="dynamic">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="url" type="string">
-            <annotation>
-               <documentation>
-                  If &lt;samp&gt;type&lt;/samp&gt; is &lt;samp&gt;remote&lt;/samp&gt;, the content of the form will be downloaded from the specified URL.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.welcome.internal.portal.IPortalSection"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/ShowWelcomePageAction.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/ShowWelcomePageAction.java
deleted file mode 100644
index 70ec5ba..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/ShowWelcomePageAction.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.*;
-import org.eclipse.welcome.internal.portal.WelcomePortalEditorInput;
-
-/**
- * Our sample action implements workbench action delegate.
- * The action proxy will be created by the workbench and
- * shown in the UI. When the user tries to use the action,
- * this delegate will be created and execution will be 
- * delegated to it.
- * @see IWorkbenchWindowActionDelegate
- */
-public class ShowWelcomePageAction implements IWorkbenchWindowActionDelegate {
-	private IWorkbenchWindow window;
-	/**
-	 * The constructor.
-	 */
-	public ShowWelcomePageAction() {
-	}
-
-	/**
-	 * The action has been activated. The argument of the
-	 * method represents the 'real' action sitting
-	 * in the workbench UI.
-	 * @see IWorkbenchWindowActionDelegate#run
-	 */
-	public void run(IAction action) {
-		try {
-			WelcomePortal.getActivePage().openEditor(
-				new WelcomePortalEditorInput(),
-				"org.eclipse.welcome.portal");
-		} catch (PartInitException e) {
-			WelcomePortal.logException(e);
-		}
-	}
-
-	/**
-	 * Selection in the workbench has been changed. We 
-	 * can change the state of the 'real' action here
-	 * if we want, but this can only happen after 
-	 * the delegate has been created.
-	 * @see IWorkbenchWindowActionDelegate#selectionChanged
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	/**
-	 * We can use this method to dispose of any system
-	 * resources we previously allocated.
-	 * @see IWorkbenchWindowActionDelegate#dispose
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * We will cache window object in order to
-	 * be able to provide parent shell for the message dialog.
-	 * @see IWorkbenchWindowActionDelegate#init
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.window = window;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/WelcomePortal.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/WelcomePortal.java
deleted file mode 100644
index 06a2f00..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/WelcomePortal.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.*;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.dialogs.*;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.*;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.welcome.internal.webbrowser.*;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class WelcomePortal extends AbstractUIPlugin {
-	public static final String PLUGIN_ID = "org.eclipse.update.ui.win32";
-	public static final String ID_BROWSER = PLUGIN_ID + "WebBrowser";
-	
-	//The shared instance.
-	private static WelcomePortal plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IStartup#earlyStartup()
-	 */
-	public static void showURL(String name, String url) {
-		try {
-			WelcomePortal.getActivePage().openEditor(
-				new WebBrowserEditorInput(name, url),
-				"org.eclipse.welcome.webbrowser");
-		} catch (PartInitException e) {
-			WelcomePortal.logException(e);
-		}
-	}
-
-	/**
-	 * The constructor.
-	 */
-	public WelcomePortal(IPluginDescriptor descriptor) {
-		super(descriptor);
-		plugin = this;
-		try {
-			resourceBundle =
-				ResourceBundle.getBundle(
-					"org.eclipse.welcome.internal.WelcomePortalResources");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static WelcomePortal getDefault() {
-		return plugin;
-	}
-
-	public static IWorkbenchPage getActivePage() {
-		return getDefault().internalGetActivePage();
-	}
-
-	private IWorkbenchPage internalGetActivePage() {
-		IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow();
-		if (window != null)
-			return window.getActivePage();
-		return null;
-	}
-
-	public static Shell getActiveWorkbenchShell() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		return window != null ? window.getShell() : null;
-	}
-
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	public static String getPluginId() {
-		return getDefault().getDescriptor().getUniqueIdentifier();
-	}
-
-	/**
-	 * Returns the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle,
-	 * or 'key' if not found.
-	 */
-	public static String getString(String key) {
-		ResourceBundle bundle = WelcomePortal.getDefault().getResourceBundle();
-		try {
-			return bundle.getString(key);
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	public static String getFormattedMessage(String key, String[] args) {
-		String text = getString(key);
-		return java.text.MessageFormat.format(text, args);
-	}
-
-	public static String getFormattedMessage(String key, String arg) {
-		String text = getString(key);
-		return java.text.MessageFormat.format(text, new String[] { arg });
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	public void startup() throws CoreException {
-	}
-
-	public void shutdown() throws CoreException {
-	}
-
-	public static void logException(Throwable e) {
-		logException(e, true);
-	}
-
-	public static void logException(Throwable e, boolean showErrorDialog) {
-		if (e instanceof InvocationTargetException) {
-			e = ((InvocationTargetException) e).getTargetException();
-		}
-
-		IStatus status = null;
-		if (e instanceof CoreException) {
-			status = ((CoreException) e).getStatus();
-		} else {
-			String message = e.getMessage();
-			if (message == null)
-				message = e.toString();
-			status =
-				new Status(
-					IStatus.ERROR,
-					getPluginId(),
-					IStatus.OK,
-					message,
-					e);
-		}
-		log(status, showErrorDialog);
-	}
-
-	public static void log(IStatus status, boolean showErrorDialog) {
-		if (status.getSeverity() != IStatus.INFO) {
-			if (showErrorDialog)
-				ErrorDialog.openError(
-					getActiveWorkbenchShell(),
-					null,
-					null,
-					status);
-			//ResourcesPlugin.getPlugin().getLog().log(status);
-			Platform.getPlugin("org.eclipse.core.runtime").getLog().log(status);
-		} else {
-			MessageDialog.openInformation(
-				getActiveWorkbenchShell(),
-				null,
-				status.getMessage());
-		}
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/WelcomePortalImages.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/WelcomePortalImages.java
deleted file mode 100644
index 3675f4b..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/WelcomePortalImages.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Bundle of all images used by the PDE plugin.
- */
-public class WelcomePortalImages {
-
-
-	private static final String NAME_PREFIX= WelcomePortal.getPluginId()+".";
-
-	private final static URL BASE_URL = WelcomePortal.getDefault().getDescriptor().getInstallURL();
-
-
-	private static ImageRegistry PLUGIN_REGISTRY;
-	
-	public final static String ICONS_PATH = "icons/full/";
-
-	/**
-	 * Set of predefined Image Descriptors.
-	 */
-	
-	private static final String PATH_OBJ= ICONS_PATH+"obj16/";
-	private static final String PATH_VIEW = ICONS_PATH+"cview16/";
-	private static final String PATH_LCL= ICONS_PATH+"elcl16/";
-	private static final String PATH_LCL_HOVER= ICONS_PATH+"clcl16/";
-	private static final String PATH_LCL_DISABLED= ICONS_PATH+"dlcl16/";
-	private static final String PATH_TOOL = ICONS_PATH + "etool16/";
-	private static final String PATH_TOOL_HOVER = ICONS_PATH + "ctool16/";
-	private static final String PATH_TOOL_DISABLED = ICONS_PATH + "dtool16/";
-	private static final String PATH_OVR = ICONS_PATH + "ovr16/";
-	private static final String PATH_WIZBAN = ICONS_PATH + "wizban/";
-	public static final String PATH_FORMS = ICONS_PATH + "forms/";
-
-
-	/**
-	 * Frequently used images
-	 */
-	public static final String IMG_FORM_BANNER = NAME_PREFIX+"FORM_BANNER";
-	public static final String IMG_FORM_BANNER_SHORT = NAME_PREFIX+"FORM_BANNER_SHORT";
-	public static final String IMG_FORM_UNDERLINE = NAME_PREFIX + "FORM_UNDERLINE";
-
-	/**
-	 * OBJ16
-	 */
-	public static final ImageDescriptor DESC_APP_OBJ = create(PATH_OBJ, "app_obj.gif");
-	public static final ImageDescriptor DESC_BFOLDER_OBJ = create(PATH_OBJ, "bfolder_obj.gif");
-	public static final ImageDescriptor DESC_CATEGORY_OBJ = create(PATH_OBJ, "category_obj.gif");
-	public static final ImageDescriptor DESC_CD_OBJ = create(PATH_OBJ, "cd_obj.gif");
-	public static final ImageDescriptor DESC_COMPUTER_OBJ = create(PATH_OBJ, "computer_obj.gif");
-	public static final ImageDescriptor DESC_CONFIG_OBJ = create(PATH_OBJ, "config_obj.gif");
-	public static final ImageDescriptor DESC_FEATURE_OBJ = create(PATH_OBJ, "feature_obj.gif");
-	public static final ImageDescriptor DESC_EFIX_OBJ = create(PATH_OBJ, "efix2_obj.gif");
-	public static final ImageDescriptor DESC_FLOPPY_OBJ = create(PATH_OBJ, "floppy_obj.gif");
-	public static final ImageDescriptor DESC_HISTORY_OBJ = create(PATH_OBJ, "history_obj.gif");
-	public static final ImageDescriptor DESC_LSITE_OBJ = create(PATH_OBJ, "lsite_obj.gif");
-	public static final ImageDescriptor DESC_PSITE_OBJ = create(PATH_OBJ, "psite_obj.gif");
-	public static final ImageDescriptor DESC_ESITE_OBJ = create(PATH_OBJ, "esite_obj.gif");
-	public static final ImageDescriptor DESC_SITE_OBJ = create(PATH_OBJ, "site_obj.gif");
-	public static final ImageDescriptor DESC_WEB_SITE_OBJ = create(PATH_OBJ, "web_bkmrk_obj.gif");
-	public static final ImageDescriptor DESC_PLACES_OBJ = create(PATH_OBJ, "places_obj.gif");
-	public static final ImageDescriptor DESC_SAVED_OBJ = create(PATH_OBJ, "saved_obj.gif");
-	public static final ImageDescriptor DESC_UNCONF_FEATURE_OBJ = create(PATH_OBJ, "unconf_feature_obj.gif");
-	public static final ImageDescriptor DESC_UPDATES_OBJ = create(PATH_OBJ, "updates_obj.gif");
-	public static final ImageDescriptor DESC_VFIXED_OBJ = create(PATH_OBJ, "vfixed_obj.gif");
-	public static final ImageDescriptor DESC_VREMOTE_OBJ = create(PATH_OBJ, "vremote_obj.gif");
-	public static final ImageDescriptor DESC_VREMOVABLE_OBJ = create(PATH_OBJ, "vremovable_obj.gif");
-	public static final ImageDescriptor DESC_NOTINST_FEATURE_OBJ = create(PATH_OBJ, "notinstalled_feature_obj.gif");	
-	public static final ImageDescriptor DESC_SHOW_SEARCH = create(PATH_OBJ, "tsearch_obj.gif");
-	public static final ImageDescriptor DESC_ERR_ST_OBJ = create(PATH_OBJ, "error_st_obj.gif");
-	public static final ImageDescriptor DESC_OK_ST_OBJ = create(PATH_OBJ, "ok_st_obj.gif");
-
-	
-	/**
-	 * OVR16
-	 */
-	public static final ImageDescriptor DESC_LINKED_CO   = create(PATH_OVR, "linked_co.gif");
-	public static final ImageDescriptor DESC_UPDATED_CO   = create(PATH_OVR, "updated_co.gif");
-	public static final ImageDescriptor DESC_INSTALLABLE_CO = create(PATH_OVR, "installable_co.gif");
-	public static final ImageDescriptor DESC_CURRENT_CO = create(PATH_OVR, "current_co.gif");
-	public static final ImageDescriptor DESC_ERROR_CO = create(PATH_OVR, "error_co.gif");
-	public static final ImageDescriptor DESC_WARNING_CO = create(PATH_OVR, "warning_co.gif");
-	public static final ImageDescriptor DESC_MOD_CO = create(PATH_OVR, "mod_co.gif");
-	public static final ImageDescriptor DESC_ADD_CO = create(PATH_OVR, "add_stat.gif");
-	public static final ImageDescriptor DESC_DEL_CO = create(PATH_OVR, "del_stat.gif");
-	public static final ImageDescriptor DESC_UNCONF_CO = create(PATH_OVR, "unconfigured_co.gif");
-
-	/**
-	 * VIEW16
-	 */
-
-	public static final ImageDescriptor DESC_CONFIGS_VIEW = create(PATH_VIEW, "configs.gif");
-	public static final ImageDescriptor DESC_SITES_VIEW = create(PATH_VIEW, "updates.gif");
-	public static final ImageDescriptor DESC_SELECTED_UPDATES_VIEW = create(PATH_VIEW, "selected_updates.gif");
-
-	/**
-	 * LCL
-	 */
-	public static final ImageDescriptor DESC_BACKWARD_NAV = create(PATH_LCL, "backward_nav.gif");
-	public static final ImageDescriptor DESC_BACKWARD_NAV_H = create(PATH_LCL_HOVER, "backward_nav.gif");
-	public static final ImageDescriptor DESC_BACKWARD_NAV_D = create(PATH_LCL_DISABLED, "backward_nav.gif");
-	public static final ImageDescriptor DESC_FORWARD_NAV = create(PATH_LCL, "forward_nav.gif");
-	public static final ImageDescriptor DESC_FORWARD_NAV_H = create(PATH_LCL_HOVER, "forward_nav.gif");
-	public static final ImageDescriptor DESC_FORWARD_NAV_D = create(PATH_LCL_DISABLED, "forward_nav.gif");
-	public static final ImageDescriptor DESC_HOME_NAV = create(PATH_LCL, "home_nav.gif");
-	public static final ImageDescriptor DESC_HOME_NAV_H = create(PATH_LCL_HOVER, "home_nav.gif");
-	public static final ImageDescriptor DESC_HOME_NAV_D = create(PATH_LCL_DISABLED, "home_nav.gif");
-	public static final ImageDescriptor DESC_REFRESH_NAV = create(PATH_LCL, "refresh_nav.gif");
-	public static final ImageDescriptor DESC_REFRESH_NAV_H = create(PATH_LCL_HOVER, "refresh_nav.gif");
-	public static final ImageDescriptor DESC_REFRESH_NAV_D = create(PATH_LCL_DISABLED, "refresh_nav.gif");
-	public static final ImageDescriptor DESC_STOP_NAV = create(PATH_LCL, "stop_nav.gif");
-	public static final ImageDescriptor DESC_STOP_NAV_H = create(PATH_LCL_HOVER, "stop_nav.gif");
-	public static final ImageDescriptor DESC_STOP_NAV_D = create(PATH_LCL_DISABLED, "stop_nav.gif");
-	public static final ImageDescriptor DESC_GO_NAV = create(PATH_LCL, "go_nav.gif");
-	public static final ImageDescriptor DESC_GO_NAV_H = create(PATH_LCL_HOVER, "go_nav.gif");
-	public static final ImageDescriptor DESC_GO_NAV_D = create(PATH_LCL_DISABLED, "go_nav.gif");
-	public static final ImageDescriptor DESC_SHOW_UNCONF = create(PATH_LCL, "show_unconf.gif");
-	public static final ImageDescriptor DESC_SHOW_UNCONF_H = create(PATH_LCL_HOVER, "show_unconf.gif");
-	public static final ImageDescriptor DESC_SHOW_UNCONF_D = create(PATH_LCL_DISABLED, "show_unconf.gif");
-	public static final ImageDescriptor DESC_COLLAPSE_ALL = create(PATH_LCL, "collapseall.gif");
-	public static final ImageDescriptor DESC_SHOW_HIERARCHY = create(PATH_LCL, "hierarchicalLayout.gif");
-	public static final ImageDescriptor DESC_SHOW_HIERARCHY_H = create(PATH_LCL_HOVER, "hierarchicalLayout.gif");
-	public static final ImageDescriptor DESC_SHOW_HIERARCHY_D = create(PATH_LCL_DISABLED, "hierarchicalLayout.gif");
-
-	/**
-	 * WIZ
-	 */
-	public static final ImageDescriptor DESC_INSTALL_WIZ  = create(PATH_WIZBAN, "install_wiz.gif");
-	public static final ImageDescriptor DESC_UPDATE_WIZ  = create(PATH_WIZBAN, "update_wiz.gif");
-	public static final ImageDescriptor DESC_CONFIG_WIZ  = create(PATH_WIZBAN, "config_wiz.gif");
-	public static final ImageDescriptor DESC_UNINSTALL_WIZ  = create(PATH_WIZBAN, "uninstall_wiz.gif");
-	public static final ImageDescriptor DESC_INSTALL_BANNER  = create(PATH_WIZBAN, "def_wizban.jpg");
-	public static final ImageDescriptor DESC_FORM_BANNER  = create(PATH_FORMS, "form_banner.jpg");
-	public static final ImageDescriptor DESC_FORM_BANNER_SHORT  = create(PATH_FORMS, "form_banner.gif");
-	public static final ImageDescriptor DESC_FORM_UNDERLINE  = create(PATH_FORMS, "form_underline2.jpg");
-	public static final ImageDescriptor DESC_PROVIDER = create(PATH_FORMS, "def_provider.jpg");
-	public static final ImageDescriptor DESC_ITEM = create(PATH_FORMS, "topic.gif");
-	public static final ImageDescriptor DESC_NEW_BOOKMARK  = create(PATH_WIZBAN, "new_bookmark_wiz.gif");
-	public static final ImageDescriptor DESC_NEW_FOLDER  = create(PATH_WIZBAN, "new_folder_wiz.gif");
-	public static final ImageDescriptor DESC_NEW_SEARCH  = create(PATH_WIZBAN, "new_search_wiz.gif");
-
-	private static ImageDescriptor create(String prefix, String name) {
-		return ImageDescriptor.createFromURL(makeImageURL(prefix, name));
-	}
-
-
-	public static Image get(String key) {
-		if (PLUGIN_REGISTRY==null) initialize();
-		return PLUGIN_REGISTRY.get(key);
-	}
-
-
-public static ImageDescriptor getImageDescriptorFromPlugin(
-	IPluginDescriptor pluginDescriptor, 
-	String subdirectoryAndFilename) {
-	URL installURL = pluginDescriptor.getInstallURL();
-	try {
-		URL newURL = new URL(installURL, subdirectoryAndFilename);
-		return ImageDescriptor.createFromURL(newURL);
-	}
-	catch (MalformedURLException e) {
-	}
-	return null;
-}
-
-
-public static Image getImageFromPlugin(
-	IPluginDescriptor pluginDescriptor,
-	String subdirectoryAndFilename) {
-	URL installURL = pluginDescriptor.getInstallURL();
-	Image image = null;
-	try {
-		URL newURL = new URL(installURL, subdirectoryAndFilename);
-		String key = newURL.toString();
-		if (PLUGIN_REGISTRY==null) initialize();
-		image = PLUGIN_REGISTRY.get(key);
-		if (image==null) {
-			ImageDescriptor desc = ImageDescriptor.createFromURL(newURL);
-			image = desc.createImage();
-			PLUGIN_REGISTRY.put(key, image);
-		}
-	}
-	catch (MalformedURLException e) {
-	}
-	return image;
-}
-/* package */
-private static final void initialize() {
-	PLUGIN_REGISTRY = new ImageRegistry();
-	manage(IMG_FORM_BANNER_SHORT, DESC_FORM_BANNER_SHORT);
-	manage(IMG_FORM_BANNER, DESC_FORM_BANNER);
-	manage(IMG_FORM_UNDERLINE, DESC_FORM_UNDERLINE);
-}
-
-
-private static URL makeImageURL(String prefix, String name) {
-	String path = prefix + name;
-	URL url = null;
-	try {
-		url = new URL(BASE_URL, path);
-	}
-	catch (MalformedURLException e) {
-		return null;
-	}
-	return url;
-}
-
-public static Image manage(String key, ImageDescriptor desc) {
-	Image image = desc.createImage();
-	PLUGIN_REGISTRY.put(key, image);
-	return image;
-}
-
-public static URL getDefaultProviderImageURL() {
-	URL url = makeImageURL(PATH_FORMS, "def_provider.jpg");
-	try {
-		url = Platform.resolve(url);
-	}
-	catch (IOException e) {
-	}
-	return url; 
-}
-
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/WelcomePortalResources.properties b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/WelcomePortalResources.properties
deleted file mode 100644
index 491ee42..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/WelcomePortalResources.properties
+++ /dev/null
@@ -1,29 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2003 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials 
-# are made available under the terms of the Common Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# 
-#
-#
-
-BrowserPage.address = Address:
-BrowserPage.stop = Stop
-BrowserPage.go = Go
-BrowserPage.refresh = Refresh
-
-WebBrowserView.notAvailable = Embedded Web browser is not available. \
-Requiests for opening URLs are processed using Web browser registered to handle \
-Web pages on your system.
-WebBrowserView.address = Address:
-WebBrowserView.stop = Stop
-WebBrowserView.go = Go
-WebBrowserView.home = Go Home
-WebBrowserView.refresh = Refresh
-WebBrowserView.backward = Go Back
-WebBrowserView.forward = Go Forward
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/actions/TipsAndTricksContentProvider.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/actions/TipsAndTricksContentProvider.java
deleted file mode 100644
index 65b3b9a..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/actions/TipsAndTricksContentProvider.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Created on Jun 20, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.actions;
-
-import java.io.*;
-import java.util.ArrayList;
-
-import org.eclipse.ui.internal.*;
-import org.eclipse.welcome.internal.WelcomePortal;
-import org.eclipse.welcome.internal.portal.*;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class TipsAndTricksContentProvider implements IFormContentProvider {
-	private IFormContentObserver observer;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.welcome.internal.portal.IFormContentProvider#getContent()
-	 */
-	public String getContent() {
-		/*
-		// Ask the user to select a feature
-		AboutInfo[] features = ((Workbench) WelcomePortal.getDefault().getWorkbench()).getConfigurationInfo().getFeaturesInfo();
-		ArrayList welcomeFeatures = new ArrayList();
-		StringWriter swriter = new StringWriter();
-		PrintWriter writer = new PrintWriter(swriter);
-		writer.println("<form>");
-		for (int i = 0; i < features.length; i++) {
-			AboutInfo feature = features[i];
-			if (feature.getWelcomePageURL() != null) {
-				addFeatureLink(writer, feature);
-			}
-		}
-		writer.println("</form>");
-		writer.close();
-		return swriter.toString();
-		*/
-		return "<form></form>";
-	}
-
-	private void addFeatureLink(PrintWriter writer, AboutInfo feature) {
-		String name = feature.getFeatureLabel();
-		String href = feature.getTipsAndTricksHref();
-		if (href==null) return;
-		writer.print("<li>");
-		writer.print("<a href=\"help\" arg=\""+href+"\">"+name+"</a>");
-		writer.println("</li>");
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.welcome.internal.portal.IFormContentProvider#setContentObserver(org.eclipse.welcome.internal.portal.IFormContentObserver)
-	 */
-	public void setContentObserver(IFormContentObserver observer) {
-		this.observer = observer;
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/actions/WelcomeContentProvider.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/actions/WelcomeContentProvider.java
deleted file mode 100644
index 59c2d79..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/actions/WelcomeContentProvider.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Created on Jun 20, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.actions;
-
-import java.io.*;
-import java.net.URL;
-import java.util.ArrayList;
-
-import org.eclipse.ui.internal.*;
-import org.eclipse.welcome.internal.WelcomePortal;
-import org.eclipse.welcome.internal.portal.*;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WelcomeContentProvider implements IFormContentProvider {
-	private IFormContentObserver observer;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.welcome.internal.portal.IFormContentProvider#getContent()
-	 */
-	public String getContent() {
-		/*
-		// Ask the user to select a feature
-		AboutInfo[] features = ((Workbench) WelcomePortal.getDefault().getWorkbench()).getConfigurationInfo().getFeaturesInfo();
-		ArrayList welcomeFeatures = new ArrayList();
-		StringWriter swriter = new StringWriter();
-		PrintWriter writer = new PrintWriter(swriter);
-		writer.println("<form>");
-		for (int i = 0; i < features.length; i++) {
-			AboutInfo feature = features[i];
-			if (feature.getWelcomePageURL() != null) {
-				addFeatureLink(writer, feature);
-			}
-		}
-		writer.println("</form>");
-		/*
-
-		if (perspectiveId != null) {
-			try {
-				page = (WorkbenchPage) window.getWorkbench().showPerspective(perspectiveId, window);
-			} catch (WorkbenchException e) {
-				return;
-			}
-		}
-
-		page.setEditorAreaVisible(true);
-
-		// create input
-		WelcomeEditorInput input = new WelcomeEditorInput(feature);
-
-		// see if we already have a welcome editor
-		IEditorPart editor = page.findEditor(input);
-		if (editor != null) {
-			page.activate(editor);
-			return;
-		}
-
-		try {
-			page.openEditor(input, EDITOR_ID);
-		} catch (PartInitException e) {
-			IStatus status = new Status(IStatus.ERROR, WorkbenchPlugin.PI_WORKBENCH, 1, WorkbenchMessages.getString("QuickStartAction.openEditorException"), e); //$NON-NLS-1$
-			ErrorDialog.openError(
-				window.getShell(),
-				WorkbenchMessages.getString("Workbench.openEditorErrorDialogTitle"),  //$NON-NLS-1$
-				WorkbenchMessages.getString("Workbench.openEditorErrorDialogMessage"), //$NON-NLS-1$
-				status);
-		}
-		writer.close();
-		return swriter.toString();
-		*/
-		return "<form></form>";
-	}
-
-	private void addFeatureLink(PrintWriter writer, AboutInfo feature) {
-		String name = feature.getFeatureLabel();
-		URL welcomeURL = feature.getWelcomePageURL();
-		String action = "";
-		writer.print("<li>");
-		writer.print("<a href=\"action\">"+name+"</a>");
-		writer.println("</li>");
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.welcome.internal.portal.IFormContentProvider#setContentObserver(org.eclipse.welcome.internal.portal.IFormContentObserver)
-	 */
-	public void setContentObserver(IFormContentObserver observer) {
-		this.observer = observer;
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/HelpSection.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/HelpSection.java
deleted file mode 100644
index 393de2b..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/HelpSection.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Created on Jun 20, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.update.ui.forms.internal.*;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class HelpSection implements IPortalSectionForm {
-	private Text phraseText;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.welcome.internal.portal.IPortalSection#init(org.eclipse.update.ui.forms.internal.IFormPage)
-	 */
-	public void init(IFormPage page) {
-	}
-	
-	public void dispose() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.welcome.internal.portal.IPortalSection#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl(Composite parent, FormWidgetFactory factory) {
-		Composite container = factory.createComposite(parent);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		layout.marginWidth = 0;
-		container.setLayout(layout);
-		factory.createLabel(container, "Phrase:");
-		phraseText = factory.createText(container, "");
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		phraseText.setLayoutData(gd);
-		final Button button = factory.createButton(container, "Go", SWT.PUSH);
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				doSearch(phraseText.getText());
-			}
-		});
-		button.setEnabled(false);
-		phraseText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String text=phraseText.getText();
-				button.setEnabled(text.length()>0);
-			}
-		});
-		phraseText.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent e) {
-				if (e.character=='\r') {
-					if (button.isEnabled())
-						doSearch(phraseText.getText());
-				}
-			}
-		});
-		factory.paintBordersFor(container);
-		return container;
-	}
-	private void doSearch(String phrase) {
-		try {
-			String ephrase = URLEncoder.encode(phrase, "UTF-8");
-			String query = "tab=search&searchWord="+ephrase;
-			WorkbenchHelp.getHelpSupport().displayHelpResource(query);
-		}
-		catch (UnsupportedEncodingException e) {
-			System.out.println(e);
-		}
-	} 
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/IFormContentObserver.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/IFormContentObserver.java
deleted file mode 100644
index ba7801b..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/IFormContentObserver.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Created on Jun 20, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public interface IFormContentObserver {
-	public void contentChanged(IFormContentProvider provider);
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/IFormContentProvider.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/IFormContentProvider.java
deleted file mode 100644
index 15e85ee..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/IFormContentProvider.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Created on Jun 20, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public interface IFormContentProvider {
-	String getContent();
-	void setContentObserver(IFormContentObserver observer);
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/IPortalSectionForm.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/IPortalSectionForm.java
deleted file mode 100644
index a7d77a6..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/IPortalSectionForm.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Created on Jun 19, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.update.ui.forms.internal.*;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public interface IPortalSectionForm {
-	void init(IFormPage page);
-	Control createControl(Composite parent, FormWidgetFactory factory);
-	void dispose();
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/PortalSection.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/PortalSection.java
deleted file mode 100644
index b25eaa2..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/PortalSection.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Created on Jun 19, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-import java.io.*;
-import java.net.*;
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.action.*;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.update.ui.forms.internal.*;
-import org.eclipse.update.ui.forms.internal.engine.*;
-import org.eclipse.welcome.internal.WelcomePortal;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class PortalSection extends FormSection  {
-	private SectionDescriptor desc;
-	private WelcomePortalForm form;
-	private HyperlinkAction eclipseAction;
-	private HTTPAction httpAction;
-	private HyperlinkAction helpAction;
-	private Composite formContainer;
-	private Hashtable eclipseActions;
-
-	class ActionWrapper extends Action {
-		IActionDelegate delegate;
-
-		public ActionWrapper(String arg, IActionDelegate delegate) {
-			super(arg);
-			this.delegate = delegate;
-			if (delegate instanceof IWorkbenchWindowActionDelegate)
-				((IWorkbenchWindowActionDelegate) delegate).init(
-					WelcomePortal.getActiveWorkbenchWindow());
-		}
-		public void run() {
-			delegate.run(this);
-		}
-	}
-
-	public PortalSection(SectionDescriptor desc, WelcomePortalForm form) {
-		this.desc = desc;
-		this.form = form;
-		setDescriptionPainted(false);
-		setCollapsable(true);
-		setHeaderText(desc.getName());
-		makeHyperlinkActions();
-	}
-
-	private void makeHyperlinkActions() {
-		IActionBars bars =
-			form.getPortal().getEditor().getEditorSite().getActionBars();
-		httpAction = new HTTPAction() {
-			public void linkActivated(IHyperlinkSegment link) {
-				String url = link.getArg();
-				if (url != null)
-					WelcomePortal.showURL(link.getText(), url);
-			}
-		};
-		httpAction.setStatusLineManager(bars.getStatusLineManager());
-		eclipseAction = new HyperlinkAction() {
-			public void linkActivated(IHyperlinkSegment link) {
-				String arg = link.getArg();
-				if (arg != null)
-					runEclipseAction(arg);
-			}
-		};
-		eclipseAction.setStatusLineManager(bars.getStatusLineManager());
-		helpAction = new HyperlinkAction() {
-			public void linkActivated(IHyperlinkSegment link) {
-				String arg = link.getArg();
-				if (arg != null)
-					openEclipseHelp(arg);
-			}
-		};
-		helpAction.setStatusLineManager(bars.getStatusLineManager());
-	}
-	public Composite createClient(
-		Composite parent,
-		FormWidgetFactory factory) {
-		IConfigurationElement config = desc.getConfig();
-		formContainer = factory.createComposite(parent);
-		HTMLTableLayout layout = new HTMLTableLayout();
-		formContainer.setLayout(layout);
-		layout.topMargin = layout.bottomMargin = 0;
-		layout.leftMargin = layout.rightMargin = 0;
-		IConfigurationElement[] children = config.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			IConfigurationElement child = children[i];
-			if (child.getName().equals("form")) {
-				createForm(formContainer, child, factory);
-			}
-		}
-		return formContainer;
-	}
-
-	private void createForm(
-		final Composite parent,
-		IConfigurationElement config,
-		FormWidgetFactory factory) {
-		String type = config.getAttribute("type");
-		if (type != null && type.equals("custom")) {
-			createCustomForm(parent, config, factory);
-			return;
-		}
-		final FormEngine engine = factory.createFormEngine(parent);
-		//engine.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_CYAN));
-		engine.setHyperlinkSettings(factory.getHyperlinkHandler());
-		TableData td = new TableData(TableData.FILL, TableData.TOP);
-		td.grabHorizontal = true;
-		engine.setLayoutData(td);
-		engine.registerTextObject("url", httpAction);
-		engine.registerTextObject("action", eclipseAction);
-		engine.registerTextObject("help", helpAction);
-		if (type == null || type.equals("local")) {
-			String value = config.getValue();
-			engine.load("<form>" + value + "</form>", true, false);
-		} else if (type.equals("dynamic")) {
-			IFormContentProvider provider = createContentProvider(config);
-			if (provider!=null) {
-				engine.load(provider.getContent(), true, false);
-				provider.setContentObserver(new IFormContentObserver() {
-					public void contentChanged(IFormContentProvider provider) {
-						engine.load(provider.getContent(), true, false);
-						reflow();
-					}
-				});
-			}
-		} else if (type.equals("remote")) {
-			String urlName = config.getAttribute("url");
-			try {
-				final URL url = new URL(urlName);
-				Runnable loader = new Runnable() {
-					public void run() {
-						InputStream is = null;
-						try {
-							is = url.openStream();
-							engine.load(is, false);
-							parent.getDisplay().syncExec(new Runnable() {
-								public void run() {
-									reflow();
-								}
-							});
-						} catch (final IOException e) {
-							parent.getDisplay().syncExec(new Runnable() {
-								public void run() {
-									WelcomePortal.logException(e);
-								}
-							});
-
-						} finally {
-							try {
-								if (is != null)
-									is.close();
-							} catch (IOException e) {
-							}
-						}
-					}
-				};
-				Thread t = new Thread(loader);
-				t.start();
-			} catch (MalformedURLException e) {
-				WelcomePortal.logException(e);
-			}
-		}
-	}
-
-	private void createCustomForm(
-		Composite parent,
-		IConfigurationElement config,
-		FormWidgetFactory factory) {
-		try {
-			Object obj = config.createExecutableExtension("class");
-			if (obj instanceof IPortalSectionForm) {
-				IPortalSectionForm psection = (IPortalSectionForm) obj;
-				//psection.init(form.getPortal());
-				Control control = psection.createControl(parent, factory);
-				TableData td = new TableData(TableData.FILL, TableData.TOP);
-				td.grabHorizontal = true;
-				control.setLayoutData(td);
-			}
-		} catch (CoreException e) {
-			WelcomePortal.logException(e);
-		}
-	}
-	
-	private IFormContentProvider createContentProvider(IConfigurationElement config) {
-		try {
-			Object obj = config.createExecutableExtension("class");
-			if (obj instanceof IFormContentProvider) {
-				return (IFormContentProvider) obj;
-			}
-		} catch (CoreException e) {
-			WelcomePortal.logException(e);
-		}
-		return null;
-	}
-	protected void reflow() {
-		formContainer.layout();
-		super.reflow();
-		form.updateSize();
-	}
-
-	private void runEclipseAction(final String arg) {
-		BusyIndicator
-			.showWhile(form.getControl().getDisplay(), new Runnable() {
-			public void run() {
-				final IAction action = getEclipseAction(arg);
-				if (action != null)
-					action.run();
-			}
-		});
-	}
-
-	private IAction getEclipseAction(String arg) {
-		if (eclipseActions == null) {
-			eclipseActions = new Hashtable();
-		}
-		IAction action = (IAction) eclipseActions.get(arg);
-		if (action != null)
-			return action;
-		// load
-		int col = arg.indexOf(':');
-		String pluginId = arg.substring(0, col);
-		String className = arg.substring(col + 1);
-		IPluginDescriptor desc =
-			Platform.getPluginRegistry().getPluginDescriptor(pluginId);
-		if (desc == null) {
-			logActionLinkError(pluginId, className);
-			return null;
-		}
-		Class actionClass;
-		try {
-			actionClass = desc.getPluginClassLoader().loadClass(className);
-		} catch (ClassNotFoundException e) {
-			logActionLinkError(pluginId, className);
-			return null;
-		}
-		try {
-			Object obj = actionClass.newInstance();
-			if (obj instanceof IAction)
-				action = (IAction) obj;
-			else
-				action = new ActionWrapper(arg, (IActionDelegate) obj);
-		} catch (InstantiationException e) {
-			logActionLinkError(pluginId, className);
-			return null;
-		} catch (IllegalAccessException e) {
-			logActionLinkError(pluginId, className);
-			return null;
-		} catch (ClassCastException e) {
-			logActionLinkError(pluginId, className);
-			return null;
-		}
-		eclipseActions.put(arg, action);
-		return action;
-	}
-
-	private void logActionLinkError(String pluginId, String className) {
-		IStatus status =
-			new Status(
-				IStatus.ERROR,
-				WelcomePortal.getPluginId(),
-				IStatus.OK,
-				"Unable to load class "
-					+ className
-					+ " from plug-in "
-					+ pluginId
-					+ ".",
-				null);
-		WelcomePortal.log(status, true);
-	}
-	
-	private void openEclipseHelp(String arg) {
-		WorkbenchHelp.getHelpSupport().displayHelpResource(arg);
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/SectionDescriptor.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/SectionDescriptor.java
deleted file mode 100644
index 1f497b0..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/SectionDescriptor.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Created on Jun 19, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class SectionDescriptor {
-	private IConfigurationElement config;
-	
-	public SectionDescriptor(IConfigurationElement config) {
-		this.config = config;
-	}
-	
-	public String getId() {
-		return config.getAttribute("id");
-	}
-	
-	public String getName() {
-		return config.getAttribute("name");
-	}
-	public IConfigurationElement getConfig() {
-		return config;
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalEditor.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalEditor.java
deleted file mode 100644
index 23412e6..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalEditor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Created on Jun 19, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.*;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WelcomePortalEditor extends EditorPart {
-	private WelcomePortalPart welcomePart;
-	
-	public WelcomePortalEditor() {
-		welcomePart = new WelcomePortalPart(this);
-	}
-
-	public void dispose() {
-		if (welcomePart!=null)
-			welcomePart.dispose();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorPart#gotoMarker(org.eclipse.core.resources.IMarker)
-	 */
-	public void gotoMarker(IMarker marker) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-		throws PartInitException {
-		if (!(input instanceof WelcomePortalEditorInput))
-			throw new PartInitException("Invalid Input: Must be WelcomePortalEditorInput");
-		setSite(site);
-		setInput(input);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		welcomePart.createControl(parent);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalEditorInput.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalEditorInput.java
deleted file mode 100644
index 93f1f42..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalEditorInput.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal.portal;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.*;
-/**
- * A simple editor input for the welcome editor
- */
-public class WelcomePortalEditorInput implements IEditorInput {
-	private final static String FACTORY_ID = "org.eclipse.welcome.internal.portal.WelcomePortalEditorInputFactory"; //$NON-NLS-1$
-	/**
-	 * WelcomeEditorInput constructor comment.
-	 */
-	public WelcomePortalEditorInput() {
-	}
-	public boolean exists() {
-		return false;
-	}
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-	public ImageDescriptor getImageDescriptor() {
-		return null;
-	}
-	public String getName() {
-		return "Welcome";
-	}
-	public boolean equals(Object obj) {
-		if (obj==null) return false;
-		if (obj == this) return true;
-		if (obj instanceof WelcomePortalEditorInput) {
-			WelcomePortalEditorInput wobj = (WelcomePortalEditorInput)obj;
-			return true;
-		}
-		return false;
-	}
-	public IPersistableElement getPersistable() {
-		return new IPersistableElement() {
-			public String getFactoryId() {
-				return FACTORY_ID;
-			}
-			public void saveState(IMemento memento) {
-			}
-		};
-	}
-	public String getToolTipText() {
-		return getName();
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalEditorInputFactory.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalEditorInputFactory.java
deleted file mode 100644
index 30c76f3..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalEditorInputFactory.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.welcome.internal.portal;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.*;
-import org.eclipse.ui.IElementFactory;
-
-/**
- */
-public class WelcomePortalEditorInputFactory implements IElementFactory {
-	/**
-	 */
-	public WelcomePortalEditorInputFactory() {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IElementFactory#createElement(org.eclipse.ui.IMemento)
-	 */
-	public IAdaptable createElement(IMemento memento) {
-		return new WelcomePortalEditorInput();
-	}
-
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalForm.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalForm.java
deleted file mode 100644
index e4a44b0..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalForm.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Created on Jun 19, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.update.ui.forms.internal.*;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WelcomePortalForm extends WebForm {
-	private WelcomePortalPart portal;
-	private IConfigurationElement pageConfig;
-
-	public WelcomePortalForm(WelcomePortalPart portal, IConfigurationElement pageConfig) {
-		this.portal = portal;
-		this.pageConfig = pageConfig;
-		setHeadingVisible(false);
-	}
-	
-	public void initialize(Object model) {
-		update();
-	}
-	
-	public WelcomePortalPart getPortal() {
-		return portal;
-	}
-	
-	protected void createContents(Composite parent) {
-		HTMLTableLayout layout = new HTMLTableLayout();
-		parent.setLayout(layout);
-		layout.numColumns = getInteger(pageConfig, "numColumns", 1);
-		layout.topMargin = 0;
-		layout.leftMargin = layout.rightMargin = 10;
-		layout.horizontalSpacing=15;
-		layout.verticalSpacing = 5;
-		//parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_GREEN));
-		layout.makeColumnsEqualWidth=true;
-		SelectableFormLabel customize = getFactory().createSelectableLabel(parent, "Customize...");
-		getFactory().turnIntoHyperlink(customize, new HyperlinkAdapter() {
-			public void linkActivated(Control link) {
-			}
-		});
-		TableData td = new TableData();
-		td.align = TableData.CENTER;
-		td.colspan = layout.numColumns;
-		customize.setLayoutData(td);
-		
-		IConfigurationElement [] sectionRefs = pageConfig.getChildren("section");
-		for (int i=0; i<sectionRefs.length; i++) {
-			IConfigurationElement sectionRef = sectionRefs[i];
-			String id = sectionRef.getAttribute("id");
-			SectionDescriptor desc = portal.findSection(id);
-			if (desc==null) continue;
-			PortalSection section = new PortalSection(desc, this);
-			Control control = section.createControl(parent, getFactory());
-			int span = getInteger(sectionRef, "span", 1);
-			td = new TableData(TableData.FILL, TableData.TOP);
-			td.colspan = span;
-			td.grabHorizontal = true;
-			control.setLayoutData(td);
-			registerSection(section);
-		}
-	}
-
-	private int getInteger(IConfigurationElement config, String attName, int def) {
-		String value = config.getAttribute(attName);
-		if (value!=null) {
-			try {
-				return Integer.parseInt(value);
-			}
-			catch (NumberFormatException e) {
-			}
-		}
-		return def;
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalPage.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalPage.java
deleted file mode 100644
index f4334d1..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalPage.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Created on Jun 19, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.update.ui.forms.internal.*;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WelcomePortalPage implements IFormPage {
-	private Control control;
-	private String name;
-	private WelcomePortalPart portal;
-	private WelcomePortalForm form;
-	private IConfigurationElement config;
-	private SelectableFormLabel tab;
-	
-	public WelcomePortalPage(WelcomePortalPart portal, IConfigurationElement config) {
-		this.portal = portal;
-		this.form = new WelcomePortalForm(portal, config);
-		this.name = config.getAttribute("name");
-		this.config = config;
-	}
-	
-	public void setTab(SelectableFormLabel tab) {
-		this.tab = tab;
-	}
-	
-	public SelectableFormLabel getTab() {
-		return tab;
-	}
-
-	public boolean becomesInvisible(IFormPage newPage) {
-		return true;
-	}
-
-	public void becomesVisible(IFormPage previousPage) {
-	}
-
-	public void createControl(Composite parent) {
-		this.control = form.createControl(parent);
-		form.initialize(null);
-	}
-
-	public Control getControl() {
-		return control;
-	}
-
-	public String getLabel() {
-		return name;
-	}
-
-	public String getTitle() {
-		return name;
-	}
-
-	public boolean isSource() {
-		return false;
-	}
-
-	public boolean isVisible() {
-		return portal.isVisible(this);
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalPart.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalPart.java
deleted file mode 100644
index cd36701..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomePortalPart.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Created on Jun 19, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.update.ui.forms.internal.*;
-import org.eclipse.welcome.internal.WelcomePortal;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WelcomePortalPart {
-	private static final int TAB_PADDING = 5;
-	private Hashtable sectionDescriptors;
-	class TabListener implements IHyperlinkListener {
-		public void linkActivated(Control linkLabel) {
-			IFormPage page = (IFormPage) linkLabel.getData();
-			workbook.selectPage(page, false);
-		}
-
-		public void linkEntered(Control linkLabel) {
-		}
-
-		public void linkExited(Control linkLabel) {
-			if (linkLabel==selectedTab)
-				highlightTab(selectedTab, true);
-		}
-	}
-
-	private TabListener tabListener = new TabListener();
-	private Composite tabContainer;
-	private FormWidgetFactory factory;
-	private HyperlinkHandler hhandler;
-	private WelcomePortalEditor editor;
-	private Color tabColor;
-	private NoTabsWorkbook workbook;
-	private SelectableFormLabel selectedTab;
-
-	public WelcomePortalPart(WelcomePortalEditor editor) {
-		factory = new FormWidgetFactory();
-		hhandler = new HyperlinkHandler();
-		workbook = new NoTabsWorkbook();
-		this.editor = editor;
-	}
-	
-	public WelcomePortalEditor getEditor() {
-		return editor;
-	}
-
-	public void dispose() {
-		factory.dispose();
-		hhandler.dispose();
-	}
-	
-	public boolean isVisible(IFormPage page) {
-		return workbook.getCurrentPage().equals(page);
-	}
-
-	public void createControl(Composite parent) {
-		Composite container = factory.createComposite(parent);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = layout.marginHeight = 0;
-		layout.numColumns = 2;
-		layout.verticalSpacing = 0;
-		layout.horizontalSpacing = 0;
-		container.setLayout(layout);
-		createTitle(container);
-		createTabs(container);
-		workbook.createControl(container);
-		workbook.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-		workbook.addFormSelectionListener(new IFormSelectionListener() {
-			public void formSelected(IFormPage page, boolean setFocus) {
-				hightlightTab((WelcomePortalPage) page);
-			}
-		});
-		workbook.selectPage(workbook.getPages()[0], true);
-	}
-
-	private void createTitle(Composite parent) {
-		WelcomeTitleArea title = new WelcomeTitleArea(parent, SWT.NULL);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		title.setLayoutData(gd);
-		title.setText("Welcome");
-		title.setBackground(factory.getBackgroundColor());
-		title.setForeground(factory.getForegroundColor());
-		title.setFont(JFaceResources.getHeaderFont());
-	}
-
-	private void createTabs(Composite parent) {
-		tabContainer = factory.createComposite(parent);
-		tabContainer.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				Point size = tabContainer.getSize();
-				Rectangle tabBounds = selectedTab.getBounds();
-				GC gc = e.gc;
-				gc.setBackground(factory.getBackgroundColor());
-				gc.fillRectangle(0, tabBounds.y-TAB_PADDING, size.x, tabBounds.height+TAB_PADDING+TAB_PADDING);
-			}
-		});
-		tabColor =
-			factory.getColor(FormWidgetFactory.COLOR_COMPOSITE_SEPARATOR);
-		tabContainer.setBackground(tabColor);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = TAB_PADDING;
-		layout.verticalSpacing = TAB_PADDING + TAB_PADDING;
-		tabContainer.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_VERTICAL);
-		tabContainer.setLayoutData(gd);
-		hhandler.setBackground(tabColor);
-		hhandler.setForeground(factory.getBackgroundColor());
-		hhandler.setHyperlinkUnderlineMode(
-			HyperlinkSettings.UNDERLINE_ROLLOVER);
-		loadTabs(tabContainer);
-	}
-	
-	private void loadTabs(Composite parent) {
-		IConfigurationElement [] pages = Platform.getPluginRegistry().getConfigurationElementsFor(WelcomePortal.getPluginId(), "welcomePages");
-		for (int i=0; i<pages.length; i++) {
-			createTab(parent, pages[i]);
-		}
-	}
-
-	private void createTab(
-		Composite parent,
-		IConfigurationElement config) {
-		WelcomePortalPage page = new WelcomePortalPage(this, config);
-		SelectableFormLabel tab = factory.createSelectableLabel(parent, page.getTitle());
-		GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-		tab.setBackground(tabColor);
-		tab.setForeground(factory.getBackgroundColor());
-		hhandler.registerHyperlink(tab, tabListener);
-		tab.setFont(JFaceResources.getBannerFont());
-		tab.setLayoutData(gd);
-		tab.setData(page);
-		page.setTab(tab);
-		workbook.addPage(page);
-	}
-
-	private void hightlightTab(WelcomePortalPage page) {
-		if (selectedTab != null)
-			highlightTab(selectedTab, false);
-		SelectableFormLabel tab = page.getTab();
-		highlightTab(tab, true);
-		selectedTab = tab;
-		tabContainer.redraw();
-	}
-
-	private void highlightTab(SelectableFormLabel tab, boolean selected) {
-		Color bg = tabColor;
-		Color fg = factory.getBackgroundColor();
-		tab.setForeground(selected ? bg : fg);
-		tab.setBackground(selected ? fg : bg);
-	}
-
-	public SectionDescriptor findSection(String id) {
-		if (sectionDescriptors==null) {
-			sectionDescriptors=new Hashtable();
-			IConfigurationElement [] sections = Platform.getPluginRegistry().getConfigurationElementsFor(WelcomePortal.getPluginId(), "welcomeSections");
-			for (int i=0; i<sections.length; i++) {
-				SectionDescriptor desc = new SectionDescriptor(sections[i]);
-				sectionDescriptors.put(desc.getId(), desc);
-			}
-		}
-		return (SectionDescriptor)sectionDescriptors.get(id);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomeTitleArea.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomeTitleArea.java
deleted file mode 100644
index 8c60003..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/portal/WelcomeTitleArea.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Created on Jun 19, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.portal;
-
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.update.ui.forms.internal.FormLabel;
-import org.eclipse.welcome.internal.WelcomePortalImages;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WelcomeTitleArea extends FormLabel {
-	private Image topImage;
-	private Image bottomImage;
-
-	public WelcomeTitleArea(Composite parent, int style) {
-		super(parent, style);
-		topImage = WelcomePortalImages.get(WelcomePortalImages.IMG_FORM_BANNER);
-		bottomImage = WelcomePortalImages.get(WelcomePortalImages.IMG_FORM_UNDERLINE);
-	}
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		Point textSize = super.computeSize(wHint, hHint, changed);
-		int width = textSize.x;
-		int height = Math.max(textSize.y, topImage.getBounds().height);
-		height += bottomImage.getBounds().height;
-		return new Point(width, height);
-	}
-	protected void paint(PaintEvent e) {
-		GC gc = e.gc;
-		Rectangle bounds = getBounds();
-		gc.drawImage(topImage, bounds.x, bounds.y);
-		int y =	bounds.y + bounds.height - bottomImage.getBounds().height;
-		gc.drawImage(bottomImage, 0, y);
-		super.paint(e);
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/BrowserControlSite.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/BrowserControlSite.java
deleted file mode 100644
index 26b7024..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/BrowserControlSite.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal.webbrowser;
-
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.swt.ole.win32.*;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Needed for the OLE implementation
- */
-public class BrowserControlSite extends OleControlSite {
-
-	protected boolean beenBuilt = false;
-	protected boolean startedDownload = false;
-	// Web Browser
-	private WebBrowser browser;
-	private String presentationURL;
-	private IStatusLineManager statusLineManager;
-	private int workSoFar = 0;
-	private int prevMax = 0;
-
-	public void setStatusLineManager(IStatusLineManager manager) {
-		this.statusLineManager = manager;
-	}
-
-	void setBrowser(WebBrowser browser) {
-		this.browser = browser;
-	}
-
-	public String getPresentationURL() {
-		return presentationURL;
-	}
-
-	/**
-	 * BrowserControlSite constructor
-	 */
-	public BrowserControlSite(Composite parent, int style, String progId) {
-		super(parent, style, progId);
-
-		addEventListener(WebBrowser.DownloadBegin, new OleListener() {
-			public void handleEvent(OleEvent event) {
-				startedDownload = true;
-				//webProgress.setSelection(0);
-				prevMax = -1;
-			}
-		});
-
-		addEventListener(WebBrowser.DownloadComplete, new OleListener() {
-			public void handleEvent(OleEvent event) {
-				startedDownload = false;
-				//webProgress.setSelection(0);
-				if (statusLineManager != null)
-					statusLineManager.getProgressMonitor().done();
-				presentationURL = browser.getLocationURL();
-			}
-		});
-
-		addEventListener(WebBrowser.BeforeNavigate2, new OleListener() {
-			public void handleEvent(OleEvent event) {
-				//Variant urlVar = event.arguments[1];
-				//String strUrl = urlVar.getString();
-			}
-		});
-
-		// Respond to ProgressChange events by updating the Progress bar
-		addEventListener(WebBrowser.ProgressChange, new OleListener() {
-			public void handleEvent(OleEvent event) {
-				if (!startedDownload) {
-					return;
-				}
-
-				Variant progress = event.arguments[0];
-				Variant maxProgress = event.arguments[1];
-
-				if (progress == null || maxProgress == null || progress.getInt() == -1) {
-					return;
-				}
-				/*
-				if (maxProgress.getInt()!=100)
-				   webProgress.setMaximum(maxProgress.getInt());
-				*/
-				if (prevMax != maxProgress.getInt()) {
-					statusLineManager.getProgressMonitor().beginTask("", maxProgress.getInt());
-					prevMax = maxProgress.getInt();
-				}
-				//webProgress.setSelection(progress.getInt());
-				int newValue = progress.getInt();
-				int worked = newValue - workSoFar;
-				workSoFar = newValue;
-				if (statusLineManager != null)
-					statusLineManager.getProgressMonitor().worked(worked);
-			}
-		});
-
-		addEventListener(WebBrowser.StatusTextChange, new OleListener() {
-			public void handleEvent(OleEvent event) {
-				Variant newText = event.arguments[0];
-				String msg = newText.getString();
-
-				if (msg != null) {
-					if (statusLineManager != null)
-						statusLineManager.setMessage(msg);
-				} else {
-					if (statusLineManager != null)
-						statusLineManager.setMessage("");
-				}
-			}
-		});
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/GlobalActionHandler.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/GlobalActionHandler.java
deleted file mode 100644
index efb3c23..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/GlobalActionHandler.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal.webbrowser;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.ui.*;
-import org.eclipse.ui.IWorkbenchActionConstants;
-
-/**
- *
- */
-public class GlobalActionHandler {
-	private boolean active = false;
-	private Combo combo;
-	private ControlListener controlListener;
-
-	private class ControlListener implements Listener {
-		public void handleEvent(Event event) {
-			switch (event.type) {
-				case SWT.Activate :
-					active = true;
-					updateActionsEnableState();
-					break;
-				case SWT.Deactivate :
-					active = false;
-					updateActionsEnableState();
-					break;
-				default :
-					break;
-			}
-		}
-	}
-
-	private class GlobalAction extends Action {
-		private String id;
-
-		public GlobalAction(String id) {
-			this.id = id;
-		}
-
-		public void run() {
-			doGlobalAction(id);
-		}
-	}
-
-	private GlobalAction cutAction;
-	private GlobalAction copyAction;
-	private GlobalAction pasteAction;
-	private GlobalAction deleteAction;
-	private GlobalAction selectAllAction;
-	private GlobalAction undoAction;
-
-	public GlobalActionHandler(IActionBars actionBar, Combo combo) {
-		this.combo = combo;
-		makeActions();
-		actionBar.setGlobalActionHandler(
-			IWorkbenchActionConstants.CUT,
-			cutAction);
-		actionBar.setGlobalActionHandler(
-			IWorkbenchActionConstants.COPY,
-			copyAction);
-		actionBar.setGlobalActionHandler(
-			IWorkbenchActionConstants.PASTE,
-			pasteAction);
-		actionBar.setGlobalActionHandler(
-			IWorkbenchActionConstants.DELETE,
-			deleteAction);
-		actionBar.setGlobalActionHandler(
-			IWorkbenchActionConstants.SELECT_ALL,
-			selectAllAction);
-		actionBar.setGlobalActionHandler(
-			IWorkbenchActionConstants.UNDO,
-			undoAction);
-		controlListener = new ControlListener();
-		combo.addListener(SWT.Activate, controlListener);
-		combo.addListener(SWT.Deactivate, controlListener);
-	}
-
-	public void dispose() {
-		if (!combo.isDisposed()) {
-			combo.removeListener(SWT.Activate, controlListener);
-			combo.removeListener(SWT.Deactivate, controlListener);
-		}
-	}
-
-	private void makeActions() {
-		cutAction = new GlobalAction(IWorkbenchActionConstants.CUT);
-		copyAction = new GlobalAction(IWorkbenchActionConstants.COPY);
-		pasteAction = new GlobalAction(IWorkbenchActionConstants.PASTE);
-		deleteAction = new GlobalAction(IWorkbenchActionConstants.DELETE);
-		selectAllAction =
-			new GlobalAction(IWorkbenchActionConstants.SELECT_ALL);
-		undoAction = new GlobalAction(IWorkbenchActionConstants.UNDO);
-	}
-
-	private void updateActionsEnableState() {
-		if (!active) {
-			cutAction.setEnabled(false);
-			copyAction.setEnabled(false);
-			pasteAction.setEnabled(false);
-			deleteAction.setEnabled(false);
-			selectAllAction.setEnabled(false);
-			undoAction.setEnabled(false);
-		} else {
-			cutAction.setEnabled(true);
-			copyAction.setEnabled(true);
-			pasteAction.setEnabled(true);
-			deleteAction.setEnabled(true);
-			selectAllAction.setEnabled(true);
-			undoAction.setEnabled(true);
-		}
-	}
-
-	private void doGlobalAction(String id) {
-		if (id.equals(IWorkbenchActionConstants.CUT))
-			combo.cut();
-		else if (id.equals(IWorkbenchActionConstants.COPY))
-			combo.copy();
-		else if (id.equals(IWorkbenchActionConstants.PASTE))
-			combo.paste();
-		else if (id.equals(IWorkbenchActionConstants.DELETE))
-			doDelete();
-		else if (id.equals(IWorkbenchActionConstants.SELECT_ALL))
-			doSelectAll();
-	}
-
-	private void doDelete() {
-		String text = combo.getText();
-		Point selection = combo.getSelection();
-		if (selection.x == selection.y)
-			return;
-		String left = text.substring(0, selection.x);
-		String right = text.substring(selection.y + 1);
-		combo.setText(left + right);
-	}
-
-	private void doSelectAll() {
-		String text = combo.getText();
-		Point newSelection = new Point(0, text.length());
-		combo.setSelection(newSelection);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/IEmbeddedWebBrowser.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/IEmbeddedWebBrowser.java
deleted file mode 100644
index 7a914b4..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/IEmbeddedWebBrowser.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal.webbrowser;
-
-public interface IEmbeddedWebBrowser {
-	public void openTo(String url);
-	public void setListener(IWebBrowserListener listener);
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/IWebBrowserListener.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/IWebBrowserListener.java
deleted file mode 100644
index 2d34243..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/IWebBrowserListener.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Created on Jun 18, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.webbrowser;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public interface IWebBrowserListener {
-	void stateChanged();
-
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowser.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowser.java
deleted file mode 100644
index 18ec8cf..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowser.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal.webbrowser;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.ole.win32.*;
-import org.eclipse.swt.widgets.*;
-
-/**
- * ActiveX based web browser control.
- */
-public class WebBrowser implements OleListener {
-	// Generated from typelib filename: shdocvw.dll
-
-	// Constants for WebBrowser CommandStateChange
-
-	public static final short CSC_UPDATECOMMANDS = -1;
-	public static final short CSC_NAVIGATEFORWARD = 1;
-	public static final short CSC_NAVIGATEBACK = 2;
-
-	// Web Browser Control Events 
-	public static final int BeforeNavigate = 100;
-	// Fired when a new hyperlink is being navigated to.
-	public static final int NavigateComplete = 101;
-	// Fired when the document being navigated to becomes visible and enters the navigation stack.
-	public static final int StatusTextChange = 102;
-	// Statusbar text changed.
-	public static final int ProgressChange = 108;
-	// Fired when download progress is updated.
-	public static final int DownloadComplete = 104;
-	// Download of page complete.
-	public static final int CommandStateChange = 105;
-	// The enabled state of a command changed
-	public static final int DownloadBegin = 106;
-	// Download of a page started.
-	public static final int NewWindow = 107;
-	// Fired when a new window should be created.
-	public static final int TitleChange = 113;
-	// Document title changed.
-	public static final int FrameBeforeNavigate = 200;
-	// Fired when a new hyperlink is being navigated to in a frame.
-	public static final int FrameNavigateComplete = 201;
-	// Fired when a new hyperlink is being navigated to in a frame.
-	public static final int FrameNewWindow = 204;
-	// Fired when a new window should be created.
-	public static final int Quit = 103;
-	// Fired when application is quiting.
-	public static final int WindowMove = 109;
-	// Fired when window has been moved.
-	public static final int WindowResize = 110;
-	// Fired when window has been sized.
-	public static final int WindowActivate = 111;
-	// Fired when window has been activated.
-	public static final int PropertyChange = 112;
-	// Fired when the PutProperty method has been called.
-	public static final int BeforeNavigate2 = 250;
-	// Fired when a new hyperlink is being navigated to.
-	public static final int NewWindow2 = 251;
-	// Fired when a new window should be created.
-	public static final int DocumentComplete = 259;
-	// Fired when the document being navigated to reaches ReadyState_Complete.
-
-	// Web Browser properties
-	public static final int DISPID_READYSTATE = -525;
-
-	// Web Browser state
-	public static final int READYSTATE_UNINITIALIZED = 0;
-	public static final int READYSTATE_LOADING = 1;
-	public static final int READYSTATE_LOADED = 2;
-	public static final int READYSTATE_INTERACTIVE = 3;
-	public static final int READYSTATE_COMPLETE = 4;
-
-	// Keep track of the whether it is possible to navigate in the forward and backward directions
-	private boolean backwardEnabled;
-	private boolean forwardEnabled;
-
-	// The automation object and Control associated with the main OLE control
-	private OleAutomation oleObject;
-	private BrowserControlSite controlSite;
-
-	// The OLE frame (there should only be one)
-	private OleFrame controlFrame;
-
-	//private NestedPrintDelegate aPrintDelegate = null;
-
-	/**
-	 */
-	public WebBrowser(Composite parent) {
-
-		// Create the OLE frame. 
-		controlFrame = createOleFrame(parent);
-
-		// Creates the IE5 OLE Control
-		// The constructor also registers all the necessary OLE listeners.
-		// for now, only catch the execption if creating and activating the 
-		// control fails. No checking if the correct version of the OLE control 
-		// is installed.
-		try {
-			controlSite =
-				new BrowserControlSite(
-					controlFrame,
-					SWT.NONE,
-					"Shell.Explorer");
-			controlSite.setBrowser(this);
-			oleObject = new OleAutomation(controlSite);
-
-			backwardEnabled = false;
-			forwardEnabled = false;
-
-			// Listen for changes to the Command States
-			controlSite.addEventListener(CommandStateChange, this);
-
-			// initialize control
-			controlSite.doVerb(OLE.OLEIVERB_SHOW);
-
-			// create print Delegate (has to be done early, here!).
-			//aPrintDelegate = new NestedPrintDelegate(this, oleObject, controlSite);
-
-		} catch (Exception e) {
-			String id = "org.eclipse.update.ui.win32";
-			IStatus status =
-				new Status(IStatus.ERROR, id, IStatus.OK, e.getMessage(), e);
-			Platform.getPlugin("org.eclipse.core.runtime").getLog().log(status);
-		}
-	}
-	/**
-	 */
-	public int back() {
-
-		if (!backwardEnabled)
-			return OLE.S_FALSE;
-		forwardEnabled = true;
-
-		// dispid=100, type=METHOD, name="GoBack"
-
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember = 100;
-
-		// Alternatively, you can look up the DISPID dynamically
-		int[] rgdispid = oleObject.getIDsOfNames(new String[] { "GoBack" });
-		int dispIdMember = rgdispid[0];
-
-		Variant pVarResult = oleObject.invoke(dispIdMember);
-
-		if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY)
-			return 0;
-		return pVarResult.getInt();
-	}
-	/**
-	 */
-	public int copy() {
-		int result = controlSite.queryStatus(OLE.OLECMDID_COPY);
-		if ((result & OLE.OLECMDF_ENABLED) == OLE.OLECMDF_ENABLED) {
-			result =
-				controlSite.exec(
-					OLE.OLECMDID_COPY,
-					OLE.OLECMDEXECOPT_DODEFAULT,
-					null,
-					null);
-		}
-		return result;
-	}
-	protected OleFrame createOleFrame(Composite parent) {
-		if (controlFrame == null) {
-			controlFrame = new OleFrame(parent, SWT.NONE);
-			controlFrame.setLayoutData(
-				new GridData(
-					GridData.GRAB_HORIZONTAL
-						| GridData.GRAB_VERTICAL
-						| GridData.HORIZONTAL_ALIGN_FILL
-						| GridData.VERTICAL_ALIGN_FILL));
-		}
-		return controlFrame;
-
-	}
-	/**
-	 * clean up
-	 */
-	public void dispose() {
-		//** clean up
-		if (oleObject != null)
-			oleObject.dispose();
-		oleObject = null;
-
-		if (controlSite != null)
-			controlSite.dispose();
-		controlSite = null;
-
-		if (controlFrame != null)
-			controlFrame.dispose();
-		controlFrame = null;
-
-	}
-	/**
-	 */
-	public int forward() {
-		if (!forwardEnabled)
-			return OLE.S_FALSE;
-		backwardEnabled = true;
-		// dispid=101, type=METHOD, name="GoForward"
-
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember = 101;
-
-		// Alternatively, you can look up the DISPID dynamically
-		int[] rgdispid = oleObject.getIDsOfNames(new String[] { "GoForward" });
-		int dispIdMember = rgdispid[0];
-
-		Variant pVarResult = oleObject.invoke(dispIdMember);
-		if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY)
-			return 0;
-		return pVarResult.getInt();
-	}
-	public Control getControl() {
-		return controlFrame;
-	}
-	/**
-	 */
-	public String getLocationName() {
-		// dispid=210, type=PROPGET, name="LocationName"
-
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember = 210;
-
-		// Alternatively, you can look up the DISPID dynamically
-		int[] rgdispid =
-			oleObject.getIDsOfNames(new String[] { "LocationName" });
-		int dispIdMember = rgdispid[0];
-		Variant pVarResult = oleObject.getProperty(dispIdMember);
-		if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY)
-			return null;
-		return pVarResult.getString();
-	}
-	/**
-	 */
-	public String getLocationURL() {
-		// dispid=211, type=PROPGET, name="LocationURL"
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember = 211;
-
-		// Alternatively, you can look up the DISPID dynamically
-		int[] rgdispid =
-			oleObject.getIDsOfNames(new String[] { "LocationURL" });
-		int dispIdMember = rgdispid[0];
-
-		Variant pVarResult = oleObject.getProperty(dispIdMember);
-		if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY)
-			return null;
-		return pVarResult.getString();
-	}
-	protected OleFrame getOleFrame() {
-		return controlFrame;
-
-	}
-
-	public BrowserControlSite getControlSite() {
-		return controlSite;
-	}
-	/**
-	 */
-	public int getReadyState() {
-		// dispid=4294966771, type=PROPGET, name="ReadyState"
-		// READYSTATE_UNINITIALIZED = 0;
-		// READYSTATE_LOADING = 1;
-		// READYSTATE_LOADED = 2;
-		// READYSTATE_INTERACTIVE = 3;
-		// READYSTATE_COMPLETE = 4;
-
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember = -525;
-
-		// Alternatively, you can look up the DISPID dynamically
-		int[] rgdispid = oleObject.getIDsOfNames(new String[] { "ReadyState" });
-		int dispIdMember = rgdispid[0];
-
-		Variant pVarResult = oleObject.getProperty(dispIdMember);
-		if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY)
-			return -1;
-		return pVarResult.getInt();
-	}
-	/**
-	 */
-	public void handleEvent(OleEvent event) {
-		switch (event.type) {
-			case (CommandStateChange) :
-				int command = 0;
-				boolean enabled = false;
-
-				Variant varResult = event.arguments[0];
-				if (varResult != null && varResult.getType() != OLE.VT_EMPTY) {
-					command = varResult.getInt();
-				}
-
-				varResult = event.arguments[1];
-				if (varResult != null && varResult.getType() != OLE.VT_EMPTY) {
-					enabled = varResult.getBoolean();
-				}
-
-				if (command == CSC_NAVIGATEBACK)
-					backwardEnabled = enabled;
-				if (command == CSC_NAVIGATEFORWARD)
-					forwardEnabled = enabled;
-
-				return;
-
-			case (DocumentComplete) :
-				varResult = event.arguments[0];
-				return;
-		}
-		//throw new OleError(OLE.ERROR_NOT_IMPLEMENTED);
-	}
-	/**
-	 */
-	public int home() {
-		// dispid=102, type=METHOD, name="GoHome"
-
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember = 102;
-
-		// Alternatively, you can look up the DISPID dynamically
-		int[] rgdispid = oleObject.getIDsOfNames(new String[] { "GoHome" });
-		int dispIdMember = rgdispid[0];
-
-		Variant pVarResult = oleObject.invoke(dispIdMember);
-		if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY)
-			return 0;
-		return pVarResult.getInt();
-	}
-	/**
-	 */
-	public int navigate(String url) {
-		return navigate(oleObject, url);
-	}
-	/**
-	 */
-	protected int navigate(OleAutomation aOleAutomation, String url) {
-		//if (Logger.DEBUG)
-		//Logger.logDebugMessage("WebBrowser", "navigate to: " + url);
-		// dispid=104, type=METHOD, name="Navigate"
-
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember = 104;
-
-		// Alternatively, you can look up the DISPID dynamically
-		// Here we are looking up the id of the argument as well
-		int[] rgdispid =
-			aOleAutomation.getIDsOfNames(new String[] { "Navigate", "URL" });
-		int dispIdMember = rgdispid[0];
-
-		Variant[] rgvarg = new Variant[1];
-		rgvarg[0] = new Variant(url);
-		int[] rgdispidNamedArgs = new int[1];
-		rgdispidNamedArgs[0] = rgdispid[1]; // identifier of argument
-		Variant pVarResult =
-			aOleAutomation.invoke(dispIdMember, rgvarg, rgdispidNamedArgs);
-		if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY)
-			return 0;
-		return pVarResult.getInt();
-
-	}
-	/**
-	 */
-	public int print() {
-		return print(controlSite, true);
-	}
-	/**
-	 */
-	protected int print(BrowserControlSite aControlSite, boolean promptuser) {
-
-		int result = aControlSite.queryStatus(OLE.OLECMDID_PRINT);
-
-		if ((result & OLE.OLECMDF_ENABLED) == OLE.OLECMDF_ENABLED) {
-			if (promptuser)
-				result =
-					aControlSite.exec(
-						OLE.OLECMDID_PRINT,
-						OLE.OLECMDEXECOPT_PROMPTUSER,
-						null,
-						null);
-			else
-				result =
-					aControlSite.exec(
-						OLE.OLECMDID_PRINT,
-						OLE.OLECMDEXECOPT_DONTPROMPTUSER,
-						null,
-						null);
-		}
-
-		//if (Logger.DEBUG)
-		//Logger.logDebugMessage("WebBrowser", "exec returns: " + Integer.toString(result));
-		return result;
-	}
-
-	/**
-	 * Refresh the currently viewed page.
-	 */
-	public void refresh() {
-
-		// dispid= 4294966746, type=METHOD, name="Refresh"
-
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember =  4294966746;
-
-		// Alternatively, you can look up the DISPID dynamically
-		int[] rgdispid = oleObject.getIDsOfNames(new String[] { "Refresh" });
-		int dispIdMember = rgdispid[0];
-
-		oleObject.invokeNoReply(dispIdMember);
-	}
-	/**
-	 */
-	public int search() {
-		// dispid=103, type=METHOD, name="GoSearch"
-
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember = 103;
-
-		// Alternatively, you can look up the DISPID dynamically
-		int[] rgdispid = oleObject.getIDsOfNames(new String[] { "GoSearch" });
-		int dispIdMember = rgdispid[0];
-
-		Variant pVarResult = oleObject.invoke(dispIdMember);
-		if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY)
-			return 0;
-		return pVarResult.getInt();
-	}
-	/**
-	 */
-	public void stop() {
-		// dispid=106, type=METHOD, name="Stop"
-
-		// You can hard code the DISPID if you know it before hand - this is of course the fastest way
-		//int dispIdMember = 106;
-
-		// Alternatively, you can look up the DISPID dynamically
-		int[] rgdispid = oleObject.getIDsOfNames(new String[] { "Stop" });
-		int dispIdMember = rgdispid[0];
-
-		//Variant pVarResult = oleObject.invoke(dispIdMember);
-		oleObject.invoke(dispIdMember);
-	}
-	/**
-	 * Gets the forwardEnabled
-	 * @return Returns a boolean
-	 */
-	public boolean isForwardEnabled() {
-		return forwardEnabled;
-	}
-
-	/**
-	 * Gets the backwardEnabled
-	 * @return Returns a boolean
-	 */
-	public boolean isBackwardEnabled() {
-		return backwardEnabled;
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditor.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditor.java
deleted file mode 100644
index 1a7402c..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditor.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal.webbrowser;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.ole.win32.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.welcome.internal.*;
-
-public class WebBrowserEditor extends EditorPart implements IEmbeddedWebBrowser {
-	// NL
-	private static final String KEY_NOT_AVAILABLE =
-		"WebBrowserView.notAvailable";
-	private static final String KEY_ADDRESS = "WebBrowserView.address";
-	private static final String KEY_STOP = "WebBrowserView.stop";
-	private static final String KEY_GO = "WebBrowserView.go";
-	private static final String KEY_REFRESH = "WebBrowserView.refresh";
-	private static final String KEY_BACKWARD = "WebBrowserView.backward";
-	private static final String KEY_FORWARD = "WebBrowserView.forward";
-
-	private int ADDRESS_SIZE = 10;
-	private WebBrowser browser;
-	private Control control;
-	private Combo addressCombo;
-	private Object input;
-	private ToolBarManager toolBarManager;
-	private Action refreshAction;
-	private Action stopAction;
-	private Action goAction;
-	private GlobalActionHandler globalActionHandler;
-	private IWebBrowserListener listener;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorPart#gotoMarker(org.eclipse.core.resources.IMarker)
-	 */
-	public void gotoMarker(IMarker marker) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-		throws PartInitException {
-		if (!(input instanceof WebBrowserEditorInput))
-			throw new PartInitException("Invalid Input: Must be WelcomeEditorInput");
-		setSite(site);
-		setInput(input);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	public WebBrowserEditor() {
-	}
-
-	/**
-	 * @see IFormPage#createControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		control = container;
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		layout.verticalSpacing = 0;
-		container.setLayout(layout);
-
-		Composite navContainer = new Composite(container, SWT.NONE);
-		layout = new GridLayout();
-		layout.numColumns = 3;
-		layout.marginHeight = 1;
-		navContainer.setLayout(layout);
-		createNavBar(navContainer);
-		navContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final WebBrowser winBrowser = new WebBrowser(container);
-		browser = winBrowser;
-
-		Control c = browser.getControl();
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));
-		final BrowserControlSite site = winBrowser.getControlSite();
-		IStatusLineManager smng =
-			getEditorSite().getActionBars().getStatusLineManager();
-		site.setStatusLineManager(smng);
-
-		site.addEventListener(WebBrowser.DownloadComplete, new OleListener() {
-			public void handleEvent(OleEvent event) {
-				String url = winBrowser.getLocationURL();
-				if (url != null) {
-					addressCombo.setText(url);
-					downloadComplete(url);
-				}
-			}
-		});
-		site.addEventListener(WebBrowser.DownloadBegin, new OleListener() {
-			public void handleEvent(OleEvent event) {
-				stopAction.setEnabled(true);
-				refreshAction.setEnabled(false);
-			}
-		});
-		WorkbenchHelp.setHelp(container, "org.eclipse.update.ui.WebBrowserView");
-		WebBrowserEditorInput input = (WebBrowserEditorInput)getEditorInput();
-		openTo(input.getURL());
-	}
-
-	public void openTo(final String url) {
-		addressCombo.setText(url);
-		control.getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				navigate(url);
-			}
-		});
-	}
-
-	private void downloadComplete(String url) {
-		stopAction.setEnabled(false);
-		refreshAction.setEnabled(true);
-		if (listener!=null)
-			listener.stateChanged();
-	}
-	
-	public void setListener(IWebBrowserListener listener) {
-		this.listener = listener;
-	}
-
-	private void createNavBar(Composite parent) {
-		Label addressLabel = new Label(parent, SWT.NONE);
-		addressLabel.setText(WelcomePortal.getString(KEY_ADDRESS));
-
-		addressCombo = new Combo(parent, SWT.DROP_DOWN | SWT.BORDER);
-		addressCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String text = addressCombo.getText();
-				goAction.setEnabled(text.length() > 0);
-			}
-		});
-		addressCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				String text =
-					addressCombo.getItem(addressCombo.getSelectionIndex());
-				if (text.length() > 0)
-					navigate(text);
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-				navigate(addressCombo.getText());
-			}
-		});
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		addressCombo.setLayoutData(gd);
-		ToolBar toolbar = new ToolBar(parent, SWT.FLAT | SWT.HORIZONTAL);
-		toolBarManager = new ToolBarManager(toolbar);
-		makeActions();
-		IActionBars bars = getEditorSite().getActionBars();
-		globalActionHandler = new GlobalActionHandler(bars, addressCombo);
-	}
-
-	private void navigate(String url) {
-		browser.navigate(url);
-		String[] items = addressCombo.getItems();
-		int loc = -1;
-		String normURL = getNormalizedURL(url);
-		for (int i = 0; i < items.length; i++) {
-			String normItem = getNormalizedURL(items[i]);
-			if (normURL.equals(normItem)) {
-				// match 
-				loc = i;
-				break;
-			}
-		}
-		if (loc != -1) {
-			addressCombo.remove(loc);
-		}
-		addressCombo.add(url, 0);
-		if (addressCombo.getItemCount() > ADDRESS_SIZE) {
-			addressCombo.remove(addressCombo.getItemCount() - 1);
-		}
-		addressCombo.getParent().layout(true);
-	}
-	
-	void back() {
-		browser.back();
-	}
-	void forward() {
-		browser.forward();
-	}
-	boolean isBackwardEnabled() {
-		return browser.isBackwardEnabled();
-	}
-	boolean isForwardEnabled() {
-		return browser.isForwardEnabled();
-	}
-
-	private void makeActions() {
-		goAction = new Action() {
-			public void run() {
-				navigate(addressCombo.getText());
-			}
-		};
-		goAction.setEnabled(false);
-		goAction.setToolTipText(WelcomePortal.getString(KEY_GO));
-		goAction.setImageDescriptor(WelcomePortalImages.DESC_GO_NAV);
-		goAction.setDisabledImageDescriptor(WelcomePortalImages.DESC_GO_NAV_D);
-		goAction.setHoverImageDescriptor(WelcomePortalImages.DESC_GO_NAV_H);
-
-		stopAction = new Action() {
-			public void run() {
-				browser.stop();
-			}
-		};
-		stopAction.setToolTipText(WelcomePortal.getString(KEY_STOP));
-		stopAction.setImageDescriptor(WelcomePortalImages.DESC_STOP_NAV);
-		stopAction.setDisabledImageDescriptor(
-			WelcomePortalImages.DESC_STOP_NAV_D);
-		stopAction.setHoverImageDescriptor(
-			WelcomePortalImages.DESC_STOP_NAV_H);
-		stopAction.setEnabled(false);
-
-		refreshAction = new Action() {
-			public void run() {
-				browser.refresh();
-			}
-		};
-		refreshAction.setToolTipText(
-			WelcomePortal.getString(KEY_REFRESH));
-		refreshAction.setImageDescriptor(WelcomePortalImages.DESC_REFRESH_NAV);
-		refreshAction.setDisabledImageDescriptor(
-			WelcomePortalImages.DESC_REFRESH_NAV_D);
-		refreshAction.setHoverImageDescriptor(
-			WelcomePortalImages.DESC_REFRESH_NAV_H);
-		refreshAction.setEnabled(false);
-
-		toolBarManager.add(goAction);
-		toolBarManager.add(new Separator());
-		toolBarManager.add(stopAction);
-		toolBarManager.add(refreshAction);
-		toolBarManager.update(true);
-	}
-
-	private String getNormalizedURL(String url) {
-		url = url.toLowerCase();
-		if (url.indexOf("://") == -1) {
-			url = "http://" + url;
-		}
-		return url;
-	}
-
-	public void dispose() {
-		if (browser != null)
-			browser.dispose();
-		globalActionHandler.dispose();
-		super.dispose();
-	}
-
-	public void setFocus() {
-		if (control != null)
-			control.setFocus();
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditorContributor.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditorContributor.java
deleted file mode 100644
index 54b9039..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditorContributor.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Created on Jun 18, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-package org.eclipse.welcome.internal.webbrowser;
-
-import org.eclipse.jface.action.*;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.welcome.internal.*;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
-public class WebBrowserEditorContributor
-	extends EditorActionBarContributor
-	implements IWebBrowserListener {
-	private static final String KEY_NOT_AVAILABLE =
-		"WebBrowserView.notAvailable";
-	private static final String KEY_HOME = "WebBrowserView.home";
-	private static final String KEY_BACKWARD = "WebBrowserView.backward";
-	private static final String KEY_FORWARD = "WebBrowserView.forward";
-
-	private Action homeAction;
-	private Action backwardAction;
-	private Action forwardAction;
-	private WebBrowserEditor editor;
-	
-	public WebBrowserEditorContributor() {
-		makeActions();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.welcome.internal.IWebBrowserListener#stateChanged()
-	 */
-	public void stateChanged() {
-		updateActions();
-	}
-
-	private void makeActions() {
-		homeAction = new Action() {
-			public void run() {
-				WebBrowserEditorInput input = (WebBrowserEditorInput)editor.getEditorInput();
-				editor.openTo(input.getURL());
-			}
-		};
-		homeAction.setEnabled(true);
-		homeAction.setToolTipText(WelcomePortal.getString(KEY_HOME));
-		homeAction.setImageDescriptor(
-			WelcomePortalImages.DESC_HOME_NAV);
-		homeAction.setDisabledImageDescriptor(
-			WelcomePortalImages.DESC_HOME_NAV_D);
-		homeAction.setHoverImageDescriptor(
-			WelcomePortalImages.DESC_HOME_NAV_H);
-
-
-		backwardAction = new Action() {
-			public void run() {
-				editor.back();
-			}
-		};
-		backwardAction.setEnabled(false);
-		backwardAction.setToolTipText(WelcomePortal.getString(KEY_BACKWARD));
-		backwardAction.setImageDescriptor(
-			WelcomePortalImages.DESC_BACKWARD_NAV);
-		backwardAction.setDisabledImageDescriptor(
-			WelcomePortalImages.DESC_BACKWARD_NAV_D);
-		backwardAction.setHoverImageDescriptor(
-			WelcomePortalImages.DESC_BACKWARD_NAV_H);
-
-		forwardAction = new Action() {
-			public void run() {
-				editor.forward();
-			}
-		};
-		forwardAction.setToolTipText(WelcomePortal.getString(KEY_FORWARD));
-		forwardAction.setImageDescriptor(WelcomePortalImages.DESC_FORWARD_NAV);
-		forwardAction.setDisabledImageDescriptor(
-			WelcomePortalImages.DESC_FORWARD_NAV_D);
-		forwardAction.setHoverImageDescriptor(
-			WelcomePortalImages.DESC_FORWARD_NAV_H);
-		forwardAction.setEnabled(false);
-	}
-
-	public void contributeToToolBar(IToolBarManager toolBarManager) {
-		toolBarManager.add(new Separator());
-		toolBarManager.add(homeAction);
-		toolBarManager.add(backwardAction);
-		toolBarManager.add(forwardAction);
-	}
-	public void setActiveEditor(IEditorPart targetEditor) {
-		if (this.editor != null)
-			this.editor.setListener(null);
-		editor = (WebBrowserEditor) targetEditor;
-		if (editor != null) {
-			editor.setListener(this);
-			updateActions();
-		}
-	}
-	private void updateActions() {
-		backwardAction.setEnabled(editor.isBackwardEnabled());
-		forwardAction.setEnabled(editor.isForwardEnabled());
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditorInput.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditorInput.java
deleted file mode 100644
index a89e087..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditorInput.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.welcome.internal.webbrowser;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.*;
-/**
- * A simple editor input for the welcome editor
- */
-public class WebBrowserEditorInput implements IEditorInput {
-	private final static String FACTORY_ID = "org.eclipse.welcome.internal.webbrowser.WebBrowserEditorInputFactory"; //$NON-NLS-1$
-	private String url;
-	private String name;
-	/**
-	 * WelcomeEditorInput constructor comment.
-	 */
-	public WebBrowserEditorInput(String name, String url) {
-		this.name = name;
-		this.url = url;
-	}
-	public boolean exists() {
-		return false;
-	}
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-	public ImageDescriptor getImageDescriptor() {
-		return null;
-	}
-	public String getName() {
-		return name;
-	}
-	public String getURL() {
-		return url;
-	}
-	public boolean equals(Object obj) {
-		if (obj==null) return false;
-		if (obj == this) return true;
-		if (obj instanceof WebBrowserEditorInput) {
-			WebBrowserEditorInput wobj = (WebBrowserEditorInput)obj;
-			return wobj.getURL().equals(getURL());
-		}
-		return false;
-	}
-	public IPersistableElement getPersistable() {
-		return new IPersistableElement() {
-			public String getFactoryId() {
-				return FACTORY_ID;
-			}
-			public void saveState(IMemento memento) {
-				memento.putString("name", name);
-				memento.putString("url", url);
-			}
-		};
-	}
-	public String getToolTipText() {
-		return name;
-	}
-}
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditorInputFactory.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditorInputFactory.java
deleted file mode 100644
index a48055f..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/welcome/internal/webbrowser/WebBrowserEditorInputFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.eclipse.welcome.internal.webbrowser;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.*;
-import org.eclipse.ui.IElementFactory;
-
-/**
- */
-public class WebBrowserEditorInputFactory implements IElementFactory {
-	/**
-	 */
-	public WebBrowserEditorInputFactory() {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IElementFactory#createElement(org.eclipse.ui.IMemento)
-	 */
-	public IAdaptable createElement(IMemento memento) {
-		String name = memento.getString("name");
-		String url = memento.getString("url");
-		return new WebBrowserEditorInput(name, url);
-	}
-
-}
diff --git a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/UpdateUIPluginResources.properties b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/UpdateUIPluginResources.properties
index 974bca1..d6749e2 100644
--- a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/UpdateUIPluginResources.properties
+++ b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/UpdateUIPluginResources.properties
@@ -274,10 +274,7 @@
 ModeSelectionPage.title=Feature Updates
 ModeSelectionPage.desc=Choose the way you want to search for features to install
 ModeSelectionPage.updates=Search for &updates of the currently installed features
-ModeSelectionPage.updatesText=Select this option if you want to search for updates of the features you already have installed.
 ModeSelectionPage.newFeatures=&Search for new features to install
-ModeSelectionPage.newFeaturesText=Select this option if you want to install new features from existing or new update sites. \
-Some sites may already be available. You can add new update site URLs to the search. 
 
 MoreInfoGenerator.notInstalled=not installed
 MoreInfoGenerator.all=all
@@ -351,7 +348,7 @@
 InstallWizard.LicensePage.up=&Previous License
 
 InstallWizard.TargetPage.title = Installation
-InstallWizard.TargetPage.desc = The following features will be installed. You can select a feature and change the location where the feature will be installed.
+InstallWizard.TargetPage.desc = The following features will be install. You can select a feature and change the location where the feature will be installed.
 InstallWizard.TargetPage.jobsLabel = Features to &install:
 InstallWizard.TargetPage.siteLabel = A&vailable installation locations:
 InstallWizard.TargetPage.new = &Add Location...
diff --git a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/ModeSelectionPage.java b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/ModeSelectionPage.java
index 59c121b..491221c 100644
--- a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/ModeSelectionPage.java
+++ b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/ModeSelectionPage.java
@@ -14,13 +14,12 @@
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.*;
+import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.ui.help.*;
 import org.eclipse.update.internal.operations.UpdateUtils;
 import org.eclipse.update.internal.ui.UpdateUI;
-import org.eclipse.update.search.UpdateSearchRequest;
+import org.eclipse.update.search.*;
 
 /**
  */
@@ -69,20 +68,11 @@
 		updatesButton.setText(UpdateUI.getString("ModeSelectionPage.updates")); //$NON-NLS-1$
 		boolean newFeaturesMode = getSettings().getBoolean(P_NEW_FEATURES_MODE);
 		updatesButton.setSelection(!newFeaturesMode);
-		
-		final Label updatesText = new Label(composite, SWT.WRAP);
-		updatesText.setText(UpdateUI.getString("ModeSelectionPage.updatesText"));
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = 100;
-		updatesText.setLayoutData(gd);
-		
 		updatesButton.addSelectionListener(new SelectionAdapter() {
 			public void widgetSelected(SelectionEvent e) {
 				switchMode();
 			}
 		});
-		// spacer
-		new Label(composite, SWT.NULL);
 		newFeaturesButton = new Button(composite, SWT.RADIO);
 		newFeaturesButton.setSelection(newFeaturesMode);
 		newFeaturesButton.setText(UpdateUI.getString("ModeSelectionPage.newFeatures")); //$NON-NLS-1$
@@ -90,25 +80,7 @@
 			public void widgetSelected(SelectionEvent e) {
 				switchMode();
 			}
-		});
-		final Label newFeaturesText = new Label(composite, SWT.WRAP);
-		newFeaturesText.setText(UpdateUI.getString("ModeSelectionPage.newFeaturesText"));
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = 100;
-		newFeaturesText.setLayoutData(gd);
-
-		/*
-		composite.addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent e) {
-				Composite parent = (Composite)e.widget;
-				Rectangle carea = parent.getClientArea();
-				GridData gd = (GridData)updatesText.getLayoutData();
-				gd.widthHint = carea.width; 
-				gd = (GridData)newFeaturesText.getLayoutData();
-				gd.widthHint = carea.width; 
-			}
-		});
-		*/
+		});		
 		switchMode();
 		
 		Dialog.applyDialogFont(parent);
diff --git a/update/org.eclipse.update/.classpath b/update/org.eclipse.update/.classpath
deleted file mode 100644
index f12531d..0000000
--- a/update/org.eclipse.update/.classpath
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.core.boot/boot.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.core.boot/bootsrc.zip"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.core.runtime/runtime.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.core.runtime/runtimesrc.zip"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.swt/swt.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.swt/swtsrc.zip"/>
-    <classpathentry kind="var"
-        path="ECLIPSE_HOME/plugins/org.eclipse.ui/workbench.jar" sourcepath="ECLIPSE_HOME/plugins/org.eclipse.ui/workbenchsrc.zip"/>
-    <classpathentry kind="var" path="ECLIPSE_HOME/plugins/org.eclipse.webdav/webdav.jar"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update/.cvsignore b/update/org.eclipse.update/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/update/org.eclipse.update/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/update/org.eclipse.update/.project b/update/org.eclipse.update/.project
deleted file mode 100644
index 7560f76..0000000
--- a/update/org.eclipse.update/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update/.vcm_meta b/update/org.eclipse.update/.vcm_meta
deleted file mode 100644
index 7655f8d..0000000
--- a/update/org.eclipse.update/.vcm_meta
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project-description>
-	<comment></comment>
-	<nature id="org.eclipse.jdt.core.javanature"/>
-	<builder name="org.eclipse.jdt.core.javabuilder">
-	</builder>
-</project-description>
