diff --git a/ant/org.eclipse.ant.core/.classpath b/ant/org.eclipse.ant.core/.classpath
deleted file mode 100644
index 0946172..0000000
--- a/ant/org.eclipse.ant.core/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src/"/>
-    <classpathentry kind="src" path="src_ant/"/>
-    <classpathentry kind="src" path="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="src" path="/org.apache.ant"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/ant/org.eclipse.ant.core/.cvsignore b/ant/org.eclipse.ant.core/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/ant/org.eclipse.ant.core/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/ant/org.eclipse.ant.core/.options b/ant/org.eclipse.ant.core/.options
deleted file mode 100644
index 04b34d5..0000000
--- a/ant/org.eclipse.ant.core/.options
+++ /dev/null
@@ -1,7 +0,0 @@
-# Debugging options for the org.eclipse.ant.core plugin.
-
-# Turn on debugging for the org.eclipse.ant.core plugin.
-org.eclipse.ant.core/debug=true
-
-# Displays buildfile run times.
-org.eclipse.ant.core/buildfile/timing=false
diff --git a/ant/org.eclipse.ant.core/.project b/ant/org.eclipse.ant.core/.project
deleted file mode 100644
index 4df3a06..0000000
--- a/ant/org.eclipse.ant.core/.project
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ant.core</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.ant</project>
-		<project>org.apache.xerces</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
-			<arguments>
-				<dictionary>
-					<key>!{tool_show_log}</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_refresh}</key>
-					<value>${none}</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_name}</key>
-					<value>org.eclipse.ant.core extra builder</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_dir}</key>
-					<value></value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_args}</key>
-					<value>-DbuildType=${build_type}</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_loc}</key>
-					<value>${workspace_loc:/org.eclipse.ant.core/scripts/buildExtraJAR.xml}</value>
-				</dictionary>
-				<dictionary>
-					<key>!{tool_type}</key>
-					<value>org.eclipse.ui.externaltools.type.ant</value>
-				</dictionary>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/ant/org.eclipse.ant.core/about.html b/ant/org.eclipse.ant.core/about.html
deleted file mode 100644
index 756efe8..0000000
--- a/ant/org.eclipse.ant.core/about.html
+++ /dev/null
@@ -1,89 +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>16th October, 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>Third Party Content</h3>
-
-<p>The Content includes items that have been sourced from third parties as follows:</p>
-
-<p><b>Ant 1.5.1</b></p>
-<p>The plug-in is based on software developed by The Apache Software Foundation as part of the Jakarta project.  Therefore:</p>
-
-<blockquote>
-This product includes software developed by the Apache Software Foundation (<a href="http://www.apache.org/">http://www.apache.org/</a>).
-</blockquote>
-
-<p>The following classes (&quot;Ant Derivative Work&quot;) are based on Ant code:</p>
-
-<ul>
-	<li>InternalAntRunner contained in antsupportlib.jar and antsupportlibsrc.zip</li>
-</ul>
-
-<p>The Ant Derivative Work is:</p>
-
-<blockquote>Copyright (c) 2000-2002 The Apache Software Foundation. All rights reserved.</blockquote>
-
-<p>Your use of the Ant Derivative Work is subject to the terms and conditions of the Apache Software License 1.1 which
-is available at <a href="http://jakarta.apache.org/ant/manual/LICENSE">http://jakarta.apache.org/ant/manual/LICENSE</a>.
-More specifically:</p>
-<blockquote>
-	1. Redistributions of source code must retain the above copyright notice, this list of<br />
-	conditions and the following disclaimer.<br />
-<br />
-	2. Redistributions in binary form must reproduce the above copyright notice, this list of<br />
-	conditions and the following disclaimer in the documentation and/or other materials<br />
-	provided with the distribution.<br />
-<br />
-	3. The end-user documentation included with the redistribution, if any, must include the<br />
-	following acknowledgment:<br />
-	<blockquote>
-		&quot;This product includes software developed by the Apache Software Foundation<br />
-		(<a href="http://www.apache.org/">http://www.apache.org/</a>).&quot;
-	</blockquote>
-	Alternately, this acknowledgment may appear in the software itself, if and wherever such<br />
-	third-party acknowledgments normally appear.<br />
-<br />
-	4. The names &quot;Ant&quot; and &quot;Apache Software Foundation&quot; must not be used to endorse or<br />
-	promote products derived from this software without prior written permission. For written<br />
-	permission, please contact <a href="mailto:apache@apache.org">apache@apache.org</a>.<br />
-<br />
-	5. Products derived from this software may not be called &quot;Apache&quot;, nor may &quot;Apache&quot; appear<br />
-	in their name, without prior written permission of the Apache Software Foundation.<br />
-<br />
-	THIS SOFTWARE IS PROVIDED &quot;AS IS&quot; AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br />
-	LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR<br />
-	PURPOSE ARE	DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS<br />
-	CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR<br />
-	CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR<br />
-	SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON<br />
-	ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,	OR TORT (INCLUDING<br />
-	NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT	OF THE USE OF THIS SOFTWARE, EVEN IF<br />
-	ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-</blockquote>
-
-<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/ant/org.eclipse.ant.core/build.properties b/ant/org.eclipse.ant.core/build.properties
deleted file mode 100644
index 2147d49..0000000
--- a/ant/org.eclipse.ant.core/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.antsupport.jar=src/
-source.lib/antsupportlib.jar=src_ant/
-src.includes=about.html
-bin.includes=plugin.xml,plugin.properties,about.html,*.jar,lib/*.jar,.options
-jars.compile.order=antsupport.jar,lib/antsupportlib.jar
-jars.extra.classpath=../org.apache.ant/ant.jar
-javadoc.packages=org.eclipse.*
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/buildnotes_platform-ant.html b/ant/org.eclipse.ant.core/buildnotes_platform-ant.html
deleted file mode 100644
index 83ba0ac..0000000
--- a/ant/org.eclipse.ant.core/buildnotes_platform-ant.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
-   <title>Eclipse Platform Release Notes Ant</title>
-</head>
-<body>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Nov 19, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26112">26112</a>: "Run Ant..." implies dialog<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6498">6498</a>: [ExternalTools] selecting and building individual targets in ANT scripts<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18971">18971</a>: [ExternalTools] Using external tool configs in other contexts<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19450">19450</a>: [ExternalTools] menu should limit itself to the first n tools (perhaps n = 20)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=21809">21809</a>: Let user specify installation directory of Ant<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24718">24718</a>: Run Ant should be programmatically available<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25059">25059</a>: [ExternalTools] Refresh Scopes dialog should be wizard<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25062">25062</a>: Support execution of ant tasks in a seperate thread<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25821">25821</a>: External Tool] Error Message "External Tool runner internal error"<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26061">26061</a>: Changes to Ant classpath don't persist<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26418">26418</a>: Remove "launch configuration mode" as an option in external tools<br>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Nov 13, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=26050">26050</a>: Unnamed projects cause NPE in Ant View<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16982">16982</a>: [ExternalTools] Console font setting should be workbench text font<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25592">25592</a>: [External Tools] Log console should have autoscroll<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18478">18478</a>: [External Tools] Minor: output not always in right order<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22727">22727</a>: [External Tools] Program tool output not shown on log console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25762">25762</a>: Problem starting JUnit plugin tests<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25746">25746</a>: Runtime exec support should be in debug core<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25877">25877</a>: should save all files before execute ant script<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23662">23662</a>: [ExternalTools] External tools history manipulation<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25907">25907</a>: [ExternalTools] ExternalToolMenuDelegate leaking menus<br>
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Nov 12, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25759">25759</a>: NPE trying to open the antview preferences page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22730">22730</a>: [ExternalTools] Capture output<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25397">25397</a>: AntPage flashes when resized<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25493">25493</a>: NPE if default target does not exist in external tool builder ant file<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25648">25648</a>: Add remove action to ant view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25468">25468</a>: Backwards compatibility with Ant 1.4.1<br>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Nov 05, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25509">25509</a>: NPE from InternalAntRunner<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25639">25639</a>: Double click in tasks and types tabs should invoke edit<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25656">25656</a>: [ant] Cannot add multiple Jars to ant classpath at the same time<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25693">25693</a>: Implement support for the -diagnostics option<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25647">25647</a>: Add Ant View to Eclipse<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25698">25698</a>: Global properties<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25699">25699</a>: Global property files<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25702">25702</a>:  [External Tools] Restore defaults does not work<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24525">24525</a>:  Active targets not shown in ant tool property page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24578">24578</a>:  Can't add variable to tool arguments<br>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Oct 29, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24847">24847</a>: duplicate options not handled the same as cmd line Ant<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25133">25133</a>: Implement support for the 1.5.1 feature: -propertyfile<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25213">25213</a>: -propertyfile should not abort build if the property file is not found<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24580">24580</a>: Expose more information in TargetInfo<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17803">17803</a>: [ExternalTools] AntPage table should scroll horizontally<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=18294">18294</a>: [ExternalTools] Ant preference page: classpath list too wide<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24383">24383</a>: Update the printUsage of InternalAntRunner<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24824">24824</a>: DefaultLogger should be used for headless Ant<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20576">20576</a>: [ExternalTools] Should specify order of jars on classpath<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24234">24234</a>: Ant test suite<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24318">24318</a>: Move to Ant 1.5.1<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=25134">25134</a>: Implement support for the 1.5.1 feature: -inputhandler<br>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Oct 22, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24756">24756</a>: -projecthelp indicates BUILD SUCCESSFUL<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24831">24831</a>: Same URL multiple times in the AntClassLoader<br>
-
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Oct 16, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=15821">15821</a>: [ExternalTools] Minor: Ant console "steals" focus<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22400">22400</a>: [ExternalTools] Run Ant... action displayed for invalid resources (build I0813)<br>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Oct 15, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=6020">6020</a>: Tasks calling System.exit crash Eclipse<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23651">23651</a>: [doc] AntTasks and AntTypes refer to non-existant API<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23653">23653</a>: [doc] Extra Ant classpath entries extension<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24459">24459</a>: AntCorePlugin startup<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19899">19899</a>: If the user never changes the Ant classpath, it should always be computed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23917">23917</a>: logfile not created in the correct location when path not fully specified<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24587">24587</a>: Project properties not set properly if no arguments passed<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24696">24696</a>: ExternalTools antrunner.jar is still in the HEAD stream<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24418">24418</a>: Option without necessary corresponding argument not handled correctly<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24594">24594</a>: Targets specified as arguments not recognized<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23995">23995</a>: deadlock while running build.xml<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24733">24733</a>: Help text is wrong<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24710">24710</a>: Custom ant task classes not found<br>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Oct 09, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24527">24527</a>: java.io.FileNotFoundException occurs when invoking AntRunner<br>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Oct 08, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=20557">20557</a>: Running an empty ant script takes about 2 seconds<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22459">22459</a>: AntRunner prints stack trace on OperationCanceledException<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23383">23383</a>: API: Add @since tags<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24290">24290</a>: Ant preferences are only saved at shutdown<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23584">23584</a>: Java should be capitalized<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=17484">17484</a>: [ExternalTools] Adding tasks from JARs in the Ant Preference Page<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23664">23664</a>: Better reporting of errors when reading Ant build file<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24415">24415</a>: Running an Ant script with console logging turned off writes to OS console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=24452">24452</a>: Key clashes within extension point definitions<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23350">23350</a>: Possible NPE<br>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build Oct 01, 2002
-
-<h3>
-Resolved Bugs</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23482">23482</a>: Rework the Core Ant code to be able to use the NLS tools<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=14180">14180</a>: Ant -help not function<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19801">19801</a>: AntCorePreferences, Type, Tasks could be a public class<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23881">23881</a>: Same error logged three times<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23913">23913</a>: Issues with InternalAntRunner#printHelp(Project)<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22714">22714</a>: Arguments line lose spaces when printed to console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23132">23132</a>: -logfile option for ant doesnt seem to work<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=16740">16740</a>: [ExternalTools] Irrelevant stack trace for errors in Ant build file<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=19838">19838</a>: Error codes for Ant Core should be public<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=21478">21478</a>: Insufficient Ant activation error reporting<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23658">23658</a>: Build file is not logged to log console view<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22465">22465</a>: Wrong ant script causes fatal error written to console<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23924">23924</a>: handling of incorrect / unrecognized arguments<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23720">23720</a>: [doc] Extension point listing is incorrect<br>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=22702">22702</a>: XmlLogger not working?<br>
-
-<h3>
-Problem Reports Closed</h3>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=21479">21479</a>: Ant classpath refers to old 'xerces.jar'<br> 
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=23832">23832</a>: Update Ant pages on dev.eclipse.org<br>
-
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/doc/hglegal.htm b/ant/org.eclipse.ant.core/doc/hglegal.htm
deleted file mode 100644
index b071dbd..0000000
--- a/ant/org.eclipse.ant.core/doc/hglegal.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.73 [en] (Win98; U) [Netscape]">
-   <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright IBM Corp. 2000, 2001. All Rights Reserved.
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/doc/ngibmcpy.gif b/ant/org.eclipse.ant.core/doc/ngibmcpy.gif
deleted file mode 100644
index 360f8e9..0000000
--- a/ant/org.eclipse.ant.core/doc/ngibmcpy.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core.html b/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core.html
deleted file mode 100644
index 26f22bb..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>Ant Build Tool Core extension-points</title>
-</head>
-<body link="#0000FF" vlink="#800080">
-
-<center>
-<h1>
-Ant Build Tool Core Plug-in</h1></center>
-This document lists all of the extension points that the Ant Build Tool Core
-plug-in makes available to tool developers.
-<p>
-<hr WIDTH="100%">
-<h1>
-General Extension Points</h1>
-The following extension points can be used to extend the fundamental capabilities
-of the Ant core plug-in:
-<ul>
-<li>
-<a href="org_eclipse_ant_core_antTasks.html">org.eclipse.ant.core.antTasks</a></li>
-
-<li>
-<a href="org_eclipse_ant_core_antTypes.html">org.eclipse.ant.core.antTypes</a></li>
-<li>
-<a href="org_eclipse_ant_core_extraClasspathEntries.html">org.eclipse.ant.core.extraClasspathEntries</a></li>
-</ul>
-<a href="hglegal.htm"><img SRC="ngibmcpy.gif" ALT="Copyright IBM Corp. 2000, 2001.  All Rights Reserved." BORDER=0 height=12 width=195></a>
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTasks.html b/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTasks.html
deleted file mode 100644
index a84b7a8..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTasks.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
-   <title>AntTasks</title>
-</head>
-<body link="#0000FF" vlink="#800080">
-
-<center>
-<h1>
-AntTasks</h1></center>
-<b><i>Identifier: </i></b>org.eclipse.ant.core.antTasks
-<p><b><i>Description: </i></b>Allows plug-ins to define arbitrary Ant tasks
-for use by the Ant infrastructure.&nbsp; The standard Ant infrastructure
-allows for the addition of arbitrary tasks.&nbsp; Unfortunately, it is
-unlikely that the Ant Core plug-in would have the classes required by these
-tasks on its classpath (or that of any of its prerequisites).&nbsp; To
-address this, clients should define an extension which plugs into this
-extension-point and maps a task name onto a class.&nbsp; The Ant plug-in
-can then request that the declaring plug-in load the specified class.
-<p><b><i>Configuration Markup:</i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ELEMENT antTask EMPTY></tt>
-<br><tt>&nbsp;&nbsp; &lt;!ATTLIST antTask</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp; ></tt>
-<ul>
-<li>
-<b>name -</b> name of the task to be defined</li>
-
-<li>
-<b>class</b> - the fully qualified name of a Java class implementing the
-task.&nbsp; Generally this class must be a subclass of&nbsp; <tt>org.apache.tools.ant.Task</tt>.</li>
-
-<li>
-<b>library</b> - a path relative to the plug-in install location for the
-library containing the task</li>
-</ul>
-<b><i>Examples: </i></b>The following is an example of an object declaration:
-<p><tt>&nbsp;&nbsp; &lt;extension point="org.eclipse.ant.core.antTasks"></tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antTask name="coolTask" class="com.example.CoolTask" library= "lib/examples.jar"/></tt>
-<br><tt>&nbsp;&nbsp; &lt;/extension></tt>
-<p><b><i>Supplied Implementation:</i></b> The platform itself supplies
-a number of tasks including <tt>incremental, javac and refreshLocal</tt>.
-<p><a href="hglegal.htm"><img SRC="ngibmcpy.gif" ALT="Copyright IBM Corp. 2000, 2001.  All Rights Reserved." BORDER=0 height=12 width=195></a>
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTypes.html b/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTypes.html
deleted file mode 100644
index a101a4c..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTypes.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
-   <title>AntObjects</title>
-</head>
-<body link="#0000FF" vlink="#800080">
-
-<center>
-<h1>
-AntTypes</h1></center>
-<b><i>Identifier: </i></b>org.eclipse.ant.core.antTypes
-<p><b><i>Description: </i></b>Allows plug-ins to define arbitrary Ant datatypes
-for use by the Ant infrastructure.&nbsp; The standard Ant infrastructure
-allows for the addition of arbitrary datatypes.&nbsp; Unfortunately, it
-is unlikely that the Ant Core plug-in would have the classes required by
-these datatypes on its classpath (or that of any of its prerequisites).&nbsp;
-To address this, clients should define an extension which plugs into this
-extension-point and maps a datatype name onto a class.&nbsp; The Ant plug-in
-can then request that the declaring plug-in load the specified class.
-<p><b><i>Configuration Markup:</i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ELEMENT antType EMPTY></tt>
-<br><tt>&nbsp;&nbsp; &lt;!ATTLIST antType</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp; ></tt>
-<ul>
-<li>
-<b>name -</b> name of the task to be defined</li>
-
-<li>
-<b>class</b> - the fully qualified name of a Java class implementing the
-datatype.&nbsp; Generally this class must be a subclass of&nbsp; <tt>org.apache.tools.ant.types.DataType</tt>.</li>
-
-<li>
-<b>library</b> - a path relative to the plug-in install location for the
-library containing the type</li>
-</ul>
-<b><i>Examples: </i></b>The following is an example of an object declaration:
-<p><tt>&nbsp;&nbsp; &lt;extension point="org.eclipse.ant.core.antTypes"></tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antTask name="coolType" class="com.example.CoolType" library="lib/example.jar"/></tt>
-<br><tt>&nbsp;&nbsp; &lt;/extension></tt>
-<p><a href="hglegal.htm"><img SRC="ngibmcpy.gif" ALT="Copyright IBM Corp. 2000, 2001.  All Rights Reserved." BORDER=0 height=12 width=195></a>
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_extraClasspathEntries.html b/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_extraClasspathEntries.html
deleted file mode 100644
index eb099db..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_extraClasspathEntries.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
-   <meta name="Author" content="Rodrigo Peretti">
-   <title>Extra Ant Classpath Entries</title>
-</head>
-<body link="#0000FF" vlink="#800080">
-
-<center>
-<h1>
-Extra Ant Classpath Entries</h1></center>
-<b><i>Identifier: </i></b>org.eclipse.ant.core.extraClasspathEntries
-<p><b><i>Description: </i></b>Allows plug-ins to define arbitrary JARs
-for use by the Ant infrastructure. These JARs are put into the Ant classpath
-at runtime. Besides the JAR, the plug-in classloader of the plug-in providing
-the JAR is also added to the classpath.
-<p><b><i>Configuration Markup:</i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ELEMENT extraClasspathEntry EMPTY></tt>
-<br><tt>&nbsp;&nbsp; &lt;!ATTLIST extraClasspathEntry</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp; ></tt>
-<ul>
-<li>
-<b>library</b> - a path relative to the plug-in install location for the
-library</li>
-</ul>
-<b><i>Examples: </i></b>The following is an example of an object declaration:
-<p><tt>&nbsp;&nbsp; &lt;extension point="org.eclipse.ant.core.extraClasspathEntries"></tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extraClasspathEntry library="myExtraLibrary.jar"/></tt>
-<br><tt>&nbsp;&nbsp; &lt;/extension></tt>
-<p><b><i>Supplied Implementation:</i></b> The platform itself supplies
-an ant support jar
-<p><a href="hglegal.htm"><img SRC="ngibmcpy.gif" ALT="Copyright IBM Corp. 2000, 2001.  All Rights Reserved." BORDER=0 height=12 width=195></a>
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/lib/.cvsignore b/ant/org.eclipse.ant.core/lib/.cvsignore
deleted file mode 100644
index f0f30e5..0000000
--- a/ant/org.eclipse.ant.core/lib/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-antsupportlib.jar
diff --git a/ant/org.eclipse.ant.core/plugin.properties b/ant/org.eclipse.ant.core/plugin.properties
deleted file mode 100644
index 0793194..0000000
--- a/ant/org.eclipse.ant.core/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-######################################################################
-# Copyright (c) 2000, 2002 IBM Corp. and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of 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 implementation
-######################################################################
-
-pluginName = Ant Build Tool Core
-providerName = Eclipse.org
-classpathName = Extra Ant Classpath Entry Definitions
-tasksName = Ant Task Definitions
-typesName = Ant Type Definitions
diff --git a/ant/org.eclipse.ant.core/plugin.xml b/ant/org.eclipse.ant.core/plugin.xml
deleted file mode 100644
index bfc30b9..0000000
--- a/ant/org.eclipse.ant.core/plugin.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.ant.core"
-   name="%pluginName"
-   version="2.1.0"
-   provider-name="%providerName"
-   class="org.eclipse.ant.core.AntCorePlugin">
-
-   <requires>
-     <import plugin="org.apache.xerces"/>
-   </requires>
-
-   <runtime>
-     <library name="antsupport.jar">
-       <export name="*"/>
-     </library>
-   </runtime>
-
-   <extension-point id="extraClasspathEntries" name="%classpathName"/>
-   <extension-point id="antTasks" name="%tasksName"/>
-   <extension-point id="antTypes" name="%typesName"/>
-
-   <!-- Applications -->
-   <extension
-     id="antRunner"
-     point="org.eclipse.core.runtime.applications">
-     <application>
-       <run
-         class="org.eclipse.ant.core.AntRunner">
-       </run>
-    </application>
-   </extension>
-
-   <!-- Extra Classpath -->
-   <extension point="org.eclipse.ant.core.extraClasspathEntries">
-      <extraClasspathEntry
-         library="lib/antsupportlib.jar">
-      </extraClasspathEntry>
-   </extension>
-
-</plugin>
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/r2_0_buildnotes_platform-ant.html b/ant/org.eclipse.ant.core/r2_0_buildnotes_platform-ant.html
deleted file mode 100644
index 238d69a..0000000
--- a/ant/org.eclipse.ant.core/r2_0_buildnotes_platform-ant.html
+++ /dev/null
@@ -1,552 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
-   <title>Eclipse Platform Release Notes Core</title>
-</head>
-<body>
-
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020612
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F06%2F11&chfieldto=2002%2F06%2F12&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&field0-0-1=noop&type0-0-1=noop&value0-0-1=&cmdtype=doit&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020611
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F06%2F07&chfieldto=2002%2F06%2F11&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&field0-0-1=noop&type0-0-1=noop&value0-0-1=&cmdtype=doit&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020607
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F05%2F31&chfieldto=2002%2F06%2F07&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&field0-0-1=noop&type0-0-1=noop&value0-0-1=&cmdtype=doit&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020531
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F05%2F30&chfieldto=2002%2F05%2F31&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&field0-0-1=noop&type0-0-1=noop&value0-0-1=&cmdtype=doit&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<hr WIDTH="100%">
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020530
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F05%2F29&chfieldto=2002%2F05%2F30&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020529
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F05%2F21&chfieldto=2002%2F05%2F29&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020521
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-The plug-in <b><tt>org.eclipse.ant.ui</tt></b> has been removed in favor
-of <b><tt>org.eclipse.ui.externaltools</tt></b>.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F05%2F14&chfieldto=2002%2F05%2F21&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<hr WIDTH="100%">
-<h1>
-Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020514
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-Ant type eclipse.commapatternset has been removed.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F04%2F30&chfieldto=2002%2F05%2F14&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020430
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-Type commapatternset is now called eclipse.commapatternset .</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F04%2F12&chfieldto=2002%2F04%2F30&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020411
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F04%2F09&chfieldto=2002%2F04%2F12&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=Active&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020409
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-<b><tt>org.eclipse.ant.core</tt></b> does not export <b><tt>org.apache.ant</tt></b>
-anymore. Plug-ins that need to have access to Ant classes need to require
-<b><tt>org.apache.ant</tt></b>
-directly.</li>
-
-<li>
-Tasks <b><tt>refreshLocal</tt></b> and <b><tt>incrementalBuild</tt></b>
-are not available anymore. Use <b><tt>eclipse.refreshLocal</tt></b> and
-<b><tt>eclipse.incrementalBuild</tt></b>
-instead.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-New property <b><tt>eclipse.running</tt></b> is set for scripts running
-inside Eclipse.</li>
-
-<li>
-It is now possible to extend the Ant classpath by adding new JARs, folders,
-tasks and types through a preference (Workbench->Preferences->Ant->Customize).</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F01%2F29&chfieldto=2002%2F04%2F09&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=Active&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020129
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2001%2F12%2F17&chfieldto=2002%2F01%2F29&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=ant&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20011218
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2001%2F12%2F11&chfieldto=2001%2F12%2F17&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=ant&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20011211
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-Ant code from Apache has moved to a new plug-in called org.apache.ant..</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2001%2F11%2F27&chfieldto=2001%2F12%2F10&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=Active&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20011127 (v213)
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5391">5391</a>&nbsp;
-Upgrade to Ant 1.4.1</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20011120 (v211)
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5331">5331</a>&nbsp;
-Ant does not override optional tasks with org.eclipse.ant.core.antTasks
-extension point</li>
-</ul>
-
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/scripts/buildExtraJAR.xml b/ant/org.eclipse.ant.core/scripts/buildExtraJAR.xml
deleted file mode 100644
index 4989c68..0000000
--- a/ant/org.eclipse.ant.core/scripts/buildExtraJAR.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.ant.core" default="main" basedir="..">
-
-	<property name="bootclasspath" value=""/>
-
-	<target name="main">
-		<condition property="fullBuild">
-			<equals arg1="${buildType}" arg2="full"/>
-		</condition>
-		<antcall target="build"/>
-	</target>
-
-	<target name="build" if="fullBuild">
-		<antcall target="clean"/>
-		<antcall target="lib/antsupportlib.jar"/>
-		<antcall target="refresh"/>
-	</target>
-
-	<target name="init" depends="properties">
-		<property name="plugin" value="org.eclipse.ant.core"/>
-		<property name="version.suffix" value="_2.1.0"/>
-		<property name="full.name" value="${plugin}${version.suffix}"/>
-		<property name="temp.folder" value="${basedir}/temp.folder"/>
-		<property name="plugin.destination" value="${basedir}"/>
-		<property name="build.result.folder" value="${basedir}"/>
-	</target>
-
-	<target name="properties" if="eclipse.running">
-		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
-	</target>
-
-	<target name="lib/antsupportlib.jar" depends="init">
-		<property name="destdir" value="${temp.folder}/lib/antsupportlib.jar.bin"/>
-		<delete dir="${temp.folder}/lib/antsupportlib.jar.bin"/>
-		<mkdir dir="${temp.folder}/lib/antsupportlib.jar.bin"/>
-		<!-- compile the source code -->
-		<javac target="1.3" source="1.3" destdir="${temp.folder}/lib/antsupportlib.jar.bin" failonerror="false" verbose="false" debug="on" includeAntRuntime="no" bootclasspath="${bootclasspath}" classpath="${basedir}/../org.eclipse.core.runtime/runtime.jar;${basedir}/../org.apache.ant/ant.jar;${basedir}/../org.apache.xerces/xercesImpl.jar;${basedir}/../org.apache.xerces/xmlParserAPIs.jar;${basedir}/bin;${basedir}/../org.eclipse.core.boot/boot.jar;">
-			<src path="src_ant/"/>
-		</javac>
-		<!-- copy necessary resources -->
-		<copy todir="${temp.folder}/lib/antsupportlib.jar.bin">
-			<fileset dir="src_ant/" excludes="**/*.java"/>
-		</copy>
-		<mkdir dir="${build.result.folder}/lib"/>
-		<jar jarfile="${build.result.folder}/lib/antsupportlib.jar" basedir="${temp.folder}/lib/antsupportlib.jar.bin"/>
-		<delete dir="${temp.folder}"/>
-	</target>
-
-	<target name="clean" depends="init">
-		<delete file="${build.result.folder}/lib/antsupportlib.jar"/>
-		<delete dir="${temp.folder}"/>
-	</target>
-
-	<target name="refresh" depends="init" if="eclipse.running">
-		<eclipse.refreshLocal resource="${plugin}" depth="infinite"/>
-	</target>
-
-</project>
diff --git a/ant/org.eclipse.ant.core/scripts/exportplugin.xml b/ant/org.eclipse.ant.core/scripts/exportplugin.xml
deleted file mode 100644
index a17dd75..0000000
--- a/ant/org.eclipse.ant.core/scripts/exportplugin.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!-- Export a jar of .class files for the org.eclipse.ant.core Eclipse plug-in
-     along with other important plugin files to the "plugin-export" subdirectory
-     of the target Eclipse installation -->
-<project name="org.eclipse.ant.core" default="export" basedir="..">
-
-	<!-- Set the timestamp and important properties -->
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="dest"  value="${destdir}/org.eclipse.ant.core_2.1.0" />
-	</target>
-
-	<!-- Create the jar of .class files, and copy other important files to export dir -->
-	<target name="export" depends="init">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		<delete dir="${dest}/lib"/>
-		<mkdir dir="${dest}/lib"/>
-		<jar 
-			jarfile="${dest}/antsupport.jar"
-			basedir="bin"
-		/>
-		<!-- Create the source zip -->
-		<zip zipfile="${dest}/antsupportsrc.zip">
-			<fileset dir="src"/>
-		</zip>
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<copy file=".classpath" todir="${dest}"/>
-		<copy file=".options" todir="${dest}"/>
-		<ant antfile="scripts/buildExtraJAR.xml" target="build"/>
-		<copy file="lib/antsupportlib.jar" todir="${dest}/lib"/>
-	</target>
-	
-</project>
diff --git a/ant/org.eclipse.ant.core/scripts/updateTarget.xml b/ant/org.eclipse.ant.core/scripts/updateTarget.xml
deleted file mode 100644
index ae87671..0000000
--- a/ant/org.eclipse.ant.core/scripts/updateTarget.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<!--
-	For use in development of the Ant core plugin 
-	This script can be used to update a target for testing/debugging
-	Export a jar of .class files for the org.eclipse.ant.core Eclipse plugin
-    along with other important plugin files to the "plugin-export" subdirectory
-    of the target Eclipse installation
-	As well the export of the plugin is copied to a target installation.
- -->
-<project name="org.eclipse.ant.core" default="export" basedir="..">
-
-	<!-- Set the timestamp and important properties -->
-	<target name="init">
-		<tstamp/>
-		<property name="bootclasspath" value=""/>
-		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="pluginName" value= "org.eclipse.ant.core_2.1.0"/>
-		<property name="destBin"  value="${destdir}/${pluginName}" />
-		<property name="destSrc"  value="${destdir}/org.eclipse.platform.source/src/org.eclipse.ant.core_2.1.0" />
-		<property name="temp.folder" value="${destdir}/temp.folder"/>
-
-		<property name="currentBuild" value="../../Debugger/Ant/eclipse"/>
-		<property name="currentBuildPlugins" value="${currentBuild}/plugins/${pluginName}"/>
-	</target>
-
-	<!-- Create the jar of .class files, and copy other important files to export dir -->
-	<target name="export" depends="init">
-		<mkdir dir="${destdir}" />
-		<delete dir="${destBin}" />
-		<mkdir dir="${destBin}" />
-		<delete dir="${destSrc}" />
-		<mkdir dir="${destSrc}" />
-		<delete dir="${destBin}/lib" />
-		<jar 
-			jarfile="${destBin}/antsupport.jar"
-			basedir="bin"
-			excludes="bin/org/eclipse/ant/internal/core/ant"
-		/>
-		<!-- Create the source zip -->
-		<zip zipfile="${destSrc}/antsuppportsrc.zip">
-			<fileset dir="src"/>
-		</zip>
-		<copy file="plugin.xml" todir="${destBin}"/>
-		<copy file="plugin.properties" todir="${destBin}"/>
-		<copy file="about.html" todir="${destBin}"/>
-		<copy file=".classpath" todir="${destBin}"/>
-		<copy file=".options" todir="${destBin}"/>
-		
-		<delete dir="${temp.folder}/lib/antsupportlib.jar.bin"/>
-		<mkdir dir="${temp.folder}/lib/antsupportlib.jar.bin"/>
-		<!-- compile the source code -->
-		<javac destdir="${temp.folder}/lib/antsupportlib.jar.bin" failonerror="false" verbose="false" debug="on" includeAntRuntime="no" bootclasspath="${bootclasspath}" classpath="${basedir}/../org.eclipse.core.runtime/runtime.jar;${basedir}/../org.apache.ant/ant.jar;${basedir}/../org.apache.xerces/xercesImpl.jar;${basedir}/../org.apache.xerces/xmlParserAPIs.jar;${basedir}/bin;${basedir}/../org.eclipse.core.boot/boot.jar;">
-			<src path="src_ant/"/>
-		</javac>
-		<!-- copy necessary resources -->
-		<copy todir="${temp.folder}/lib/antsupportlib.jar.bin">
-			<fileset dir="src_ant/" excludes="**/*.java"/>
-		</copy>
-		<mkdir dir="${destBin}/lib"/>
-		<jar jarfile="${destBin}/lib/antsupportlib.jar" basedir="${temp.folder}/lib/antsupportlib.jar.bin"/>
-		<delete dir="${temp.folder}"/>
-		
-	</target>
-	
-	<target name="copy" depends="init">
-		<copy todir="${currentBuildPlugins}">
-			<fileset dir="${destBin}"/>
-		</copy>
-	</target>
-</project>
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntCorePlugin.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntCorePlugin.java
deleted file mode 100644
index 340c5d7..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntCorePlugin.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntCorePreferences.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntCorePreferences.java
deleted file mode 100644
index 2a867f4..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntCorePreferences.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
deleted file mode 100644
index 3faabbf..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntSecurityException.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntSecurityException.java
deleted file mode 100644
index 1077bf5..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntSecurityException.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Property.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Property.java
deleted file mode 100644
index ba4e789..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Property.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.eclipse.ant.core;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-/**
- * Represents a Ant user property.
- * @since 2.1
- */
-public class Property {
-
-	private String name;
-	private String value;
-
-	public Property(String name, String value) {
-		this.name= name;
-		this.value= value;
-	}
-
-	public Property() {
-	}
-	/**
-	 * Gets the name
-	 * @return Returns a String
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Sets the name
-	 * @param name The name to set
-	 */
-	public void setName(String name) {
-		this.name= name;
-	}
-	
-	/*
-	 * @see Object#equals()
-	 */	
-	public boolean equals(Object other) {
-		if (other.getClass().equals(getClass())) {
-			Property elem= (Property)other;
-			return name.equals(elem.getName());
-		}
-		return false;
-	}
-	
-	/*
-	 * @see Object#hashCode()
-	 */
-	public int hashCode() {
-		return name.hashCode();
-	}	
-	/**
-	 * Returns the value.
-	 * @return String
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * Sets the value.
-	 * @param value The value to set
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buff= new StringBuffer("\""); //$NON-NLS-1$
-		buff.append(getName());
-		buff.append("\"= \""); //$NON-NLS-1$
-		buff.append(getValue());
-		buff.append("\""); //$NON-NLS-1$
-		return buff.toString();
-	}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/TargetInfo.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/TargetInfo.java
deleted file mode 100644
index 911e6a8..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/TargetInfo.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Task.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Task.java
deleted file mode 100644
index b6b88c0..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Task.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.eclipse.ant.core;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import org.eclipse.ant.internal.core.AntObject;
-
-/**
- * Represents an Ant task.
- * @since 2.1
- */
-public class Task extends AntObject {
-
-	/**
-	 * Returns the name of the task
-	 * @return the name of the task
-	 */
-	public String getTaskName() {
-		return fName;
-	}
-
-	/**
-	 * Sets the name of the task
-	 * @param taskName The taskName to set
-	 */
-	public void setTaskName(String taskName) {
-		fName= taskName;
-	}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Type.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Type.java
deleted file mode 100644
index b101c34..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Type.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.eclipse.ant.core;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import org.eclipse.ant.internal.core.AntObject;
-
-/**
- * Represents an Ant type.
- * @since 2.1
- */
-public class Type extends AntObject {
-
-	/**
-	 * Returns the type name
-	 * @return Returns a String
-	 */
-	public String getTypeName() {
-		return fName;
-	}
-
-	/**
-	 * Sets the taskName.
-	 * @param taskName The taskName to set
-	 */
-	public void setTypeName(String taskName) {
-		fName = taskName;
-	}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/package.html b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/package.html
deleted file mode 100644
index a931089..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/package.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides support for running the Ant build tool in the platform.
-<h2>
-Package Specification</h2>
-This package defines a number of task and data types and various infrastructure
-pieces which make Ant in the platform easier and more powerful.
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntClassLoader.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntClassLoader.java
deleted file mode 100644
index ab365fd..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntClassLoader.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.eclipse.ant.internal.core;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.net.URL;
-import java.net.URLClassLoader;
-
-public class AntClassLoader extends URLClassLoader {
-
-	protected ClassLoader[] pluginLoaders;
-
-	public AntClassLoader(URL[] urls, ClassLoader[] pluginLoaders, ClassLoader parent) {
-		super(urls, parent);
-		this.pluginLoaders = pluginLoaders;
-	}
-
-	public Class loadClass(String name) throws ClassNotFoundException {
-		Class result = loadClassParent(name);
-		if (result == null)
-			result = loadClassURLs(name);
-		if (result == null)
-			result = loadClassPlugins(name);
-		if (result == null)
-			throw new ClassNotFoundException(name);
-		return result;
-	}
-
-	protected Class loadClassParent(String name) {
-		try {
-			ClassLoader parent = getParent();
-			if (parent != null)
-				return parent.loadClass(name);
-		} catch (ClassNotFoundException e) {
-			// Ignore exception now. If necessary we'll throw
-			// a ClassNotFoundException in loadClass(String)
-		}
-		return null;
-	}
-
-	protected Class loadClassURLs(String name) {
-		try {
-			return super.loadClass(name);
-		} catch (ClassNotFoundException e) {
-			// Ignore exception now. If necessary we'll throw
-			// a ClassNotFoundException in loadClass(String)
-		}
-		return null;
-	}
-
-	protected Class loadClassPlugins(String name) {
-		Class result = null;
-		if (pluginLoaders != null) {
-			for (int i = 0;
-				(i < pluginLoaders.length) && (result == null);
-				i++) {
-				try {
-					result = pluginLoaders[i].loadClass(name);
-				} catch (ClassNotFoundException e) {
-					// Ignore exception now. If necessary we'll throw
-					// a ClassNotFoundException in loadClass(String)
-				}
-			}
-		}
-		return result;
-	}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntObject.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntObject.java
deleted file mode 100644
index f3b491b..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntObject.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.eclipse.ant.internal.core;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.net.URL;
-
-public abstract class AntObject {
-
-	protected String fClassName;
-	protected URL fLibrary;
-	protected String fName;
-	
-	/**
-	 * Gets the className.
-	 * @return Returns a String
-	 */
-	public String getClassName() {
-		return fClassName;
-	}
-	/**
-	 * Sets the className.
-	 * @param className The className to set
-	 */
-	public void setClassName(String className) {
-		fClassName = className;
-	}
-	/**
-	 * Gets the library.
-	 * @return Returns a URL
-	 */
-	public URL getLibrary() {
-		return fLibrary;
-	}
-	/**
-	 * Sets the library.
-	 * @param library The library to set
-	 */
-	public void setLibrary(URL library) {
-		fLibrary = library;
-	}
-	
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return fName;
-	}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/IAntCoreConstants.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/IAntCoreConstants.java
deleted file mode 100644
index 5246536..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/IAntCoreConstants.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.eclipse.ant.internal.core;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-/**
- * Common constants.
- */
-public interface IAntCoreConstants {
-
-	// default values
-	public static final String DEFAULT_BUILD_FILENAME = "build.xml"; //$NON-NLS-1$
-
-	// preferences
-	public static final String PREFERENCE_TASKS = "tasks"; //$NON-NLS-1$
-	public static final String PREFERENCE_TYPES = "types"; //$NON-NLS-1$
-	public static final String PREFERENCE_URLS = "urls"; //$NON-NLS-1$
-	
-	public static final String PREFIX_TASK = "task."; //$NON-NLS-1$
-	public static final String PREFIX_TYPE = "type."; //$NON-NLS-1$
-	
-	/**
-	 * Debug constant
-	 * @since 2.1
-	 */
-	public static boolean DEBUG_BUILDFILE_TIMING = false;
-	
-	/**
-	 * Preferences
-	 * @since 2.1
-	 */
-	public static final String PREFERENCE_ANT_URLS = "ant_urls"; //$NON-NLS-1$
-	public static final String PREFERENCE_ANT_HOME = "ant_home"; //$NON-NLS-1$
-	public static final String PREFERENCE_PROPERTIES = "properties"; //$NON-NLS-1$
-	public static final String PREFERENCE_PROPERTY_FILES = "propertyfiles"; //$NON-NLS-1$
-	public static final String PREFIX_PROPERTY = "property."; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/InternalCoreAntMessages.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/InternalCoreAntMessages.java
deleted file mode 100644
index 1a4ab0f..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/InternalCoreAntMessages.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.ant.internal.core;
-
-/**********************************************************************
-Copyright (c) 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class InternalCoreAntMessages {
-
-	private static final String BUNDLE_NAME = "org.eclipse.ant.internal.core.InternalCoreAntMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-	private InternalCoreAntMessages() {
-	}
-
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/InternalCoreAntMessages.properties b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/InternalCoreAntMessages.properties
deleted file mode 100644
index 9a79743..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/InternalCoreAntMessages.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-######################################################################
-# Copyright (c) 2000, 2002 IBM Corp. and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of 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 implementation
-######################################################################
-
-AntCorePreferences.Malformed_URL._1=Malformed URL.
-AntCorePreferences.Library_not_specified_for__{0}_4=Library not specified for: {0}
-
-AntRunner.Could_not_find_one_or_more_classes._Please_check_the_Ant_classpath._1=Could not find one or more classes. Please check the Ant classpath.
-AntRunner.Could_not_find_one_or_more_classes._Please_check_the_Ant_classpath._2=Could not find one or more classes: \"{0}\". Please check the Ant classpath.
-AntRunner.Build_Failed._3=BUILD FAILED
-AntRunner.Buildfile_run_took___9=Buildfile run took: 
-AntRunner._milliseconds._10=\ milliseconds.
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/AntSecurityManager.java b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/AntSecurityManager.java
deleted file mode 100644
index a8c6306..0000000
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/AntSecurityManager.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntMessages.java b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntMessages.java
deleted file mode 100644
index fd7366e..0000000
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntMessages.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.ant.internal.core.ant;
-
-/**********************************************************************
-Copyright (c) 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class InternalAntMessages {
-
-	private static final String BUNDLE_NAME = "org.eclipse.ant.internal.core.ant.InternalAntMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-	private InternalAntMessages() {
-	}
-
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntMessages.properties b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntMessages.properties
deleted file mode 100644
index 6361d0a..0000000
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntMessages.properties
+++ /dev/null
@@ -1,75 +0,0 @@
-######################################################################
-# Copyright (c) 2000, 2002 IBM Corp. and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of 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 implementation
-######################################################################
-
-InternalAntRunner.Build_file__{0}_1=Buildfile: {0}
-InternalAntRunner.Arguments__{0}_2=Arguments: {0}
-InternalAntRunner.Default_target__3=Default target:
-InternalAntRunner.Main_targets__4=Main targets:
-InternalAntRunner.Subtargets__5=Subtargets:
-InternalAntRunner.Unable_to_instantiate_logger__{0}_6=Unable to instantiate logger: {0}
-InternalAntRunner.Ant_version__7=Ant version 
-InternalAntRunner.compiled_on__8=compiled on 
-InternalAntRunner.Could_not_load_the_version_information._{0}_9=Could not load the version information. {0}
-InternalAntRunner.Could_not_load_the_version_information._10=Could not load the version information.
-InternalAntRunner.options_13=options
-InternalAntRunner.target_15=target
-InternalAntRunner.Options___21=Options: 
-InternalAntRunner.print_this_message_23=print this message
-InternalAntRunner.print_project_help_information_25=print project help information
-InternalAntRunner.print_the_version_information_and_exit_27=print the version information and exit
-InternalAntRunner.be_extra_quiet_29=be extra quiet
-InternalAntRunner.be_extra_verbose_31=be extra verbose
-InternalAntRunner.print_debugging_information_33=print debugging information
-InternalAntRunner.produce_logging_information_without_adornments_35=produce logging information without adornments
-InternalAntRunner.use_given_file_for_log_37=use given file for log
-InternalAntRunner.the_class_which_is_to_perform_logging_39=the class which is to perform logging
-InternalAntRunner.add_an_instance_of_class_as_a_project_listener_41=add an instance of class as a project listener
-InternalAntRunner.use_given_buildfile_43=use given buildfile
-InternalAntRunner.use_value_for_given_property_45=use value for given property
-InternalAntRunner.Using_{0}_file_as_build_log._1=Using {0} file as build log.
-InternalAntRunner.Could_not_write_to_the_specified_log_file__{0}._Make_sure_the_path_exists_and_you_have_write_permissions._2=Cannot write on the specified log file: {0}. Make sure the path exists and you have write permissions.
-InternalAntRunner.BUILD_SUCCESSFUL_1=BUILD SUCCESSFUL
-InternalAntRunner.Unknown_argument__{0}_2=Unknown argument: {0}
-InternalAntRunner.Buildfile__{0}_does_not_exist_!_1=Buildfile: {0} does not exist\!
-InternalAntRunner.{0}_which_was_specified_to_be_a_build_listener_is_not_an_instance_of_org.apache.tools.ant.BuildListener._1={0} which was specified to be a build listener is not an instance of org.apache.tools.ant.BuildListener.
-InternalAntRunner.{0}_which_was_specified_to_perform_logging_is_not_an_instance_of_org.apache.tools.ant.BuildLogger._2={0} which was specified to perform logging is not an instance of org.apache.tools.ant.BuildLogger.
-InternalAntRunner.You_must_specify_a_classname_when_using_the_-listener_argument_1=You must specify a classname when using the -listener argument
-InternalAntRunner.You_must_specify_a_classname_when_using_the_-logger_argument_2=You must specify a classname when using the -logger argument
-InternalAntRunner.You_must_specify_a_log_file_when_using_the_-log_argument_3=You must specify a log file when using the -log argument
-InternalAntRunner.You_must_specify_a_buildfile_when_using_the_-buildfile_argument_4=You must specify a buildfile when using the -buildfile argument
-InternalAntRunner.find_option_not_yet_implemented_10=-find option not yet implemented
-InternalAntRunner.print_information_that_might_be_helpful_to_12=print information that might be helpful to
-InternalAntRunner._t_t_t_t_t_t_t_t_t_t_tdiagnose_or_report_problems._13=\t\t\t\t\t\t\t\t\t\t\tdiagnose or report problems.
-InternalAntRunner._t_t_t_t_t_t_t_t_____15=\t\t\t\t\t\t\t\t\'\'
-InternalAntRunner.load_all_properties_from_file_with_-D_19=load all properties from file with -D
-InternalAntRunner._t_t_t_t_t_t_t_t_t_t_tproperties_taking_precedence_20=\t\t\t\t\t\t\t\t\t\t\tproperties taking precedence
-InternalAntRunner.the_class_which_will_handle_input_requests_22=the class which will handle input requests
-InternalAntRunner.search_for_buildfile_towards_the_root_of_the_24=search for buildfile towards the root of the
-InternalAntRunner._t_t_t_t_t_t_t_t_t_t_tfilesystem_and_use_it_25=\t\t\t\t\t\t\t\t\t\t\tfilesystem and use it
-InternalAntRunner._t_t_t_t_t_t_t_____1=\t\t\t\t\t\t\t\'\'
-InternalAntRunner.Class_{0}_not_found_for_task_{1}_1=Class {0} not found for task {1}
-InternalAntRunner.Class_{0}_not_found_for_type_{1}_2=Class {0} not found for type {1}
-InternalAntRunner.Only_one_logger_class_may_be_specified_1=Only one logger class may be specified
-InternalAntRunner.You_must_specify_a_classname_when_using_the_-inputhandler_argument_1=You must specify a classname when using the -inputhandler argument
-InternalAntRunner.Only_one_input_handler_class_may_be_specified._2=Only one input handler class may be specified.
-InternalAntRunner.You_must_specify_a_property_filename_when_using_the_-propertyfile_argument_3=You must specify a property filename when using the -propertyfile argument
-InternalAntRunner.Could_not_load_property_file_{0}__{1}_4=Could not load property file {0}: {1}
-InternalAntRunner.The_specified_input_handler_class_{0}_does_not_implement_the_org.apache.tools.ant.input.InputHandler_interface_5=The specified input handler class {0} does not implement the org.apache.tools.ant.input.InputHandler interface
-InternalAntRunner.Unable_to_instantiate_specified_input_handler_class_{0}___{1}_6=Unable to instantiate specified input handler class {0} : {1}
-InternalAntRunner.Specifying_an_InputHandler_is_an_Ant_1.5.*_feature._Please_update_your_Ant_classpath_to_include_an_Ant_version_greater_than_this._2=Specifying an InputHandler is an Ant 1.5.* feature. Please update your Ant classpath to include an Ant version greater than this.
-InternalAntRunner.The_diagnositics_options_is_an_Ant_1.5.*_feature._Please_update_your_Ant_classpath_to_include_an_Ant_version_greater_than_this._4=The diagnositics options is an Ant 1.5.* feature. Please update your Ant classpath to include an Ant version greater than this.
-InternalAntRunner.Specifying_property_files_is_a_Ant_1.5.*_feature._Please_update_your_Ant_classpath._6=Specifying property files is a Ant 1.5.* feature. Please update your Ant classpath to include an Ant version greater than this.
-InternalAntRunner.Default_target_{0}{1}{2}_does_not_exist_in_this_project_1=Default target {0}{1}{2} does not exist in this project
-InternalAntRunner.ANT_HOME_must_be_set_to_use_Ant_diagnostics_2=ANT_HOME must be set to use Ant diagnostics
-InternalAntRunner.Buildfile__{0}_is_not_a_file_1=Buildfile: {0} is not a file
-
-ProgressBuildListener.Build_cancelled._5=Build cancelled.
-
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java
deleted file mode 100644
index 11f0531..0000000
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/ProgressBuildListener.java b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/ProgressBuildListener.java
deleted file mode 100644
index 105847b..0000000
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/ProgressBuildListener.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.tests.core/.classpath b/ant/org.eclipse.ant.tests.core/.classpath
deleted file mode 100644
index 6026612..0000000
--- a/ant/org.eclipse.ant.tests.core/.classpath
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="test plugin"/>
-    <classpathentry kind="src" path="tests"/>
-    <classpathentry kind="src" path="test support"/>
-    <classpathentry kind="src" path="/org.apache.ant"/>
-    <classpathentry kind="src" path="/org.junit"/>
-    <classpathentry kind="src" path="/org.eclipse.core.resources"/>
-    <classpathentry kind="src" path="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.jdt.core"/>
-    <classpathentry kind="src" path="/org.eclipse.ui"/>
-    <classpathentry kind="src" path="/org.eclipse.ant.core"/>
-    <classpathentry kind="src" path="/org.eclipse.update.core"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/ant/org.eclipse.ant.tests.core/.cvsignore b/ant/org.eclipse.ant.tests.core/.cvsignore
deleted file mode 100644
index 57b480f..0000000
--- a/ant/org.eclipse.ant.tests.core/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-lib
diff --git a/ant/org.eclipse.ant.tests.core/.project b/ant/org.eclipse.ant.tests.core/.project
deleted file mode 100644
index 87d1449..0000000
--- a/ant/org.eclipse.ant.tests.core/.project
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ant.tests.core</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.ant</project>
-		<project>org.apache.xerces</project>
-		<project>org.eclipse.ant.core</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.jdt.core</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.update.core</project>
-		<project>org.junit</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/ant/org.eclipse.ant.tests.core/about.html b/ant/org.eclipse.ant.tests.core/about.html
deleted file mode 100644
index d57b432..0000000
--- a/ant/org.eclipse.ant.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>16th October, 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/ant/org.eclipse.ant.tests.core/build.properties b/ant/org.eclipse.ant.tests.core/build.properties
deleted file mode 100644
index d2b2da2..0000000
--- a/ant/org.eclipse.ant.tests.core/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-bin.includes = plugin.xml,\
-			   plugin.properties,\
-               test.xml,\
-               about.html,\
-               testscripts/,\
-               testresources/,\
-               testlib/,\
-               lib/,\
-               *.jar
-               
-source.anttestscore.jar = test plugin/,\
-                         tests/,\
-                         test support/,\
-                         testresources/,\
-                         scripts/
diff --git a/ant/org.eclipse.ant.tests.core/lib/antTestsSupport.jar b/ant/org.eclipse.ant.tests.core/lib/antTestsSupport.jar
deleted file mode 100644
index fd793ca..0000000
--- a/ant/org.eclipse.ant.tests.core/lib/antTestsSupport.jar
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.tests.core/plugin.properties b/ant/org.eclipse.ant.tests.core/plugin.properties
deleted file mode 100644
index 0c331bc..0000000
--- a/ant/org.eclipse.ant.tests.core/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-######################################################################
-# Copyright (c) 2000, 2002 IBM Corp. and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Common Public License v0.5
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/cpl-v05.html
-#
-# Contributors:
-#    IBM Corporation - Initial implementation
-######################################################################
-
-pluginName=Ant Core Test Plugin
-providerName=Eclipse.org
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.tests.core/plugin.xml b/ant/org.eclipse.ant.tests.core/plugin.xml
deleted file mode 100644
index 7c27732..0000000
--- a/ant/org.eclipse.ant.tests.core/plugin.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<plugin
-   id="org.eclipse.ant.tests.core"
-   name="%pluginName"
-   version="2.1.0"
-   provider-name="%providerName"
-   class="org.eclipse.ant.tests.core.testplugin.AntTestPlugin">
-   
-   <requires>
-      <import plugin="org.apache.ant"/>
-	  <import plugin="org.junit"/>   
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.apache.xerces"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.ant.core"/>
-      <import plugin="org.eclipse.update.core"/>
-   </requires>
-
-<runtime>
-  <library name="anttestscore.jar" >
-     <export name = "*"/>
-  </library> 
-</runtime>
-
-<extension id="app" point="org.eclipse.core.runtime.applications">
-  <application> 
-     <run class="org.eclipse.ant.tests.core.testplugin.TestWorkbench">
-		<parameter name="productInfo" value="product.ini"/>
-     </run>
-  </application>
-</extension>
-
-<extension point="org.eclipse.ant.core.extraClasspathEntries">
-		<extraClasspathEntry
-		library="lib/antTestsSupport.jar">
-	</extraClasspathEntry>
-</extension>
-
-</plugin>
diff --git a/ant/org.eclipse.ant.tests.core/scripts/buildAntTestsSupportJAR.xml b/ant/org.eclipse.ant.tests.core/scripts/buildAntTestsSupportJAR.xml
deleted file mode 100644
index 7a0ca1c..0000000
--- a/ant/org.eclipse.ant.tests.core/scripts/buildAntTestsSupportJAR.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="build tests support jar" default="build" basedir="..">
-
-	<property name="bootclasspath" value=""/>
-
-	<target name="build">
-		<antcall target="clean"/>
-		<antcall target="lib/antTestsSupport.jar"/>
-		<antcall target="refresh"/>
-	</target>
-
-	<target name="init" depends="properties">
-		<property name="plugin" value="org.eclipse.ant.tests.core"/>
-		<property name="version.suffix" value="_2.1.0"/>
-		<property name="full.name" value="${plugin}${version.suffix}"/>
-		<property name="temp.folder" value="${basedir}/temp.folder"/>
-		<property name="plugin.destination" value="${basedir}"/>
-		<property name="build.result.folder" value="${basedir}"/>
-		<property name="win32.jar" value="${basedir}/../org.eclipse.swt.win32/ws/win32/swt.jar"/>
-		<property name="gtk.jar" value="${basedir}/../org.eclipse.swt.gtk/ws/gtk/swt.jar"/>
-		<property name="motif.jar" value="${basedir}/../org.eclipse.swt.motif/ws/motif/swt.jar"/>
-		<available file="${win32.jar}" property="swt.jar" value="${win32.jar}"/>
-		<available file="${gtk.jar}" property="swt.jar" value="${gtk.jar}"/>
-		<available file="${motif.jar}" property="swt.jar" value="${motif.jar}"/>
-	</target>
-
-	<target name="properties" if="eclipse.running">
-		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
-	</target>
-
-	<target name="lib/antTestsSupport.jar" depends="init">
-		<property name="destdir" value="${temp.folder}/lib/antTestsSupport.jar.bin"/>
-		<delete dir="${temp.folder}/lib/antTestsSupport.jar.bin"/>
-		<mkdir dir="${temp.folder}/lib/antTestsSupport.jar.bin"/>
-		<!-- compile the source code -->
-		<javac target="1.3" source="1.3" destdir="${temp.folder}/lib/antTestsSupport.jar.bin" failonerror="false" verbose="false" debug="on" includeAntRuntime="no" bootclasspath="${bootclasspath}" classpath="${basedir}/../org.eclipse.core.runtime/runtime.jar;${basedir}/../org.apache.ant/ant.jar;${basedir}/../org.apache.xerces/xercesImpl.jar;${basedir}/../org.apache.xerces/xmlParserAPIs.jar;${basedir}/bin;${basedir}/../org.eclipse.core.boot/boot.jar;${basedir}/../org.eclipse.ant.core/bin">
-			<src path="test support/"/>
-		</javac>
-		<mkdir dir="${build.result.folder}/lib"/>
-		<jar jarfile="${build.result.folder}/lib/antTestsSupport.jar" basedir="${temp.folder}/lib/antTestsSupport.jar.bin"/>
-		<delete dir="${temp.folder}"/>
-	</target>
-
-	<target name="clean" depends="init">
-		<delete file="${build.result.folder}/lib/antTestsSupport.jar"/>
-		<delete dir="${temp.folder}"/>
-	</target>
-
-	<target name="refresh" depends="init" if="eclipse.running">
-		<eclipse.refreshLocal resource="${plugin}" depth="infinite"/>
-	</target>
-</project>
diff --git a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/AntFileRunner.java b/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/AntFileRunner.java
deleted file mode 100644
index 684638d..0000000
--- a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/AntFileRunner.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.ant.tests.core.testplugin;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import org.eclipse.ant.core.AntRunner;
-import org.eclipse.ant.tests.core.AbstractAntTest;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Responsible for running test ant build files.
- */
-public class AntFileRunner {
-	
-	private static final String BASE_DIR_PREFIX = "-Dbasedir="; //$NON-NLS-1$
-
-	public void run(IFile buildFile, String[] targets, String[] args, String baseDir, boolean captureOutput) throws CoreException {
-	
-		AntRunner runner = new AntRunner();
-
-		String[] runnerArgs = args;
-
-		if (baseDir.length() > 0) {
-			// Ant requires the working directory to be specified
-			// as one of the arguments, so it needs to be appended.
-			int length = 1;
-			if (args != null) {
-				length = args.length + 1;
-			} 
-			
-			runnerArgs = new String[length];
-			if (args != null) {
-				System.arraycopy(args, 0, runnerArgs, 0, args.length);
-			}
-			runnerArgs[length - 1] = BASE_DIR_PREFIX + baseDir;
-		}
-		runner.setArguments(runnerArgs);
-
-		if (buildFile != null) {
-			runner.setBuildFileLocation(buildFile.getLocation().toFile().toString());
-		}
-		if (targets != null && targets.length > 0) {
-			runner.setExecutionTargets(targets);
-		}
-		if (captureOutput) {
-			runner.addBuildLogger(AbstractAntTest.ANT_TEST_BUILD_LOGGER);
-		}
-
-		runner.run(null);
-	}
-	
-	public void run(String[] args, String baseDir) throws Exception {
-	
-		AntRunner runner = new AntRunner();
-
-		String[] runnerArgs = args;
-
-		if (baseDir.length() > 0) {
-			// Ant requires the working directory to be specified
-			// as one of the arguments, so it needs to be appended.
-			runnerArgs = new String[args.length + 1];
-			System.arraycopy(args, 0, runnerArgs, 0, args.length);
-			runnerArgs[args.length] = BASE_DIR_PREFIX + baseDir;
-		}
-		runner.setArguments(runnerArgs);
-
-		runner.run(args);
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/AntTestChecker.java b/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/AntTestChecker.java
deleted file mode 100644
index ccd1ec6..0000000
--- a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/AntTestChecker.java
+++ /dev/null
@@ -1,224 +0,0 @@
-package org.eclipse.ant.tests.core.testplugin;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.util.*;
-import java.util.ArrayList;
-import java.util.List;
-
-public class AntTestChecker {
-	
-	private static AntTestChecker deflt= null;
-	
-	private int taskStartedCount;
-	
-	private int taskFinishedCount;
-	
-	private int targetsStartedCount;
-	
-	private int targetsFinishedCount;
-	
-	private int buildsStartedCount;
-	
-	private int buildsFinishedCount;
-	
-	private List messages= new ArrayList();
-	
-	private List targets= new ArrayList();
-	
-	private List tasks= new ArrayList();
-	
-	private List projects= new ArrayList();
-	
-	private String currentProject;
-	
-	private String currentTask;
-	
-	private String currentTarget;
-	
-	private Hashtable userProperties;
-	
-	private List nameOfListeners= new ArrayList();
-	
-	private AntTestChecker()  {
-	}
-	
-	/**
-	 * Returns the singleton AntLoggerChecker
-	 */
-	public static AntTestChecker getDefault() {
-		if (deflt == null) {
-			deflt= new AntTestChecker();
-		}
-		return deflt;
-	}
-	
-	/**
-	 * Returns the singleton AntLoggerChecker
-	 */
-	public static void reset() {
-		if (deflt != null) {
-			deflt.resetState();
-		}
-	}
-	/**
-	 * @see org.apache.tools.ant.BuildListener#buildFinished(org.apache.tools.ant.BuildEvent)
-	 */
-	public void buildFinished(String projectName) {
-		buildsFinishedCount++;
-	}
-
-	
-	public void buildStarted(String projectName) {
-		buildsStartedCount++;
-		projects.add(projectName);
-		currentProject= projectName;
-	}
-
-	
-	public void messageLogged(String message) {
-		messages.add(message);
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#targetFinished(org.apache.tools.ant.BuildEvent)
-	 */
-	public void targetFinished(String targetName) {
-		targetsFinishedCount++;
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#targetStarted(org.apache.tools.ant.BuildEvent)
-	 */
-	public void targetStarted(String targetName) {
-		targetsStartedCount++;
-		targets.add(targetName);
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#taskFinished(org.apache.tools.ant.BuildEvent)
-	 */
-	public void taskFinished(String taskName) {
-		taskFinishedCount++;
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#taskStarted(org.apache.tools.ant.BuildEvent)
-	 */
-	public void taskStarted(String taskName) {
-		taskStartedCount++;
-		tasks.add(taskName);
-	}
-	
-	/**
-	 * Returns the buildsFinishedCount.
-	 * @return int
-	 */
-	public int getBuildsFinishedCount() {
-		return buildsFinishedCount;
-	}
-
-	/**
-	 * Returns the buildsStartedCount.
-	 * @return int
-	 */
-	public int getBuildsStartedCount() {
-		return buildsStartedCount;
-	}
-
-	/**
-	 * Returns the messagesLoggedCount.
-	 * @return int
-	 */
-	public int getMessagesLoggedCount() {
-		return messages.size();
-	}
-
-	/**
-	 * Returns the targetsFinishedCount.
-	 * @return int
-	 */
-	public int getTargetsFinishedCount() {
-		return targetsFinishedCount;
-	}
-
-	/**
-	 * Returns the targetsStartedCount.
-	 * @return int
-	 */
-	public int getTargetsStartedCount() {
-		return targetsStartedCount;
-	}
-
-	/**
-	 * Returns the taskFinishedCount.
-	 * @return int
-	 */
-	public int getTaskFinishedCount() {
-		return taskFinishedCount;
-	}
-
-	/**
-	 * Returns the taskStartedCount.
-	 * @return int
-	 */
-	public int getTaskStartedCount() {
-		return taskStartedCount;
-	}
-	
-	protected void resetState() {
-		taskStartedCount= 0;
-		taskFinishedCount= 0;
-		targetsStartedCount= 0;
-		targetsFinishedCount= 0;
-		buildsStartedCount= 0;
-		buildsFinishedCount= 0;
-		messages= new ArrayList();
-		tasks= new ArrayList();
-		targets= new ArrayList();
-		projects= new ArrayList();
-		userProperties= null;
-		currentProject= null;
-		currentTarget= null;
-		currentTask= null;
-		nameOfListeners= new ArrayList();
-	}
-	
-	
-	public String getLastMessageLogged() {
-		if (messages.isEmpty()) {
-			return null;
-		}
-		return (String) messages.get(messages.size() - 1);
-	}
-	
-	public void setUserProperties(Hashtable userProperties) {
-		this.userProperties= userProperties;
-	}
-
-	public String getUserProperty(String name) {
-		return (String)userProperties.get(name);
-	}
-	
-	public List getMessages() {
-		return messages;
-	}
-	
-	public List getListeners() {
-		return nameOfListeners;
-	}
-	
-	public String getLastListener() {
-		return (String)nameOfListeners.get(nameOfListeners.size() - 1);
-	}
-
-
-	public void addNameOfListener(String nameOfListener) {
-		this.nameOfListeners.add(nameOfListener);
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/AntTestPlugin.java b/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/AntTestPlugin.java
deleted file mode 100644
index 947b1ea..0000000
--- a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/AntTestPlugin.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.eclipse.ant.tests.core.testplugin;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-
-public class AntTestPlugin extends AbstractUIPlugin {
-	
-	private static AntTestPlugin deflt;
-	
-	public AntTestPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		deflt= this;
-	}
-	
-	public static AntTestPlugin getDefault() {
-		return deflt;
-	}
-	
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-	
-	public static void enableAutobuild(boolean enable) throws CoreException {
-		// disable auto build
-		IWorkspace workspace= AntTestPlugin.getWorkspace();
-		IWorkspaceDescription desc= workspace.getDescription();
-		desc.setAutoBuilding(enable);
-		workspace.setDescription(desc);
-	}
-	
-	public File getFileInPlugin(IPath path) {
-		try {
-			URL installURL= new URL(getDescriptor().getInstallURL(), path.toString());
-			URL localURL= Platform.asLocalURL(installURL);
-			return new File(localURL.getFile());
-		} catch (IOException e) {
-			return null;
-		}
-	}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/Main.java b/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/Main.java
deleted file mode 100644
index e44d2f2..0000000
--- a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/Main.java
+++ /dev/null
@@ -1,531 +0,0 @@
-package org.eclipse.ant.tests.core.testplugin;
-
-// copied from startup.jar. planned to be removed soon
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.io.File;
-import java.io.FileFilter;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.*;
-import java.util.*;
-
-/**
- * Startup class for Eclipse. Creates a class loader using
- * supplied URL of platform installation, loads and calls
- * the Eclipse Boot Loader.  The startup arguments are as follows:
- * <dl>
- * <dd>
- *    -application &lt;id&gt;: the identifier of the application to run
- * </dd>
- * <dd>
- *    -boot &lt;location&gt;: the location, expressed as a URL, of the platform's boot.jar
- * </dd>
- * <dd>
- *    -consolelog : enables log to the console. Handy when combined with -debug
- * </dd>
- * <dd>
- *    -data &lt;location&gt;: sets the workspace location and the default location for projects
- * </dd>
- * <dd>
- *    -debug [options file]: turns on debug mode for the platform and optionally specifies a location
- * for the .options file. This file indicates what debug points are available for a
- * plug-in and whether or not they are enabled. If a location is not specified, the platform searches
- * for the .options file under the install directory
- * </dd>
- * <dd>
- *    -dev [entries]: turns on dev mode and optionally specifies comma-separated class path entries
- * which are added to the class path of each plug-in
- * </dd>
- * <dd>
- *    -keyring &lt;location&gt;: the location of the authorization database on disk. This argument
- * has to be used together with the -password argument
- * </dd>
- * <dd>
- *    -password &lt;passwd&gt;: the password for the authorization database
- * </dd>
- * <dd>
- *    -plugins &lt;location&gt;: The arg is a URL pointing to a file which specs the plugin 
- * path for the platform.  The file is in property file format where the keys are user-defined 
- * names and the values are comma separated lists of either explicit paths to plugin.xml 
- * files or directories containing plugins. (e.g., .../eclipse/plugins).
- * </dd>
- * <dd>
- *    -ws &lt;window system&gt;: sets the window system value
- * </dd>
- * </dl>
- */
-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 identifier of the application to run.
-	 */
-	protected String application;
-	
-	/**
-	 * The path for finding find plugins.
-	 */
-	protected URL pluginPathLocation;
-	
-	/**
-	 * The boot path location.
-	 */
-	protected String location;
-	
-	/**
-	 * Indicates whether items for UNinstallation should be looked for.
-	 */
-	protected boolean uninstall = false;
-	
-	/**
-	 * The item to be uninstalled.
-	 */
-	protected String uninstallCookie;
-	
-	/**
-	 * The class path entries.
-	 */
-	protected String devClassPath = null;
-	
-	/**
-	 * Indicates whether this instance is running in development mode.
-	 */
-	protected boolean inDevelopmentMode = false;
-
-	// static token describing how to take down the splash screen
-	private static String endSplash = null;
-	
-	// constants
-	private static final String APPLICATION = "-application";
-	private static final String BOOT = "-boot";
-	private static final String DEBUG = "-debug";
-	private static final String DEV = "-dev";
-	private static final String ENDSPLASH = "-endsplash";
-	private static final String UNINSTALL = "-uninstall";
-	private static final String PI_BOOT = "org.eclipse.core.boot";
-	private static final String BOOTLOADER = "org.eclipse.core.boot.BootLoader";
-	private static final String UPDATELOADER = "org.eclipse.core.internal.boot.LaunchInfo";
-
-	// The project containing the boot loader code.  This is used to construct
-	// the correct class path for running in VAJ and VAME.
-	private static final String PROJECT_NAME = "Eclipse Core Boot";
-
-	private static boolean inVAJ;
-	static {
-		try {
-			Class.forName("com.ibm.uvm.lang.ProjectClassLoader");
-			inVAJ = true;
-		} catch (Exception e) {
-			inVAJ = false;
-		}
-	}
-	private static boolean inVAME;
-	static {
-		try {
-			Class.forName("com.ibm.eclipse.core.VAME");
-			inVAME = true;
-		} catch (Exception e) {
-			inVAME = false;
-		}
-	}
-
-/**
- * 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 Object basicRun(String[] args) throws Exception {
-	Class clazz = getBootLoader(bootLocation);
-	Method method = clazz.getDeclaredMethod("run", new Class[] { String.class, URL.class, String.class, String[].class });
-	try {
-		return method.invoke(clazz, new Object[] { application, pluginPathLocation, location, args });
-	} catch (InvocationTargetException e) {
-		if (e.getTargetException() instanceof Error)
-			throw (Error) e.getTargetException();
-		else
-			throw e;
-	}
-}
-
-/**
- * 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(""))
-		return new String[0];
-	Vector list = new Vector();
-	StringTokenizer tokens = new StringTokenizer(prop, ",");
-	while (tokens.hasMoreTokens()) {
-		String token = tokens.nextToken().trim();
-		if (!token.equals(""))
-			list.addElement(token);
-	}
-	return list.isEmpty() ? new String[0] : (String[]) list.toArray(new String[0]);
-}
-/**
- * Creates and returns a platform <code>BootLoader</code> which can be used to start
- * up and run the platform.  The given base, if not <code>null</code>,
- * is the location of the boot loader code.  If the value is <code>null</code>
- * then the boot loader is located relative to this class.
- * 
- * @return the new boot loader
- * @param base the location of the boot loader
- */
-public Class getBootLoader(String base) throws Exception {
-	URLClassLoader loader = new URLClassLoader(getBootPath(base), null);
-	return loader.loadClass(BOOTLOADER);
-}
-/**
- * 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
- */
-protected URL[] getDevPath(URL base) throws MalformedURLException {
-	URL url;
-	String devBase = base.toExternalForm();
-	if (!inDevelopmentMode) {
-		url = new URL(devBase + "boot.jar");
-		return new URL[] {url};
-	}
-	String[] locations = getArrayFromList(devClassPath);
-	ArrayList result = new ArrayList(locations.length);
-	for (int i = 0; i < locations.length; i++) {
-		String spec = devBase + locations[i];
-		char lastChar = spec.charAt(spec.length() - 1);
-		if ((spec.endsWith(".jar") || (lastChar == '/' || lastChar == '\\')))
-			url = new URL (spec);
-		else
-			url = new URL(spec + "/");
-		//make sure URL exists before adding to path
-		if (new java.io.File(url.getFile()).exists())
-			result.add(url);
-	}
-	url = new URL(devBase + "boot.jar");
-	if (new java.io.File(url.getFile()).exists())
-		result.add(url);
-	return (URL[])result.toArray(new URL[result.size()]);
-}
-
-/**
- * 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
- */
-protected URL[] getBootPath(String base) throws MalformedURLException {
-	URL url = null;
-	// if the given location is not null, assume it is correct and use it. 
-	if (base != null) {
-		url = new URL(base);
-		if (debug)
-			System.out.println("Boot URL: " + url.toExternalForm());
-		return new URL[] {url};	
-	}
-	// Create a URL based on the location of this class' code.
-	// strip off jar file and/or last directory to get 
-	// to the directory containing projects.
-	URL[] result = null;
-	url = getClass().getProtectionDomain().getCodeSource().getLocation();
-	String path = url.getFile();
-	if (path.endsWith(".jar"))
-		path = path.substring(0, path.lastIndexOf("/"));
-	else 
-		if (path.endsWith("/"))
-			path = path.substring(0, path.length() - 1);
-	if (inVAJ || inVAME) {
-		int ix = path.lastIndexOf("/");
-		path = path.substring(0, ix + 1);
-		path = path + PROJECT_NAME + "/";
-		url = new URL(url.getProtocol(), url.getHost(), url.getPort(), path);
-		result = new URL[] {url};
-	} else {
-		path = searchForPlugins(path);
-		path = searchForBoot(path);
-		// add on any dev path elements
-		url = new URL(url.getProtocol(), url.getHost(), url.getPort(), path);
-		result = getDevPath(url);
-	}
-	if (debug) {
-		System.out.println("Boot URL:");
-		for (int i = 0; i < result.length; i++)
-			System.out.println("    " + result[i].toExternalForm());	
-	}
-	return result;
-}
-
-/**
- * Searches for a plugins root starting at a given location.  If one is
- * found then this location is returned; otherwise an empty string is
- * returned.
- * 
- * @return the location where plugins were found, or an empty string
- * @param start the location to begin searching at
- */
-protected String searchForPlugins(String start) {
-	File path = new File(start);
-	while (path != null) {
-		File test = new File(path, "plugins");
-		if (test.exists())
-			return test.toString();
-		path = path.getParentFile();
-		path = (path == null || path.length() == 1)  ? null : path;
-	}
-	return "";
-}
-/**
- * Searches for a boot directory starting at a given location.  If one
- * is found then this location is returned; otherwise an empty string
- * is returned.
- * 
- * @return the location where plugins were found, or an empty string
- * @param start the location to begin searching at
- */
-protected String searchForBoot(String start) {
-	FileFilter filter = new FileFilter() {
-		public boolean accept(File candidate) {
-			return candidate.getName().startsWith(PI_BOOT);
-		}
-	};
-	File[] boots = new File(start).listFiles(filter);
-	String result = null;
-	String maxVersion = null;
-	for (int i = 0; i < boots.length; i++) {
-		String name = boots[i].getName();
-		int index = name.lastIndexOf('_');
-		if (index == -1) {
-			result = boots[i].getAbsolutePath();
-			i = boots.length;
-		} else {
-			if (index > 0) {
-				String version = name.substring(index + 1);
-				if (maxVersion == null) {
-					result = boots[i].getAbsolutePath();
-					maxVersion = version;
-				} else
-					if (maxVersion.compareTo(version) == -1) {
-						result = boots[i].getAbsolutePath();
-						maxVersion = version;
-					}						
-			}
-		}
-	}
-	if (result == null)
-		throw new RuntimeException("Could not find bootstrap code. Check location of boot plug-in or specify -boot.");
-	return result.replace(File.separatorChar, '/') + "/";
-}
-/**
- * Returns the update loader for the given boot path.
- * 
- * @return the update loader
- * @param base the boot path base
- * @exception Exception thrown is a problem occurs determining this loader
- */
-public Class getUpdateLoader(String base) throws Exception {
-	URLClassLoader loader = new URLClassLoader(getBootPath(base), null);
-	return loader.loadClass(UPDATELOADER);
-}
-/**
- * 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>.
- *
- * @see #run
- * 
- * @param args the command line arguments
- */
-public static void main(String[] args) {
-	Object result = null;
-	try {
-		result = new Main().run(args);
-	} catch (Throwable e) {
-		// try and take down the splash screen.
-		endSplash();
-		System.out.println("Exception launching the Eclipse Platform:");
-		e.printStackTrace();
-	}
-	int exitCode = result instanceof Integer ? ((Integer) result).intValue() : 0;
-	System.exit(exitCode);
-}
-/**
- * Tears down the currently-displayed splash screen.
- */
-public static void endSplash() {
-	if (endSplash == null)
-		return;
-	try {
-		Runtime.getRuntime().exec(endSplash);
-	} catch (Exception e) {
-	}
-}
-
-/**
- * Runs this launcher with the arguments specified in the given string.
- * 
- * @param argString the arguments string
- * @exception Exception thrown if a problem occurs during launching
- */
-public static void main(String argString) throws Exception {
-	Vector list = new Vector(5);
-	for (StringTokenizer tokens = new StringTokenizer(argString, " "); tokens.hasMoreElements();)
-		list.addElement((String) tokens.nextElement());
-	main((String[]) list.toArray(new String[list.size()]));
-}
-
-/**
- * Processes the command line arguments
- * 
- * @return the arguments to pass through to the launched application
- * @param args the command line arguments
- */
-protected String[] processCommandLine(String[] args) throws Exception {
-	int[] configArgs = new int[100];
-	configArgs[0] = -1; // need to initialize the first element to something that could not be an index.
-	int configArgIndex = 0;
-	for (int i = 0; i < args.length; i++) {
-		boolean found = false;
-		// check for args without parameters (i.e., a flag arg)
-		// 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;
-		}
-		
-		// 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("-"))))) {
-			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;
-		}
-		// 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("-")) 
-			continue;
-		String arg = args[++i];
-
-		// look for the laucher to run
-		if (args[i - 1].equalsIgnoreCase(BOOT)) {
-			bootLocation = arg;
-			found = true;
-		}
-
-		// look for the development mode and class path entries.  
-		if (args[i - 1].equalsIgnoreCase(DEV)) {
-			inDevelopmentMode = true;
-			devClassPath = arg;
-			continue;
-		}
-
-		// look for the application to run
-		if (args[i - 1].equalsIgnoreCase(APPLICATION)) {
-			application = arg;
-			found = true;
-		}
-
-		// look for token to use to end the splash screen
-		if (args[i - 1].equalsIgnoreCase(ENDSPLASH)) {
-			endSplash = arg;
-			continue;
-		}
-
-		// look for items to uninstall
-		if (args[i - 1].equalsIgnoreCase(UNINSTALL)) {
-			uninstall = true;
-			uninstallCookie = 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
-	if (configArgIndex == 0)
-		return args;
-	String[] passThruArgs = new String[args.length - configArgIndex];
-	configArgIndex = 0;
-	int j = 0;
-	for (int i = 0; i < args.length; i++) {
-		if (i == configArgs[configArgIndex])
-			configArgIndex++;
-		else
-			passThruArgs[j++] = args[i];
-	}
-	return passThruArgs;
-}
-/**
- * Runs the application to be launched.
- * 
- * @return the return value from the launched application
- * @param args the arguments to pass to the application
- * @exception thrown if a problem occurs during launching
- */
-public Object run(String[] args) throws Exception {
-	String[] passThruArgs = processCommandLine(args);
-	if (uninstall)
-		return updateRun(UNINSTALL, uninstallCookie, passThruArgs);
-	else
-		return basicRun(passThruArgs);
-}
-/**
- * Performs an update run.
- * 
- * @return the return value from the update loader
- * @param flag flag to give to the update loader
- * @param value value to give to the update loader
- * @param args arguments to give to the update loader.
- * @exception Exception thrown if a problem occurs during execution
- */
-protected Object updateRun(String flag, String value, String[] args) throws Exception {
-	Class clazz = getUpdateLoader(bootLocation);
-	Method method = clazz.getDeclaredMethod("run", new Class[] { String.class, String.class, String.class, String[].class });
-	try {
-		return method.invoke(clazz, new Object[] { flag, value, location, args });
-	} catch (InvocationTargetException e) {
-		if (e.getTargetException() instanceof Error)
-			throw (Error) e.getTargetException();
-		else
-			throw e;
-	}
-}
-}
diff --git a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/NewMain.java b/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/NewMain.java
deleted file mode 100644
index c40c273..0000000
--- a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/NewMain.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.ant.tests.core.testplugin;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.io.*;
-import java.net.URL;
-import java.util.*;
-
-/** 
- * Application is responsible for calling core launch api
- */
-
-public class NewMain extends Main {
-	private static final String DEFAULT_APPLICATION= "org.eclipse.ui.workbench";
-	
-	
-	public NewMain(String application, String location, URL pluginPathLocation, String bootLocation, boolean debug) throws IOException {
-		this.application= application;
-		this.location= location;
-		this.pluginPathLocation= pluginPathLocation;
-		this.bootLocation= bootLocation;
-	}
-	
-	public static void main(String[] args) {
-		try {
-			String location= getLocationFromProperties("platform");
-			new NewMain(DEFAULT_APPLICATION, location, null, null, true).run(args);
-		} catch (Throwable e) {
-			System.out.println("Exception launching the Eclipse Platform UI:");
-			e.printStackTrace();
-		}
-		System.exit(0);
-	}
-	
-
-	/**
-	 * Run this launcher with the arguments specified in the given string.
-	 * This is a short cut method for people running the launcher from
-	 * a scrapbook (i.e., swip-and-doit facility).
-	 */
-	public static void main(String argString) throws Exception {
-		Vector list= new Vector(5);
-		for (StringTokenizer tokens= new StringTokenizer(argString, " "); tokens.hasMoreElements();)
-			list.addElement((String) tokens.nextElement());
-		main((String[]) list.toArray(new String[list.size()]));
-	}
-	
-	public static String getLocationFromProperties(String key) {
-		Properties properties= new Properties();
-		try {
-			FileInputStream fis= new FileInputStream(getSettingsFile());
-			properties.load(fis);
-			return properties.getProperty(key);
-		} catch (IOException e) {
-		}
-		return null;
-	}	
-	
-	private static File getSettingsFile() {
-		String home= System.getProperty("user.home");
-		if (home == null) {
-			System.out.println("Home dir not defined");
-			return null;
-		}
-		return new File(home, "eclipse-workspaces.properties");	
-	}	
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/ProjectHelper.java b/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/ProjectHelper.java
deleted file mode 100644
index a73c02f..0000000
--- a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/ProjectHelper.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package org.eclipse.ant.tests.core.testplugin;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.*;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.wizards.datatransfer.*;
-
-/**
- * Helper methods to set up an IProject.
- */
-public class ProjectHelper {
-	
-	public static final IPath TEST_SCRIPTS_DIR= new Path("testscripts");
-	public static final IPath TEST_RESOURCES_DIR= new Path("testresources");	
-	public static final IPath TEST_LIB_DIR= new Path("testlib");
-	
-	/**
-	 * Creates a IProject.
-	 */	
-	public static IProject createProject(String projectName, String binFolderName) throws CoreException {
-		IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
-		IProject project= root.getProject(projectName);
-		if (!project.exists()) {
-			project.create(null);
-		} else {
-			project.refreshLocal(IResource.DEPTH_INFINITE, null);
-		}
-		
-		if (!project.isOpen()) {
-			project.open(null);
-		}
-		
-		return project;
-	}
-	
-	/**
-	 * Removes an IProject.
-	 */		
-	public static void delete(IProject project) throws CoreException {
-		project.delete(true, true, null);
-	}
-
-
-	/**
-	 * Adds a folder to an IProject.
-	 */		
-	public static IFolder addFolder(IProject project, String containerName) throws CoreException {
-		
-			IFolder folder= project.getFolder(containerName);
-			if (!folder.exists()) {
-				folder.create(false, true, null);
-			}
-		
-		return folder;
-		
-	}
-
-	private static void addNatureToProject(IProject proj, String natureId, IProgressMonitor monitor) throws CoreException {
-		IProjectDescription description = proj.getDescription();
-		String[] prevNatures= description.getNatureIds();
-		String[] newNatures= new String[prevNatures.length + 1];
-		System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
-		newNatures[prevNatures.length]= natureId;
-		description.setNatureIds(newNatures);
-		proj.setDescription(description, monitor);
-	}
-	
-	private static void importFilesFromZip(ZipFile srcZipFile, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException {		
-		ZipFileStructureProvider structureProvider=	new ZipFileStructureProvider(srcZipFile);
-		try {
-			ImportOperation op= new ImportOperation(destPath, structureProvider.getRoot(), structureProvider, new ImportOverwriteQuery());
-			op.run(monitor);
-		} catch (InterruptedException e) {
-			// should not happen
-		}
-	}
-	
-	public static void importFilesFromDirectory(File rootDir, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException, IOException {		
-		IImportStructureProvider structureProvider = FileSystemStructureProvider.INSTANCE;
-		List files = new ArrayList(100);
-		addFiles(rootDir, files);
-		try {
-			ImportOperation op= new ImportOperation(destPath, rootDir, structureProvider, new ImportOverwriteQuery(), files);
-			op.setCreateContainerStructure(false);
-			op.run(monitor);
-		} catch (InterruptedException e) {
-			// should not happen
-		}
-	}	
-	
-	private static void addFiles(File dir, List collection) throws IOException {
-		File[] files = dir.listFiles();
-		List subDirs = new ArrayList(2);
-		for (int i = 0; i < files.length; i++) {
-			if (files[i].isFile()) {
-				collection.add(files[i]);
-			} else if (files[i].isDirectory()) {
-				subDirs.add(files[i]);
-			}
-		}
-		Iterator iter = subDirs.iterator();
-		while (iter.hasNext()) {
-			File subDir = (File)iter.next();
-			addFiles(subDir, collection);
-		}
-	}
-	
-	private static class ImportOverwriteQuery implements IOverwriteQuery {
-		public String queryOverwrite(String file) {
-			return ALL;
-		}	
-	}			
-}
-
diff --git a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/TestPluginLauncher.java b/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/TestPluginLauncher.java
deleted file mode 100644
index a712c69..0000000
--- a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/TestPluginLauncher.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.ant.tests.core.testplugin;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.net.URL;
-
-/**
- * Helper class to launch a test
- */
-public class TestPluginLauncher {
-	
-	public static final String APP_NAME= "org.eclipse.ant.tests.core.app";
-	
-	public static void run(String location, Class testCase, String[] args) {
-		run(APP_NAME, location, testCase, args);
-	}
-	
-	public static void run(String application, String location, Class testCase, String[] args) {
-		try {
-			String bootLocation= getBootLocation();
-			int nArgs= args.length;
-			String[] newArgs= new String[4 + nArgs];
-			newArgs[0]= testCase.getName();
-			for (int i= 0; i < nArgs; i++) {
-				newArgs[1 + i]= args[i];
-			}
-			newArgs[1 + nArgs]= "-dev";
-			newArgs[1 + nArgs + 1]= "bin";
-			newArgs[1 + nArgs + 2]= "-debug";
-			NewMain newMain= new NewMain(application, location, null, bootLocation, false);
-			newMain.run(newArgs);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-	
-	public static String getLocationFromProperties(String key) {
-		return NewMain.getLocationFromProperties(key);
-	}
-	
-	public static String getLocationFromProperties() {
-		return NewMain.getLocationFromProperties("tests");
-	}
-	
-	public static String getBootLocation() {
-		URL url= TestPluginLauncher.class.getResource("TestPluginLauncher.class");
-		String s= url.toString();
-		int index= s.indexOf("/org.eclipse.ant.tests.core");
-		if (index == -1)
-			throw new IllegalArgumentException();
-		s= s.substring(0, index);
-		s= s + "/org.eclipse.core.boot/boot.jar";
-		return s;
-	}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/TestWorkbench.java b/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/TestWorkbench.java
deleted file mode 100644
index 973734b..0000000
--- a/ant/org.eclipse.ant.tests.core/test plugin/org/eclipse/ant/tests/core/testplugin/TestWorkbench.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.eclipse.ant.tests.core.testplugin;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import junit.textui.TestRunner;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.internal.Workbench;
-
-public class TestWorkbench extends Workbench {
-
-	/**
-	 * Run an event loop for the workbench.
-	 */
-	protected void runEventLoop() {
-		// Dispatch all events.
-		Display display = Display.getCurrent();
-		while (true) {
-			try {
-				if (!display.readAndDispatch())
-					break;
-			} catch (Throwable e) {
-				break;
-			}
-		}
-		IPath location= AntTestPlugin.getWorkspace().getRoot().getLocation();
-		System.out.println("Workspace-location: " + location.toString());
-				
-		
-		String[] args= getCommandLineArgs();
-		if (args.length > 2) {
-			try {
-				Test test= getTest(args[2]);
-				TestRunner.run(test);
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		} else {
-			System.out.println("TestWorkbench: Argument must be class name");
-		}
-				
-		close();
-				
-	}
-	
-	public Test getTest(String className) throws Exception {
-		Class testClass= getClass().getClassLoader().loadClass(className);
-
-		Method suiteMethod= null;
-		try {
-			suiteMethod= testClass.getMethod(TestRunner.SUITE_METHODNAME, new Class[0]);
-	 	} catch (Exception e) {
-	 		// try to extract a test suite automatically	
-			return new TestSuite(testClass);
-		}
-		try {
-			return (Test) suiteMethod.invoke(null, new Class[0]); // static method
-		} catch (InvocationTargetException e) {
-			System.out.println("Failed to invoke suite():" + e.getTargetException().toString());
-		} catch (IllegalAccessException e) {
-			System.out.println("Failed to invoke suite():" + e.toString());
-		}
-		return null; 
-
-	}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/inputHandlers/AntTestInputHandler.java b/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/inputHandlers/AntTestInputHandler.java
deleted file mode 100644
index dd876ff..0000000
--- a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/inputHandlers/AntTestInputHandler.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.ant.tests.core.inputHandlers;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.input.DefaultInputHandler;
-import org.apache.tools.ant.input.InputRequest;
-
-/**
- * A test input handler when using Ant within Eclipse.
- * This is the class that will respond to <input> requests from
- * within an Ant build file.
- */
-public class AntTestInputHandler extends DefaultInputHandler {
-	
-	/**
-	 * @see org.apache.tools.ant.input.InputHandler#handleInput(org.apache.tools.ant.input.InputRequest)
-	 */
-	public void handleInput(InputRequest request) throws BuildException {
-		request.setInput("testing handling input requests");
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/tasks/AntTestTask.java b/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/tasks/AntTestTask.java
deleted file mode 100644
index cdafacd..0000000
--- a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/tasks/AntTestTask.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.ant.tests.core.tasks;
-
-/**********************************************************************
-Copyright (c) 2002 IBM Corp. and others. All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.taskdefs.Echo;
-
-
-public class AntTestTask extends Task {
-	
-	public AntTestTask() {
-		super();
-	}
-	
-	/**
-	 * @see org.apache.tools.ant.Task#execute()
-	 */
-	public void execute() throws BuildException {
-		Echo echo= new Echo();
-		echo.setProject(getProject());
-		echo.setMessage("Testing Ant in Eclipse with a custom task");
-		echo.execute();
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/tasks/AntTestTaskWithCustomType.java b/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/tasks/AntTestTaskWithCustomType.java
deleted file mode 100644
index 9fe76a0..0000000
--- a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/tasks/AntTestTaskWithCustomType.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.ant.tests.core.tasks;
-
-/**********************************************************************
-Copyright (c) 2002 IBM Corp. and others. All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.taskdefs.Echo;
-import org.eclipse.ant.tests.core.types.AntTestType;
-
-
-public class AntTestTaskWithCustomType extends Task {
-	
-	AntTestType testType;
-	
-	public AntTestTaskWithCustomType() {
-		super();
-	}
-	
-	public void addAntTestType(AntTestType type) {
-		testType= type;
-	}
-	
-	/**
-	 * @see org.apache.tools.ant.Task#execute()
-	 */
-	public void execute() throws BuildException {
-		Echo echo= new Echo();
-		echo.setProject(getProject());
-		echo.setMessage(testType.getMessage());
-		echo.execute();
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/testloggers/TestBuildListener.java b/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/testloggers/TestBuildListener.java
deleted file mode 100644
index 1759122..0000000
--- a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/testloggers/TestBuildListener.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.ant.tests.core.testloggers;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.BuildListener;
-import org.eclipse.ant.tests.core.testplugin.AntTestChecker;
-
-
-public class TestBuildListener implements BuildListener {
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#buildFinished(org.apache.tools.ant.BuildEvent)
-	 */
-	public void buildFinished(BuildEvent event) {
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#buildStarted(org.apache.tools.ant.BuildEvent)
-	 */
-	public void buildStarted(BuildEvent event) {
-		AntTestChecker.getDefault().addNameOfListener(this.getClass().getName());
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#messageLogged(org.apache.tools.ant.BuildEvent)
-	 */
-	public void messageLogged(BuildEvent event) {
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#targetFinished(org.apache.tools.ant.BuildEvent)
-	 */
-	public void targetFinished(BuildEvent event) {
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#targetStarted(org.apache.tools.ant.BuildEvent)
-	 */
-	public void targetStarted(BuildEvent event) {
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#taskFinished(org.apache.tools.ant.BuildEvent)
-	 */
-	public void taskFinished(BuildEvent event) {
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#taskStarted(org.apache.tools.ant.BuildEvent)
-	 */
-	public void taskStarted(BuildEvent event) {
-	}
-
-}
diff --git a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/testloggers/TestBuildLogger.java b/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/testloggers/TestBuildLogger.java
deleted file mode 100644
index f94fe96..0000000
--- a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/testloggers/TestBuildLogger.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package org.eclipse.ant.tests.core.testloggers;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.io.PrintStream;
-
-import org.apache.tools.ant.*;
-import org.eclipse.ant.core.AntSecurityException;
-import org.eclipse.ant.tests.core.testplugin.AntTestChecker;
-import org.eclipse.core.runtime.OperationCanceledException;
-
-public class TestBuildLogger implements BuildLogger {
-
-	private int messageOutputLevel =Project.MSG_INFO;
-	private PrintStream fErr= null;
-	private PrintStream fOut= null;
-	
-	/**
-	 * An exception that has already been logged.
-	 */
-	private Throwable fHandledException= null;
-	
-	
-	public TestBuildLogger() {
-	}
-	
-	/**
-	 * @see org.apache.tools.ant.BuildLogger#setMessageOutputLevel(int)
-	 */
-	public void setMessageOutputLevel(int level) {
-		messageOutputLevel= level;
-	}
-	
-	protected int getMessageOutputLevel() {
-		return messageOutputLevel;
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildLogger#setEmacsMode(boolean)
-	 */
-	public void setEmacsMode(boolean emacsMode) {
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#buildStarted(org.apache.tools.ant.BuildEvent)
-	 */
-	public void buildStarted(BuildEvent event) {
-		AntTestChecker.getDefault().buildStarted(event.getProject().getName());
-		AntTestChecker.getDefault().setUserProperties(event.getProject().getProperties());
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#buildFinished(org.apache.tools.ant.BuildEvent)
-	 */
-	public void buildFinished(BuildEvent event) {
-		handleException(event);
-		fHandledException= null;
-		AntTestChecker.getDefault().buildFinished(event.getProject().getName());
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#targetStarted(org.apache.tools.ant.BuildEvent)
-	 */
-	public void targetStarted(BuildEvent event) {
-		AntTestChecker.getDefault().targetStarted(event.getTarget().getName());
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#targetFinished(org.apache.tools.ant.BuildEvent)
-	 */
-	public void targetFinished(BuildEvent event) {
-		handleException(event);
-		AntTestChecker.getDefault().targetFinished(event.getTarget().getName());
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#taskStarted(org.apache.tools.ant.BuildEvent)
-	 */
-	public void taskStarted(BuildEvent event) {
-		AntTestChecker.getDefault().taskStarted(event.getTask().getTaskName());
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildListener#taskFinished(org.apache.tools.ant.BuildEvent)
-	 */
-	public void taskFinished(BuildEvent event) {
-		handleException(event);
-		AntTestChecker.getDefault().targetFinished(event.getTask().getTaskName());
-	}
-
-	/**
-	 * @see BuildListener#messageLogged(BuildEvent)
-	 */
-	public void messageLogged(BuildEvent event) {
-		if (event.getPriority() > getMessageOutputLevel()) {
-			return;
-		}
-		logMessage(event.getMessage(), event.getPriority());
-		AntTestChecker.getDefault().messageLogged(event.getMessage());
-	}
-
-	protected PrintStream getErrorPrintStream() {
-		return fErr;
-	}
-	
-	protected PrintStream getOutputPrintStream() {
-		return fOut;
-	}
-	
-	/**
-	 * @see org.apache.tools.ant.BuildLogger#setErrorPrintStream(java.io.PrintStream)
-	 */
-	public void setErrorPrintStream(PrintStream err) {
-		//this build logger logs to "null" unless
-		//the user has explicitly set a logfile to use
-		if (err == System.err) {
-			fErr= null;
-		} else {
-			fErr= err;
-		}
-	}
-
-	/**
-	 * @see org.apache.tools.ant.BuildLogger#setOutputPrintStream(java.io.PrintStream)
-	 */
-	public void setOutputPrintStream(PrintStream output) {
-		//this build logger logs to "null" unless
-		//the user has explicitly set a logfile to use
-		if (output == System.out) {
-			fOut= null;
-		} else {
-			fOut= output;
-		}
-	}
-	
-	protected void logMessage(String message, int priority) {
-		if (priority > getMessageOutputLevel()) {
-			return;
-		}
-		
-		if (priority == Project.MSG_ERR) {
-			if (getErrorPrintStream() != null && getErrorPrintStream() != System.err) {
-				//user has designated to log to a logfile
-				getErrorPrintStream().println(message);
-			}
-		} else {
-			if (getOutputPrintStream() != null && getOutputPrintStream() != System.out) {
-				//user has designated to log to a logfile
-				getOutputPrintStream().println(message);
-			} 
-		}
-	}
-	
-	protected void handleException(BuildEvent event) {
-		Throwable exception = event.getException();
-		if (exception == null || exception == fHandledException
-		|| exception instanceof OperationCanceledException
-		|| exception instanceof AntSecurityException) {
-			return;
-		}
-		fHandledException= exception;
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/types/AntTestType.java b/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/types/AntTestType.java
deleted file mode 100644
index 9182acc..0000000
--- a/ant/org.eclipse.ant.tests.core/test support/org/eclipse/ant/tests/core/types/AntTestType.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.ant.tests.core.types;
-
-/**********************************************************************
-Copyright (c) 2002 IBM Corp. and others. All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-
-
-public class AntTestType {
-	
-	String message;
-	
-	public AntTestType() {
-	}
-	
-	public void setMessage(String message) {
-		this.message= message;
-	}
-	
-	public String getMessage() {
-		return message;
-	}
-	
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.tests.core/test.xml b/ant/org.eclipse.ant.tests.core/test.xml
deleted file mode 100644
index 47d3ab0..0000000
--- a/ant/org.eclipse.ant.tests.core/test.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0"?>
-
-<project name="testsuite" default="run" basedir=".">
-  <!-- sets the properties eclipse-home, and library-file -->
-  <!-- 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}\..\.."/>
-<property name="plugin-name" value="org.eclipse.ant.tests.core"/>
-  <property name="library-file"
-            value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
- 
-  <!-- This target holds all initialization code that needs to be done for -->
-  <!-- all tests that are to be run. Initialization for individual tests -->
-  <!-- should be done within the body of the suite target. -->
-  <target name="init">
-    <tstamp/>
-    <delete>
-      <fileset dir="${eclipse-home}" includes="org*.xml"/>
-    </delete>
-  </target>
-
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite">
-    <property name="jdt-folder" 
-              value="${eclipse-home}/jdt_folder"/>
-    <delete dir="${jdt-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${jdt-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" 
-                value="org.eclipse.ant.tests.core.AutomatedSuite"/>
-    </ant>
-  </target>
-
-  <!-- This target holds code to cleanup the testing environment after -->
-  <!-- after all of the tests have been run. You can use this target to -->
-  <!-- delete temporary files that have been created. -->
-  <target name="cleanup">
-  </target>
-
-  <!-- This target runs the test suite. Any actions that need to happen -->
-  <!-- after all the tests have been run should go here. -->
-  <target name="run" depends="init,suite,cleanup">
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org*.xml"/>
-      <property name="output-file" value="${plugin-name}.xml"/>
-    </ant>
-  </target>
-
-</project>
diff --git a/ant/org.eclipse.ant.tests.core/testlib/classpathOrdering1.jar b/ant/org.eclipse.ant.tests.core/testlib/classpathOrdering1.jar
deleted file mode 100644
index b10cb7f..0000000
--- a/ant/org.eclipse.ant.tests.core/testlib/classpathOrdering1.jar
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.tests.core/testlib/classpathOrdering2.jar b/ant/org.eclipse.ant.tests.core/testlib/classpathOrdering2.jar
deleted file mode 100644
index 6816741..0000000
--- a/ant/org.eclipse.ant.tests.core/testlib/classpathOrdering2.jar
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.tests.core/testresources/AntTestTask.java b/ant/org.eclipse.ant.tests.core/testresources/AntTestTask.java
deleted file mode 100644
index dfd0c4d..0000000
--- a/ant/org.eclipse.ant.tests.core/testresources/AntTestTask.java
+++ /dev/null
@@ -1,30 +0,0 @@
-
- /**********************************************************************
-Copyright (c) 2002 IBM Corp. and others. All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.taskdefs.Echo;
-
-
-public class AntTestTask extends Task {
-	
-	public AntTestTask() {
-		super();
-	}
-	
-	/**
-	 * @see org.apache.tools.ant.Task#execute()
-	 */
-	public void execute() throws BuildException {
-		Echo echo= new Echo();
-		echo.setProject(getProject());
-		echo.setMessage("Testing Ant in Eclipse with a custom task");
-		echo.execute();
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/testresources/test.properties b/ant/org.eclipse.ant.tests.core/testresources/test.properties
deleted file mode 100644
index 5c496c6..0000000
--- a/ant/org.eclipse.ant.tests.core/testresources/test.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-AntTests=testing from properties file
-eclipse.is.cool=Yep
diff --git a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/AbstractAntTest.java b/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/AbstractAntTest.java
deleted file mode 100644
index bc9049c..0000000
--- a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/AbstractAntTest.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/AutomatedSuite.java b/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/AutomatedSuite.java
deleted file mode 100644
index abbdd85..0000000
--- a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/AutomatedSuite.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.eclipse.ant.tests.core;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.util.Enumeration;
-
-import junit.framework.*;
-
-import org.eclipse.ant.tests.core.testplugin.TestPluginLauncher;
-import org.eclipse.ant.tests.core.tests.*;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Test all areas of Ant.
- * 
- * To run this test suite:
- * <ol>
- * <li>Create a new Run-time Workbench launch configuration</li>
- * <li>Append "org.eclipse.ant.tests.core.AutomatedSuite" to the Program Arguments</li>
- * <li>Set the Application Name to "org.eclipse.ant.tests.core.app"</li>
- * <li>Run the launch configuration. Output from the tests will be written to the debug console</li>
- * </ol>
- */
-public class AutomatedSuite extends TestSuite {
-	
-	/**
-	 * Flag that indicates test are in progress
-	 */
-	protected boolean testing = true;
-
-	/**
-	 * Returns the suite.  This is required to
-	 * use the JUnit Launcher.
-	 */
-	public static Test suite() {
-		return new AutomatedSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public AutomatedSuite() {
-		addTest(new TestSuite(ProjectCreationDecorator.class));
-		addTest(new TestSuite(FrameworkTests.class));
-		addTest(new TestSuite(TargetTests.class));
-		addTest(new TestSuite(ProjectTests.class));
-		addTest(new TestSuite(OptionTests.class));
-		addTest(new TestSuite(TaskTests.class));
-		addTest(new TestSuite(TypeTests.class));
-	}
-	
-	public static void main(String[] args) {
-		TestPluginLauncher.run(TestPluginLauncher.getLocationFromProperties(), AutomatedSuite.class, args);
-	}		
-
-	/**
-	 * Runs the tests and collects their result in a TestResult.
-	 * The Ant tests cannot be run in the UI thread or the event
-	 * waiter blocks the UI when a resource changes.
-	 */
-	public void run(final TestResult result) {
-		final Display display = Display.getCurrent();
-		Thread thread = null;
-		try {
-			Runnable r = new Runnable() {
-				public void run() {
-					for (Enumeration e= tests(); e.hasMoreElements(); ) {
-				  		if (result.shouldStop() )
-				  			break;
-						Test test= (Test)e.nextElement();
-						runTest(test, result);
-					}					
-					testing = false;
-					display.wake();
-				}
-			};
-			thread = new Thread(r);
-			thread.start();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-				
-		while (testing) {
-			try {
-				if (!display.readAndDispatch())
-					display.sleep();
-			} catch (Throwable e) {
-				e.printStackTrace();
-			}			
-		}		
-	}
-}
-
diff --git a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/ProjectCreationDecorator.java b/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/ProjectCreationDecorator.java
deleted file mode 100644
index 3f0a985..0000000
--- a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/ProjectCreationDecorator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.eclipse.ant.tests.core;
-
-/**********************************************************************
-Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.io.File;
-
-import org.eclipse.ant.tests.core.testplugin.AntTestPlugin;
-import org.eclipse.ant.tests.core.testplugin.ProjectHelper;
-import org.eclipse.core.resources.*;
-
-/**
- * Test to close the workbench, since debug tests do not run in the UI
- * thread.
- */
-public class ProjectCreationDecorator extends AbstractAntTest {
-	
-	public ProjectCreationDecorator(String name) {
-		super(name);
-	}
-	
-	public void testProjectCreation() throws Exception {
-		// delete any pre-existing project
-		IProject pro = ResourcesPlugin.getWorkspace().getRoot().getProject("AntTests");
-		if (pro.exists()) {
-			pro.delete(true, true, null);
-		}
-		// create project and import scripts and support files
-		project = ProjectHelper.createProject("AntTests", "bin");
-		IFolder folder = ProjectHelper.addFolder(project, "scripts");
-		File root = AntTestPlugin.getDefault().getFileInPlugin(ProjectHelper.TEST_SCRIPTS_DIR);
-		ProjectHelper.importFilesFromDirectory(root, folder.getFullPath(), null);
-		
-		folder = ProjectHelper.addFolder(project, "resources");
-		root = AntTestPlugin.getDefault().getFileInPlugin(ProjectHelper.TEST_RESOURCES_DIR);
-		ProjectHelper.importFilesFromDirectory(root, folder.getFullPath(), null);
-		
-		folder = ProjectHelper.addFolder(project, "lib");
-		root = AntTestPlugin.getDefault().getFileInPlugin(ProjectHelper.TEST_LIB_DIR);
-		ProjectHelper.importFilesFromDirectory(root, folder.getFullPath(), null);
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/FrameworkTests.java b/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/FrameworkTests.java
deleted file mode 100644
index 7e82983..0000000
--- a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/FrameworkTests.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package org.eclipse.ant.tests.core.tests;
-
-/**********************************************************************
-Copyright (c) 2002 IBM Corp. and others. All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.ant.core.AntCorePlugin;
-import org.eclipse.ant.core.AntCorePreferences;
-import org.eclipse.ant.core.Property;
-import org.eclipse.ant.tests.core.AbstractAntTest;
-import org.eclipse.ant.tests.core.testplugin.AntTestChecker;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-
-public class FrameworkTests extends AbstractAntTest {
-	
-	public FrameworkTests(String name) {
-		super(name);
-	}
-	
-	public void testClasspathOrdering() throws MalformedURLException, CoreException {
-		AntCorePreferences prefs =AntCorePlugin.getPlugin().getPreferences();
-		
-		String path= getProject().getFolder("lib").getFile("classpathOrdering1.jar").getLocation().toFile().getAbsolutePath();
-		URL url= new URL("file:" + path);
-		
-		path= getProject().getFolder("lib").getFile("classpathOrdering2.jar").getLocation().toFile().getAbsolutePath();
-		URL url2= new URL("file:" + path);
-		
-		URL urls[] = prefs.getCustomURLs();
-		URL newUrls[] = new URL[urls.length + 2];
-		System.arraycopy(urls, 0, newUrls, 0, urls.length);
-		newUrls[urls.length] = url;
-		newUrls[urls.length + 1] = url2;
-		prefs.setCustomURLs(newUrls);
-		
-		prefs.updatePluginPreferences();
-		
-		run("ClasspathOrdering.xml");
-		String msg= (String)AntTestChecker.getDefault().getMessages().get(1);
-		assertTrue("Message incorrect: " + msg, msg.equals("classpathOrdering1"));
-		assertSuccessful();
-		
-		restorePreferenceDefaults();
-		
-		urls = prefs.getCustomURLs();
-		newUrls = new URL[urls.length + 2];
-		System.arraycopy(urls, 0, newUrls, 0, urls.length);
-		newUrls[urls.length] = url2;
-		newUrls[urls.length + 1] = url;
-		prefs.setCustomURLs(newUrls);
-		
-		prefs.updatePluginPreferences();
-		
-		run("ClasspathOrdering.xml");
-		msg= (String)AntTestChecker.getDefault().getMessages().get(1);
-		assertTrue("Message incorrect: " + msg, msg.equals("classpathOrdering2"));
-		assertSuccessful();
-	}
-	
-	public void testNoDefaultTarget() {
-		try {
-			run("NoDefault.xml", new String[]{"test"}, false);
-		} catch (CoreException e) {
-			String msg= e.getMessage();
-			assertTrue("Message incorrect: " + msg, msg.equals("Default target 'build' does not exist in this project"));
-			return;
-		}
-		assertTrue("Build files with no default targets should not be accepted", false);
-	}
-	
-	/**
-	 * Ensures that tasks like javac work when includeAntRuntime is specified
-	 * bug 20857
-	 */
-	public void testIncludeAntRuntime() throws CoreException {
-		run("javac.xml", new String[]{"build","refresh"}, false); //standard compiler
-		assertSuccessful();
-		IFile classFile= getProject().getFolder("temp.folder").getFolder("javac.bin").getFile("AntTestTask.class");
-		assertTrue("Class file was not generated", classFile.exists());
-		run("javac.xml", new String[]{"-Duse.eclipse.compiler=true", "clean", "build", "refresh"}, false); //JDTCompiler
-		assertSuccessful();
-		classFile= getProject().getFolder("temp.folder").getFolder("javac.bin").getFile("AntTestTask.class");
-		assertTrue("Class file was not generated", classFile.exists());
-	}
-	
-	/**
-	 * Tests the properties added using a global property file
-	 */
-	public void testGlobalPropertyFile() throws CoreException {
-		
-		AntCorePreferences prefs =AntCorePlugin.getPlugin().getPreferences();
-		
-		String path= getPropertyFileName();
-		prefs.setCustomPropertyFiles(new String[]{path});
-		
-		run("TestForEcho.xml", new String[]{});
-		assertSuccessful();
-		assertTrue("eclipse.is.cool should have been set as Yep", "Yep".equals(AntTestChecker.getDefault().getUserProperty("eclipse.is.cool")));
-		assertTrue("AntTests should have a value of testing", "testing from properties file".equals(AntTestChecker.getDefault().getUserProperty("AntTests")));
-		assertNull("my.name was not set and should be null", AntTestChecker.getDefault().getUserProperty("my.name"));
-		
-		restorePreferenceDefaults();
-	}
-	
-	/**
-	 * Tests the properties added using a global property
-	 */
-	public void testGlobalProperty() throws CoreException {
-		
-		AntCorePreferences prefs =AntCorePlugin.getPlugin().getPreferences();
-		prefs.setCustomProperties(new Property[]{new Property("eclipse.is.cool", "Yep"), new Property("JUnitTest", "true")});
-		
-		run("TestForEcho.xml", new String[]{});
-		assertSuccessful();
-		assertTrue("eclipse.is.cool should have been set as Yep", "Yep".equals(AntTestChecker.getDefault().getUserProperty("eclipse.is.cool")));
-		assertTrue("JUnitTests should have a value of true", "true".equals(AntTestChecker.getDefault().getUserProperty("JUnitTest")));
-		assertNull("my.name was not set and should be null", AntTestChecker.getDefault().getUserProperty("my.name"));
-		
-		restorePreferenceDefaults();
-	}
-	
-	public void testGlobalPropertyFileWithMinusDTakingPrecedence() throws CoreException {
-		AntCorePreferences prefs =AntCorePlugin.getPlugin().getPreferences();
-		
-		String path= getPropertyFileName();
-		prefs.setCustomPropertyFiles(new String[]{path});
-		
-		run("echoing.xml", new String[]{"-DAntTests=testing", "-Declipse.is.cool=true"}, false);
-		assertSuccessful();
-		assertTrue("eclipse.is.cool should have been set as true", "true".equals(AntTestChecker.getDefault().getUserProperty("eclipse.is.cool")));
-		assertTrue("AntTests should have a value of testing", "testing".equals(AntTestChecker.getDefault().getUserProperty("AntTests")));
-		assertNull("my.name was not set and should be null", AntTestChecker.getDefault().getUserProperty("my.name"));
-		restorePreferenceDefaults();
-	}
-	
-	/**
-	 * Tests setting ANT_HOME
-	 */
-	public void testSettingAntHome() throws CoreException {
-		try {
-			AntCorePlugin.getPlugin().getPreferences().setAntHome(getAntHome());
-			run("echoing.xml");
-			assertTrue("ANT_HOME not set correctly", getAntHome().equals(System.getProperty("ant.home")));
-			AntCorePlugin.getPlugin().getPreferences().setAntHome("");
-			run("echoing.xml");
-			assertTrue("ANT_HOME not set correctly", "".equals(System.getProperty("ant.home")));
-		} finally {
-			restorePreferenceDefaults();
-		}
-		
-		
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/OptionTests.java b/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/OptionTests.java
deleted file mode 100644
index 496ac66..0000000
--- a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/OptionTests.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/ProjectTests.java b/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/ProjectTests.java
deleted file mode 100644
index 62359ee..0000000
--- a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/ProjectTests.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.eclipse.ant.tests.core.tests;
-
-/**********************************************************************
-Copyright (c) 2002 IBM Corp. and others. All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import org.eclipse.ant.tests.core.AbstractAntTest;
-import org.eclipse.ant.tests.core.testplugin.AntTestChecker;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-
-
-public class ProjectTests extends AbstractAntTest {
-	
-	public ProjectTests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * Tests that the three properties that should always be set are correct
-	 */
-	public void testBasePropertiesSet() throws CoreException {
-		String buildFileName="TestForEcho.xml"; 
-		run(buildFileName);
-		IFile buildFile= getBuildFile(buildFileName);
-		String fullName= buildFile.getLocation().toFile().getAbsolutePath();
-		assertTrue("eclipse.running should have been set as true", "true".equals(AntTestChecker.getDefault().getUserProperty("eclipse.running")));
-		assertTrue("ant.file should have been set as the build file name", fullName.equals(AntTestChecker.getDefault().getUserProperty("ant.file")));
-		assertNotNull("ant.version should have been set", AntTestChecker.getDefault().getUserProperty("ant.version"));
-	}
-}
-
diff --git a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/TargetTests.java b/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/TargetTests.java
deleted file mode 100644
index e40d176..0000000
--- a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/TargetTests.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/TaskTests.java b/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/TaskTests.java
deleted file mode 100644
index 711fea8..0000000
--- a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/TaskTests.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.eclipse.ant.tests.core.tests;
-
-/**********************************************************************
-Copyright (c) 2002 IBM Corp. and others. All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.ant.core.AntCorePlugin;
-import org.eclipse.ant.core.AntCorePreferences;
-import org.eclipse.ant.core.Task;
-import org.eclipse.ant.tests.core.AbstractAntTest;
-import org.eclipse.ant.tests.core.testplugin.AntTestChecker;
-import org.eclipse.core.runtime.CoreException;
-
-public class TaskTests extends AbstractAntTest {
-
-	
-	public TaskTests(String name) {
-		super(name);
-	}
-	
-	public void testAddTask() throws MalformedURLException, CoreException {
-		AntCorePreferences prefs =AntCorePlugin.getPlugin().getPreferences();
-		Task newTask= new Task();
-		String path= getProject().getFolder("lib").getFile("antTestsSupport.jar").getLocation().toFile().getAbsolutePath();
-		URL url= new URL("file:" + path);
-		URL urls[] = prefs.getCustomURLs();
-		URL newUrls[] = new URL[urls.length + 1];
-		System.arraycopy(urls, 0, newUrls, 0, urls.length);
-		newUrls[urls.length] = url;
-		prefs.setCustomURLs(newUrls);
-		
-		newTask.setLibrary(url);
-		newTask.setTaskName("AntTestTask");
-		newTask.setClassName("org.eclipse.ant.tests.core.tasks.AntTestTask");
-		prefs.setCustomTasks(new Task[]{newTask});
-		
-		prefs.updatePluginPreferences();
-		
-		run("CustomTask.xml");
-		String msg= (String)AntTestChecker.getDefault().getMessages().get(1);
-		assertTrue("Message incorrect: " + msg, msg.equals("Testing Ant in Eclipse with a custom task"));
-		assertSuccessful();
-	}
-	
-	public void testRemoveTask() throws CoreException {
-		AntCorePreferences prefs =AntCorePlugin.getPlugin().getPreferences();
-		prefs.setCustomTasks(new Task[]{});
-		try {
-			run("CustomTask.xml");
-		} catch (CoreException ce) {
-			assertTrue("Exception from undefined task is incorrect", ce.getMessage().endsWith("as this is not an Ant bug."));
-			return;
-		}
-		assertTrue("Build should have failed as task no longer defined", false);
-		restorePreferenceDefaults();
-	}
-}
diff --git a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/TypeTests.java b/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/TypeTests.java
deleted file mode 100644
index d88e01f..0000000
--- a/ant/org.eclipse.ant.tests.core/tests/org/eclipse/ant/tests/core/tests/TypeTests.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.eclipse.ant.tests.core.tests;
-
-/**********************************************************************
-Copyright (c) 2002 IBM Corp. and others. All rights reserved.
-This file is made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.ant.core.*;
-import org.eclipse.ant.core.AntCorePlugin;
-import org.eclipse.ant.core.AntCorePreferences;
-import org.eclipse.ant.core.Type;
-import org.eclipse.ant.tests.core.AbstractAntTest;
-import org.eclipse.ant.tests.core.testplugin.AntTestChecker;
-import org.eclipse.core.runtime.CoreException;
-
-public class TypeTests extends AbstractAntTest {
-
-	public TypeTests(String name) {
-		super(name);
-	}
-
-	public void testAddType() throws MalformedURLException, CoreException {
-		AntCorePreferences prefs =AntCorePlugin.getPlugin().getPreferences();
-		Type newType= new Type();
-		String path= getProject().getFolder("lib").getFile("antTestsSupport.jar").getLocation().toFile().getAbsolutePath();
-		URL url= new URL("file:" + path);
-		newType.setLibrary(url);
-		newType.setTypeName("AntTestType");
-		newType.setClassName("org.eclipse.ant.tests.core.types.AntTestType");
-		prefs.setCustomTypes(new Type[]{newType});
-		
-		Task newTask= new Task();
-		path= getProject().getFolder("lib").getFile("antTestsSupport.jar").getLocation().toFile().getAbsolutePath();
-		url= new URL("file:" + path);
-		newTask.setLibrary(url);
-		newTask.setTaskName("AntTestTaskWithCustomType");
-		newTask.setClassName("org.eclipse.ant.tests.core.tasks.AntTestTaskWithCustomType");
-		prefs.setCustomTasks(new Task[]{newTask});
-		
-		run("CustomType.xml");
-		String msg= (String)AntTestChecker.getDefault().getMessages().get(1);
-		assertTrue("Message incorrect: " + msg, msg.equals("Test adding a custom type"));
-		assertSuccessful();
-	}
-	
-	/*public void testRemoveType() throws CoreException {
-		AntCorePreferences prefs =AntCorePlugin.getPlugin().getPreferences();
-		prefs.setCustomTypes(new Type[]{});
-		try {
-			run("CustomType.xml");
-		} catch (CoreException ce) {
-			assertTrue("Exception from undefined type is incorrect", ce.getMessage().endsWith("as this is not an Ant bug."));
-			return;
-		}
-		assertTrue("Build should have failed as type no longer defined", false);
-		restorePreferenceDefaults();
-	}*/
-}
diff --git a/ant/org.eclipse.ant.tests.core/testscripts/ClasspathOrdering.xml b/ant/org.eclipse.ant.tests.core/testscripts/ClasspathOrdering.xml
deleted file mode 100644
index c99b65e..0000000
--- a/ant/org.eclipse.ant.tests.core/testscripts/ClasspathOrdering.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<project name="ClasspathOrdering" default="ordered" basedir="..">
-
-	<target name="ordered">
-		<java classname= "ClasspathOrdering"/>
-	</target>
-</project>
diff --git a/ant/org.eclipse.ant.tests.core/testscripts/CustomTask.xml b/ant/org.eclipse.ant.tests.core/testscripts/CustomTask.xml
deleted file mode 100644
index c9dc442..0000000
--- a/ant/org.eclipse.ant.tests.core/testscripts/CustomTask.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<project name="Custom Task" default="Custom Task" basedir=".">
-	<target name="init">
-		<tstamp/>
-	</target>
-
-	<target name="Custom Task" description= "Test adding a custom task" depends="init">
-		<AntTestTask/>
-	</target>
-</project>
diff --git a/ant/org.eclipse.ant.tests.core/testscripts/CustomType.xml b/ant/org.eclipse.ant.tests.core/testscripts/CustomType.xml
deleted file mode 100644
index 3082c96..0000000
--- a/ant/org.eclipse.ant.tests.core/testscripts/CustomType.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<project name="Custom Type" default="Custom Type" basedir=".">
-	<target name="init">
-		<tstamp/>
-	</target>
-
-	<target name="Custom Type" description= "Test adding a custom type" depends="init">
-		<AntTestTaskWithCustomType>
-			<AntTestType message="Test adding a custom type"/>
-		</AntTestTaskWithCustomType>
-	</target>
-</project>
diff --git a/ant/org.eclipse.ant.tests.core/testscripts/NoDefault.xml b/ant/org.eclipse.ant.tests.core/testscripts/NoDefault.xml
deleted file mode 100644
index 305d7e9..0000000
--- a/ant/org.eclipse.ant.tests.core/testscripts/NoDefault.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<project name= "Testing" default="build">
-
-	<target name= "test">
-		<echo message="testing"/>
-	</target>
-</project>
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.tests.core/testscripts/TestForEcho.xml b/ant/org.eclipse.ant.tests.core/testscripts/TestForEcho.xml
deleted file mode 100644
index d177497..0000000
--- a/ant/org.eclipse.ant.tests.core/testscripts/TestForEcho.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<project name="Echo Test" default="Test for Echo" basedir=".">
-	<target name="init">
-		<tstamp/>
-	</target>
-
-	<target name="Test for Echo" description= "Calls other echos" depends="init">
-		<ant antfile="scripts/echoing.xml" dir="../../AntTests" target="echo1"/>
-		<ant antfile="scripts/echoing.xml" dir="../../AntTests" target="echo2"/>
-		<ant antfile="scripts/echoing.xml" dir="../../AntTests" target="echo3"/>
-	</target>
-</project>
diff --git a/ant/org.eclipse.ant.tests.core/testscripts/build.xml b/ant/org.eclipse.ant.tests.core/testscripts/build.xml
deleted file mode 100644
index 7638a53..0000000
--- a/ant/org.eclipse.ant.tests.core/testscripts/build.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<project name="Eching" default="echo1" basedir="..">
-
-	<target name="echo1">
-		<echo message="echo1"/>
-	</target>
-	
-	<target name="echo2">
-		<echo message="echo2"/>
-	</target>
-	
-	<target name="echo3" description= "An echo3!">
-		<echo message="echo3"/>
-	</target>
-</project>
diff --git a/ant/org.eclipse.ant.tests.core/testscripts/echoing.xml b/ant/org.eclipse.ant.tests.core/testscripts/echoing.xml
deleted file mode 100644
index 7638a53..0000000
--- a/ant/org.eclipse.ant.tests.core/testscripts/echoing.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<project name="Eching" default="echo1" basedir="..">
-
-	<target name="echo1">
-		<echo message="echo1"/>
-	</target>
-	
-	<target name="echo2">
-		<echo message="echo2"/>
-	</target>
-	
-	<target name="echo3" description= "An echo3!">
-		<echo message="echo3"/>
-	</target>
-</project>
diff --git a/ant/org.eclipse.ant.tests.core/testscripts/input.xml b/ant/org.eclipse.ant.tests.core/testscripts/input.xml
deleted file mode 100644
index 8d70ab5..0000000
--- a/ant/org.eclipse.ant.tests.core/testscripts/input.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<project name="input testing" default= "input test">
-	<target name="input test">
-		<input message="Enter for echo" addproperty= "inputTest">
-		</input>
-		<echo message="${inputTest}"/>
-	</target>	
-</project>
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.tests.core/testscripts/javac.xml b/ant/org.eclipse.ant.tests.core/testscripts/javac.xml
deleted file mode 100644
index 42f0225..0000000
--- a/ant/org.eclipse.ant.tests.core/testscripts/javac.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.ant.core" default="build" basedir="..">
-
-	
-	<target name="init" depends="properties">
-		<property name="plugin" value="AntTests"/>
-		<property name="temp.folder" value="${basedir}/temp.folder"/>
-		<property name="plugin.destination" value="${basedir}"/>
-		<property name="build.result.folder" value="${basedir}"/>
-	</target>
-	
-	<target name="properties" if="use.eclipse.JDTCompiler">
-		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
-	</target>
-	
-	<target name="build" depends="init">
-		<property name="destdir" value="${temp.folder}/javac.bin"/>
-		<delete dir="${temp.folder}/javac.bin"/>
-		<mkdir dir="${temp.folder}/javac.bin"/>
-		<!-- compile the source code -->
-		<javac destdir="${temp.folder}/javac.bin" failonerror="false" verbose="false" debug="on" includeAntRuntime="yes">
-			<src path="resources"/>
-		</javac>
-	</target>
-	
-	<target name="clean" depends="init">
-		<delete dir="${temp.folder}"/>
-	</target>
-
-	<target name="refresh" depends="init" if="eclipse.running">
-		<eclipse.refreshLocal resource="${plugin}" depth="infinite"/>
-	</target>
-</project>
diff --git a/ant/org.eclipse.ant.ui/.classpath b/ant/org.eclipse.ant.ui/.classpath
deleted file mode 100644
index 6b2a02d..0000000
--- a/ant/org.eclipse.ant.ui/.classpath
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/ant/org.eclipse.ant.ui/.cvsignore b/ant/org.eclipse.ant.ui/.cvsignore
deleted file mode 100644
index 57b480f..0000000
--- a/ant/org.eclipse.ant.ui/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-lib
diff --git a/ant/org.eclipse.ant.ui/.project b/ant/org.eclipse.ant.ui/.project
deleted file mode 100644
index 24f7c98..0000000
--- a/ant/org.eclipse.ant.ui/.project
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ant.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.team.cvs.core.cvsnature</nature>
-	</natures>
-</projectDescription>
diff --git a/ant/org.eclipse.ant.ui/README.txt b/ant/org.eclipse.ant.ui/README.txt
deleted file mode 100644
index c21ea37..0000000
--- a/ant/org.eclipse.ant.ui/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-The org.eclipse.ant.ui plug-in is now considered to be obsolete.
-
-The functionality previously available in this project has been absorbed by
-the org.eclipse.ui.externaltools project.
-
-Please refer to the org.eclipse.ui.externaltools project for current implementation.
diff --git a/platform/org.eclipse.platform/.classpath b/platform/org.eclipse.platform/.classpath
deleted file mode 100644
index dbbc1d8..0000000
--- a/platform/org.eclipse.platform/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="src" path="src"/>
-    <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 ba077a4..0000000
--- a/platform/org.eclipse.platform/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/platform/org.eclipse.platform/.eclipseproduct b/platform/org.eclipse.platform/.eclipseproduct
deleted file mode 100644
index 4fd1b09..0000000
--- a/platform/org.eclipse.platform/.eclipseproduct
+++ /dev/null
@@ -1,3 +0,0 @@
-name=Eclipse Platform
-id=org.eclipse.platform
-version=2.0.0
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/.project b/platform/org.eclipse.platform/.project
deleted file mode 100644
index 824510e..0000000
--- a/platform/org.eclipse.platform/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.platform</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/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 862cc4f..0000000
--- a/platform/org.eclipse.platform/about.ini
+++ /dev/null
@@ -1,34 +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)
-# Maximum 15 lines and 75 characters per line.
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-windowImage=eclipse.gif
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image.
-# Full-sized product image: no larger than 500x330 pixels
-# Half-sized product image: no larger than 250x330 pixels
-# A full-sized product image is shown without the "aboutText" blurb.
-# A half-sized product image is shown with the "aboutText" blurb beside it.
-aboutImage=eclipse_lg.gif
-
-# Property "appName" contains name of the application (translated)
-appName=%appName
-
-# 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
-
diff --git a/platform/org.eclipse.platform/about.mappings b/platform/org.eclipse.platform/about.mappings
deleted file mode 100644
index 720ca87..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 47579a7..0000000
--- a/platform/org.eclipse.platform/about.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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.
-
-appName=Eclipse
-
-blurb=Eclipse Platform\n\
-\n\
-Version: 2.1\n\
-Build id: {0}\n\
-\n\
-(c) Copyright IBM Corp. and others 2000, 2002.  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 20a43da..0000000
--- a/platform/org.eclipse.platform/build.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-source.startup.jar=src/
-
-src.includes=about.html
-
-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,\
-welcome.xml
-
-# note: the following files are intentionally not listed in bin.includes
-#    install.ini
-#    cpl-v10.html
-#    notice.html
-#    startup.jar
-# these files need to end up as root files in <install>/eclipse/
diff --git a/platform/org.eclipse.platform/cpl-v10.html b/platform/org.eclipse.platform/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/platform/org.eclipse.platform/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/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/install.ini b/platform/org.eclipse.platform/install.ini
deleted file mode 100644
index f004e5f..0000000
--- a/platform/org.eclipse.platform/install.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-# install.ini 
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-# Required property "feature.default.id" contains id of the primary feature
-# (the primary feature controls product branding, splash screens, and plug-in
-# customization)
-feature.default.id=org.eclipse.platform
-
-# Required property "feature.default.application" contains id of the core
-# application that gets control on startup. For products with a UI, this
-# is always org.eclipse.ui.workbench; for "headless" products, this is
-# product-specific.
-feature.default.application=org.eclipse.ui.workbench
diff --git a/platform/org.eclipse.platform/notice.html b/platform/org.eclipse.platform/notice.html
deleted file mode 100644
index 00d784b..0000000
--- a/platform/org.eclipse.platform/notice.html
+++ /dev/null
@@ -1,53 +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>17th June, 2002</p>
-
-<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>
-
-<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.  The Abouts, Feature Licenses and Feature Update Licenses may refer to the CPL or other license agreements, notices or terms and conditions . It is your obligation to read and accept all such all 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>
-
-<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/platform/org.eclipse.platform/plugin.properties b/platform/org.eclipse.platform/plugin.properties
deleted file mode 100644
index c79ef30..0000000
--- a/platform/org.eclipse.platform/plugin.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-pluginName=Eclipse Platform
-providerName=Eclipse.org
\ No newline at end of file
diff --git a/platform/org.eclipse.platform/plugin.xml b/platform/org.eclipse.platform/plugin.xml
deleted file mode 100644
index e5ec1d0..0000000
--- a/platform/org.eclipse.platform/plugin.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-  name="%pluginName"
-  id="org.eclipse.platform"
-  version="2.1.0"
-  provider-name="%providerName">
-  
-  <runtime>
-  	<library name="startup.jar" />
-  </runtime>
-  
-</plugin>
diff --git a/platform/org.eclipse.platform/plugin_customization.ini b/platform/org.eclipse.platform/plugin_customization.ini
deleted file mode 100644
index 2ac113b..0000000
--- a/platform/org.eclipse.platform/plugin_customization.ini
+++ /dev/null
@@ -1,16 +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
-
-
-
-
-
diff --git a/platform/org.eclipse.platform/plugin_customization.properties b/platform/org.eclipse.platform/plugin_customization.properties
deleted file mode 100644
index 64cee2c..0000000
--- a/platform/org.eclipse.platform/plugin_customization.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-# 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 f93c262..0000000
--- a/platform/org.eclipse.platform/splash.bmp
+++ /dev/null
Binary files differ
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 e569aec..0000000
--- a/platform/org.eclipse.platform/src/org/eclipse/core/launcher/Main.java
+++ /dev/null
@@ -1,1414 +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 v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- * IBM - 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.*;
-
-/**
- * Startup class for Eclipse. Creates a class loader using
- * supplied URL of platform installation, loads and calls
- * the Eclipse Boot Loader.  The startup arguments are as follows:
- * <dl>
- * <dd>
- *    -application &lt;id&gt;: the identifier of the application to run
- * </dd>
- * <dd>
- *    -boot &lt;location&gt;: the location, expressed as a URL, of the platform's boot.jar
- * </dd>
- * <dd>
- *    -consolelog : enables log to the console. Handy when combined with -debug
- * </dd>
- * <dd>
- *    -data &lt;location&gt;: sets the workspace location and the default location for projects
- * </dd>
- * <dd>
- *    -debug [options file]: turns on debug mode for the platform and optionally specifies a location
- * for the .options file. This file indicates what debug points are available for a
- * plug-in and whether or not they are enabled. If a location is not specified, the platform searches
- * for the .options file under the install directory
- * </dd>
- * <dd>
- *    -dev [entries]: turns on dev mode and optionally specifies comma-separated class path entries
- * which are added to the class path of each plug-in
- * </dd>
- * <dd>
- *    -keyring &lt;location&gt;: the location of the authorization database on disk. This argument
- * has to be used together with the -password argument
- * </dd>
- * <dd>
- *    -password &lt;passwd&gt;: the password for the authorization database
- * </dd>
- * <dd>
- *    -plugins &lt;location&gt;: The arg is a URL pointing to a file which specs the plugin 
- * path for the platform.  The file is in property file format where the keys are user-defined 
- * names and the values are comma separated lists of either explicit paths to plugin.xml 
- * files or directories containing plugins. (e.g., .../eclipse/plugins).
- * </dd>
- * <dd>
- *    -ws &lt;window system&gt;: sets the window system value
- * </dd>
- * </dl>
- */
-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 String rootLocation = null;
-	
-	/**
-	 * The identifier of the application to run.
-	 */
-	protected String application;
-	
-	/**
-	 * The identifier of the feature to run.
-	 */
-	protected String feature;
-	
-	/**
-	 * The identifier of the configuration to use.
-	 */
-	protected String configuration;
-	
-	/**
-	 * The path for finding find plugins.
-	 */
-	protected URL pluginPathLocation;
-	
-	/**
-	 * The boot path location.
-	 */
-	protected String location;		
-		
-	/**
-	 * The class path entries.
-	 */
-	protected String devClassPath = null;
-	
-	/**
-	 * Indicates whether this instance is running in development mode.
-	 */
-	protected boolean inDevelopmentMode = false;
-
-	// splash handling
-	private String showSplash = null; 
-	private String endSplash = null; 
-	private boolean cmdInitialize = false;
-	private boolean cmdFirstUse = false;
-	private Process showProcess = null;
-	private boolean splashDown = false; 
-	private final Runnable endSplashHandler = new Runnable() {
-		public void run() {
-			takeDownSplash();
-		}
-	}; 
-	
-	// configuration properties
-	private Properties props = new Properties();
-	private HashMap featureIndex = new HashMap();
-	private String baseLocation = null;
-	
-	// constants
-	private static final String APPLICATION = "-application"; //$NON-NLS-1$
-	private static final String BOOT = "-boot"; //$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 DEBUG = "-debug"; //$NON-NLS-1$
-	private static final String DEV = "-dev"; //$NON-NLS-1$
-	private static final String DATA = "-data"; //$NON-NLS-1$
-	private static final String CONFIGURATION = "-configuration"; //$NON-NLS-1$
-	private static final String FEATURE = "-feature"; //$NON-NLS-1$
-	private static final String SHOWSPLASH = "-showsplash"; //$NON-NLS-1$
-	private static final String ENDSPLASH = "-endsplash"; //$NON-NLS-1$
-	private static final String FIRST_USE = "-firstuse"; //$NON-NLS-1$
-	private static final String SPLASH_IMAGE = "splash.bmp"; //$NON-NLS-1$
-	private static final String PI_BOOT = "org.eclipse.core.boot"; //$NON-NLS-1$
-	private static final String BOOTLOADER = "org.eclipse.core.boot.BootLoader"; //$NON-NLS-1$
-	private static final String BOOTJAR = "boot.jar"; //$NON-NLS-1$
-	private static final String PLATFORM_URL = "platform:/base/"; //$NON-NLS-1$
-	
-	// constants: configuration file location
-	private static final String CONFIG_FILE = "platform.cfg"; //$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 ARG_USER_DIR = "user.dir"; //$NON-NLS-1$
-	
-	// constants: configuration file elements
-	private static final String CFG_CORE_BOOT = "bootstrap." + PI_BOOT;  //$NON-NLS-1$
-	private static final String CFG_FEATURE_ENTRY = "feature"; //$NON-NLS-1$
-	private static final String CFG_FEATURE_ENTRY_DEFAULT = "feature.default.id"; //$NON-NLS-1$
-	private static final String CFG_FEATURE_ENTRY_ID = "id"; //$NON-NLS-1$
-	private static final String CFG_FEATURE_ENTRY_ROOT = "root"; //$NON-NLS-1$
-	private static final String CFG_EOF = "eof"; //$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 static File logFile = null;
-	protected static BufferedWriter log = null;
-	protected static String[] arguments;
-	protected static boolean newSession = true;
-
-	static class Identifier {
-		private static final String DELIM = ". "; //$NON-NLS-1$
-		private int major, minor, service;
-		private Identifier(int major, int minor, int service) {
-			super();
-			this.major = major;
-			this.minor = minor;
-			this.service = service;
-		}
-		private 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());
-
-			// service
-			if (tokenizer.hasMoreTokens())
-				service = Integer.parseInt(tokenizer.nextToken());
-		}
-		/**
-		 * 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
-		 */
-		private 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 Object basicRun(String[] args) throws Exception {
-	// 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
-	Class clazz = getBootLoader(bootPath);
-	Method method = clazz.getDeclaredMethod("run", new Class[] { String.class, URL.class, String.class, String[].class, Runnable.class }); //$NON-NLS-1$
-	try {
-		return method.invoke(clazz, new Object[] { application, pluginPathLocation, location, args, endSplashHandler });
-	} catch (InvocationTargetException e) {
-		if (e.getTargetException() instanceof Error)
-			throw (Error) e.getTargetException();
-		else
-			throw e;
-	}
-}
-/**
- * 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
- */
-protected 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[0]);
-}
-/**
- * Creates and returns a platform <code>BootLoader</code> which can be used to start
- * up and run the platform.  
- * 
- * @return the new boot loader
- * @param path search path for the BootLoader
- */
-public Class getBootLoader(URL[] path) throws Exception {
-	URLClassLoader loader = new URLClassLoader(path, null);
-	return loader.loadClass(BOOTLOADER);
-}
-/**
- * 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
- */
-protected URL[] getDevPath(URL base) throws MalformedURLException {
-	URL url;
-	String devBase = base.toExternalForm();
-	if (!inDevelopmentMode) {
-		url = new URL(devBase + BOOTJAR);
-		return new URL[] {url};
-	}
-	String[] locations = getArrayFromList(devClassPath);
-	ArrayList result = new ArrayList(locations.length);
-	for (int i = 0; i < locations.length; i++) {
-		String spec = devBase + locations[i];
-		char lastChar = spec.charAt(spec.length() - 1);
-		if ((spec.endsWith(".jar") || (lastChar == '/' || lastChar == '\\'))) //$NON-NLS-1$
-			url = new URL (spec);
-		else
-			url = new URL(spec + "/"); //$NON-NLS-1$
-		//make sure URL exists before adding to path
-		if (new java.io.File(url.getFile()).exists())
-			result.add(url);
-	}
-	url = new URL(devBase + BOOTJAR);
-	if (new java.io.File(url.getFile()).exists())
-		result.add(url);
-	return (URL[])result.toArray(new URL[result.size()]);
-}
-
-/**
- * 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
- */
-protected URL[] getBootPath(String base) throws MalformedURLException {
-	URL url = null;
-	// if the given location is not null, assume it is correct and use it. 
-	if (base != null) {
-		url = new URL(base);
-		if (debug)
-			System.out.println("Boot URL: " + url.toExternalForm()); //$NON-NLS-1$
-		return new URL[] {url};	
-	}
-	// search for boot in root location
-	URL[] result = null;
-	url = new URL(rootLocation);
-	String path = url.getFile();
-	path = searchForBoot(path);
-	// add on any dev path elements
-	url = new URL(url.getProtocol(), url.getHost(), url.getPort(), path);
-	result = getDevPath(url);
-	if (debug) {
-		System.out.println("Boot URL:"); //$NON-NLS-1$
-		for (int i = 0; i < result.length; i++)
-			System.out.println("    " + result[i].toExternalForm()); //$NON-NLS-1$
-	}
-	return result;
-}
-
-/**
- * Searches for a boot 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 boot directory was found
- * @param start the location to begin searching at
- */
-protected String searchForBoot(String start) {
-	FileFilter filter = new FileFilter() {
-		public boolean accept(File candidate) {
-			return candidate.isDirectory() &&
-				(candidate.getName().equals(PI_BOOT)
-				|| candidate.getName().startsWith(PI_BOOT + "_")); //$NON-NLS-1$
-		}
-	};
-	File[] boots = new File(start, "plugins").listFiles(filter); //$NON-NLS-1$
-	if (boots == null)
-		throw new RuntimeException("Could not find bootstrap code. Check location of boot plug-in or specify -boot."); //$NON-NLS-1$
-	String result = null;
-	Object maxVersion = null;
-	for (int i = 0; i < boots.length; i++) {
-		String name = boots[i].getName();
-		int index = name.indexOf('_');
-		String version;
-		Object currentVersion;
-		if (index == -1)
-			version = "";  //$NON-NLS-1$ // Note: directory with version suffix is always > than directory without version suffix
-		else
-			version = name.substring(index + 1);
-		currentVersion = getVersionElements(version);			
-		if (maxVersion == null) {
-			result = boots[i].getAbsolutePath();
-			maxVersion = currentVersion;
-		} else {
-			if (compareVersion((Object[])maxVersion, (Object[])currentVersion) < 0) {
-				result = boots[i].getAbsolutePath();
-				maxVersion = currentVersion;
-			}
-		}
-	}
-	if (result == null)
-		throw new RuntimeException("Could not find bootstrap code. Check location of boot plug-in or specify -boot."); //$NON-NLS-1$
-	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;
-}
-
-/**
- * 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>.
- *
- * @see #run
- * 
- * @param args the command line arguments
- */
-public static void main(String[] args) {
-	Object result = null;
-	arguments = args;
-	// Check to see if we are running with a compatible VM.
-	// If not, then return exit code "14" which will be recognized
-	// by the executable and an appropriate message will be displayed
-	// to the user.
-	if (!isCompatible())
-		System.exit(14);
-	// Check to see if there is already a platform running in
-	// this workspace. If there is, then return an exit code of "15" which
-	// will be recognized by the executable and an appropriate message
-	// will be displayed to the user.
-	if (isAlreadyRunning())
-		System.exit(15);
-	Main launcher = new Main();
-	try {
-		result = launcher.run(args);
-	} catch (Throwable e) {
-		// try and take down the splash screen.
-		launcher.takeDownSplash();
-		log("Exception launching the Eclipse Platform:"); //$NON-NLS-1$
-		log(e);
-		// 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.
-		System.exit(13);
-	}
-	int exitCode = result instanceof Integer ? ((Integer) result).intValue() : 0;
-	System.exit(exitCode);
-}
-
-/**
- * Runs this launcher with the arguments specified in the given string.
- * 
- * @param argString the arguments string
- * @exception Exception thrown if a problem occurs during launching
- */
-public static void main(String argString) throws Exception {
-	Vector list = new Vector(5);
-	for (StringTokenizer tokens = new StringTokenizer(argString, " "); tokens.hasMoreElements();) //$NON-NLS-1$
-		list.addElement((String) tokens.nextElement());
-	main((String[]) list.toArray(new String[list.size()]));
-}
-
-/**
- * Processes the command line arguments
- * 
- * @return the arguments to pass through to the launched application
- * @param args the command line arguments
- */
-protected String[] processCommandLine(String[] args) throws Exception {
-	int[] configArgs = new int[100];
-	configArgs[0] = -1; // need to initialize the first element to something that could not be an index.
-	int configArgIndex = 0;
-	for (int i = 0; i < args.length; i++) {
-		boolean found = false;
-		// check for args without parameters (i.e., a flag arg)
-		// 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;
-		}
-		
-		// check if this is initialization pass
-		if (args[i].equalsIgnoreCase(INITIALIZE)) {
-			cmdInitialize = 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;
-		}
-		// 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 laucher to run
-		if (args[i - 1].equalsIgnoreCase(BOOT)) {
-			bootLocation = arg;
-			found = true;
-		}
-
-		// look explicitly set install root
-		if (args[i - 1].equalsIgnoreCase(INSTALL)) {
-			rootLocation = arg;
-			found = true;
-		}
-
-		// look for the development mode and class path entries.  
-		if (args[i - 1].equalsIgnoreCase(DEV)) {
-			inDevelopmentMode = true;
-			devClassPath = arg;
-			continue;
-		}
-
-		// look for the location of workspace
-		if (args[i - 1].equalsIgnoreCase(DATA)) {
-			baseLocation = arg;
-			continue; // pass the arg on
-		}
-
-		// look for the application to run
-		if (args[i - 1].equalsIgnoreCase(APPLICATION)) {
-			application = arg;
-			found = true;
-		}
-
-		// look for the feature to run
-		if (args[i - 1].equalsIgnoreCase(FEATURE)) {
-			feature = arg;
-			continue; // pass the arg on [20063]
-		}
-
-		// look for the configuration to use
-		if (args[i - 1].equalsIgnoreCase(CONFIGURATION)) {
-			configuration = arg;
-			// we  mark -configuration for removal. It will be
-			// reinserted after we determine the actual URL of
-			// the configuration file to use.
-			found = true;
-		}
-
-		// look for token to use to show the splash screen
-		if (args[i - 1].equalsIgnoreCase(SHOWSPLASH)) {
-			showSplash = arg;
-			found = true;
-		}
-
-		// look for token to use to end the splash screen
-		if (args[i - 1].equalsIgnoreCase(ENDSPLASH)) {
-			endSplash = 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
-	if (configArgIndex == 0)
-		return args;
-	String[] passThruArgs = new String[args.length - configArgIndex];
-	configArgIndex = 0;
-	int j = 0;
-	for (int i = 0; i < args.length; i++) {
-		if (i == configArgs[configArgIndex])
-			configArgIndex++;
-		else
-			passThruArgs[j++] = args[i];
-	}
-	return passThruArgs;
-}
-/**
- * Runs the application to be launched.
- * 
- * @return the return value from the launched application
- * @param args the arguments to pass to the application
- * @exception thrown if a problem occurs during launching
- */
-public Object run(String[] args) throws Exception {
-	String[] passThruArgs = processCommandLine(args);
-	passThruArgs = processConfiguration(passThruArgs);
-	return basicRun(passThruArgs);
-}
-
-/*
- * After the command line arguments have been processed, we try
- * to locate and load the platform configuration file. It contains
- * information maintained by the install/ update support. In 
- * particular, the following are needed at this point
- * in the startup sequence:
- * -> if -boot was not specified, which boot.jar to load 
- *    BootLoader from (original core.boot plugin may have been updated)
- * -> if -feature was not specified, what is the default feature
- *    (product packagers can set the default)
- * -> if we were requested to put up the splash (-showsplash
- *    was specified), which one (based on defaulted or
- *    specified feature information)
- * Note, that if we can't find the platform configuration file,
- * or it does not contain the information we are looking for,
- * the startup support ends up computing "reasonable" defaults
- * as before (based on relative locations within the file system)
- */
-private String[] processConfiguration(String[] passThruArgs) throws MalformedURLException {
-	// get install root location, if not specified
-	if (rootLocation == null)
-		rootLocation = getRootURL().toExternalForm();
-		
-	// attempt to locate configuration file
-	URL configURL = null;
-	if (configuration != null && !configuration.trim().equals("")) { //$NON-NLS-1$
-		configuration = configuration.replace(File.separatorChar, '/');
-		if (configuration.equalsIgnoreCase(ARG_USER_DIR)) {
-			// configuration is in current working directory
-			String tmp = System.getProperty("user.dir"); //$NON-NLS-1$
-			if (!tmp.endsWith(File.separator))
-				tmp += File.separator;
-			configURL = new URL("file:" + tmp.replace(File.separatorChar,'/') + CONFIG_FILE); //$NON-NLS-1$
-		} else if(configuration.endsWith("/")) { //$NON-NLS-1$
-			// configuration specified as directory URL		
-			configURL = new URL(configuration + CONFIG_FILE);
-		} else {
-			// configuration specified down to a file			
-			configURL = new URL(configuration);
-		}
-	} else {
-		// configuration not specified - defer to BootLoader
-	}
-		
-	// load configuration
-	loadConfiguration(configURL);
-	
-	// get boot url, if none was specified
-	if (bootLocation == null) {
-		String urlString = loadAttribute(props, CFG_CORE_BOOT, null);
-		if (urlString != null) {
-			try {
-				urlString = resolve(urlString);
-				URL bootDir = new URL(urlString);
-				URL bootURL = new URL(bootDir, BOOTJAR);
-				if (bootDir.getProtocol().equals("file")) { //$NON-NLS-1$
-					File jar = new File(bootURL.getFile());
-					if (jar.exists())
-						// verify boot dir exists
-						bootLocation = bootURL.toExternalForm();
-					else
-						// Somebody turned the tables on us. The info in
-						// platform.cfg is stale, or the workspace is being used
-						// with a new install. Do default search for boot and force
-						// "first use" processing (optimistic reconciliation)
-						cmdFirstUse = true;
-				} else
-					bootLocation = bootURL.toExternalForm();
-			} catch(MalformedURLException e) {
-				// continue ... will do default search for boot
-			}
-		}
-	}
-		
-	// reconstruct command line arguments for configuration elements
-	// (-boot and -application are not passed to BootLoader)
-	if (configURL == null && rootLocation == null)
-		return passThruArgs;
-			
-	ArrayList args = new ArrayList(Arrays.asList(passThruArgs));
-	
-	if (configURL != null) {
-		args.add(CONFIGURATION);
-		args.add(decode(configURL.toExternalForm()));
-	}
-	
-	if (cmdFirstUse) {
-		args.add(FIRST_USE);
-	}
-	
-	// pass root location downstream
-	if (rootLocation != null) {
-		args.add(INSTALL);
-		args.add(rootLocation);
-	}
-	
-	return (String[])args.toArray(new String[0]);
-}
-
-/**
- * Returns url of the location this class was loaded from
- */
-private URL getRootURL() throws MalformedURLException {
-	if (rootLocation != null)
-		return new URL(rootLocation);
-		
-	URL	url = getClass().getProtectionDomain().getCodeSource().getLocation();
-	String path = decode(url.getFile());
-	path = new File(path).getAbsolutePath().replace(File.separatorChar,'/');
-	if (path.endsWith(".jar")) //$NON-NLS-1$
-		path = path.substring(0, path.lastIndexOf("/")+1); //$NON-NLS-1$
-	url = new URL(url.getProtocol(), url.getHost(), url.getPort(), path);
-	rootLocation = url.toExternalForm();
-	return url;
-}
-
-/*
- * Load the configuration file. If not specified, default to the workspace
- */
-private void loadConfiguration(URL url) {
-	if (url == null) {
-		// configuration URL was not specified ..... search
-		String base = baseLocation;
-		if (base == null) {
-			// determine default workspace
-			base = System.getProperty("user.dir"); //$NON-NLS-1$
-			if (!base.endsWith(File.separator))
-				base += File.separator;
-			base += "workspace" + File.separator; //$NON-NLS-1$
-		} else {
-			base = base.replace('/',File.separatorChar);
-		}
-		if (!base.endsWith(File.separator))
-			base += File.separator;
-		
-		File cfg = null;	
-		try {
-			// first look for configuration in base location (workspace or as specified)
-			cfg = new File(base + ".metadata" + File.separator + ".config" + File.separator + CONFIG_FILE); //$NON-NLS-1$ //$NON-NLS-2$
-			url = new URL("file", null, 0, cfg.getAbsolutePath()); //$NON-NLS-1$
-			props = loadProperties(url);
-			if (debug)
-				System.out.println("Startup: using configuration " + url.toString()); //$NON-NLS-1$
-			return; // we're done looking
-		} catch(IOException e) {
-			// continue ...
-		}
-		
-		try {
-			// look for configuration in install root (set up by -initialize)
-			String install = getRootURL().getFile().replace('/',File.separatorChar);
-			if (!install.endsWith(File.separator))
-				install += File.separator;
-			cfg = new File(install + ".config" + File.separator + CONFIG_FILE); //$NON-NLS-1$
-			url = new URL("file", null, 0, cfg.getAbsolutePath()); //$NON-NLS-1$
-			props = loadProperties(url);
-			if (debug)
-				System.out.println("Startup: using configuration " + url.toString()); //$NON-NLS-1$
-		} catch(IOException e) {
-			// continue ...
-			if (debug)
-				System.out.println("Startup: unable to load configuration\n" + e); //$NON-NLS-1$
-		}
-	} else {
-		try {
-			// configuration url was specified ... use it
-			props = loadProperties(url);
-			if (debug)
-				System.out.println("Startup: using configuration " + url.toString()); //$NON-NLS-1$
-		} catch(IOException e) {
-			// continue ...
-			if (debug)
-				System.out.println("Startup: unable to load configuration\n" + e); //$NON-NLS-1$
-		}
-	}
-}
-
-private Properties loadProperties(URL url) throws IOException {
-		
-	// try to load saved configuration file (watch for failed prior save())
-	Properties props = null;
-	IOException originalException = null;
-	try {
-		props = load(url, null); // try to load config file
-	} catch(IOException e1) {
-		originalException = e1;
-		try {
-			props = load(url, CONFIG_FILE_TEMP_SUFFIX); // check for failures on save
-		} catch(IOException e2) {
-			try {
-				props = load(url, CONFIG_FILE_BAK_SUFFIX); // check for failures on save
-			} catch(IOException e3) {
-				throw originalException; // we tried, but no config here ...
-			}
-		}
-	}
-	
-	return props;
-}
- 
-/*
- * 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);
-		// check to see if we have complete config file
-		if (!CFG_EOF.equals(props.getProperty(CFG_EOF))) {
-			throw new IOException();
-		}
-	} finally {
-		if (is!=null) {
-			try {
-				is.close();
-			} catch(IOException e) {
-				//ignore failure to close
-			}
-		}
-	}
-	
-	// load feature index
-	if (props != null) {
-		String id = props.getProperty(CFG_FEATURE_ENTRY+".0."+CFG_FEATURE_ENTRY_ID); //$NON-NLS-1$
-		for (int i=1; id != null; i++) {
-			featureIndex.put(id, Integer.toString(i-1));
-			id = props.getProperty(CFG_FEATURE_ENTRY+"."+i+"."+CFG_FEATURE_ENTRY_ID); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-	
-	return props;
-}	
-	
-/*
- * Load a configuration attribute
- */	
-private String loadAttribute(Properties props, String name, String dflt) {
-	if (props == null)
-		return dflt;
-		
-	String prop = props.getProperty(name);
-	if (prop == null)
-		return dflt;
-	else
-		return prop.trim();
-}
-
-/*
- * 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[] bootPath) {
-	
-	// run without splash if we are initializing
-	if (cmdInitialize) {
-		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 path
-	String path  = getSplashPath(bootPath);
-	if (debug && path != null) {
-		System.out.println("Startup: splash path = "+path); //$NON-NLS-1$
-	}
-		
-	// Parse the showsplash command into its separate arguments.
-	// The command format is: 
-	//     <executable> -show <magicArg> [<splashPath>]
-	// If either the <executable> or the <splashPath> arguments contain a
-	// space, Runtime.getRuntime().exec( String ) will not work, even
-	// if both arguments are enclosed in double-quotes. The solution is to
-	// use the Runtime.getRuntime().exec( String[] ) method.
-	String[] cmd = new String[ (path != null ? 4 : 3) ];
-	int sIndex = 0;
-	int eIndex = showSplash.indexOf( " -show" ); //$NON-NLS-1$
-	if (eIndex == -1)
-		return; // invalid -showsplash command
-	cmd[0] = showSplash.substring( sIndex, eIndex );
-	sIndex = eIndex + 1;
-	eIndex = showSplash.indexOf( " ", sIndex ); //$NON-NLS-1$
-	if (eIndex == -1)
-		return; // invalid -showsplash command
-	cmd[1] = showSplash.substring( sIndex, eIndex );
-	cmd[2] = showSplash.substring( eIndex+1 );
-	if (path != null)
-		cmd[3] = path;
-	try {
-		showProcess = Runtime.getRuntime().exec(cmd);
-	} catch (Exception e) {
-		// continue without splash ...
-		log("Exception showing splash screen."); //$NON-NLS-1$
-		log(e);
-	}
-	return;
-}
-
-/*
- * take down the splash screen. Try both take-down methods just in case
- * (only one should ever be set)
- */
-private 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
- */
-private String getSplashPath(URL[] bootPath) {
-	
-	// see if we can get a splash for the launched feature
-	String[] featurePath = getFeatureRoot();	
-	String path = lookupSplash(featurePath);
-	if (path != null)
-		return path;
-	
-	// no feature path, default to current boot plugin
-	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);
-			path = lookupSplash(new String[] { temp });
-			return path;
-		}
-	}
-		
-	// sorry, no splash found
-	return null;
-}
-
-/*
- * Do a locale-sensitive lookup of splash image
- */
- private String lookupSplash(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 splash = new File(path);
- 			if (splash.exists())
- 				return splash.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;
- }
-
-/*
- * Return the feature identifier to use (specified or defaulted)
- */
-private String getFeatureIdentifier() {
-		
-	if (feature != null) // -feature was specified on command line
-		return feature; 
-		
-	// feature was not specified on command line
-	String dflt = props.getProperty(CFG_FEATURE_ENTRY_DEFAULT);
-	if (dflt != null)
-		return dflt; // return customized default if set.
-	else
-		return null; // otherwise let BootLoader pick default
-}
-
-/*
- * Return the feature root if known
- */
-private String[] getFeatureRoot() {
-	String ix = featureIndex(getFeatureIdentifier());
-	String urlString = props.getProperty(CFG_FEATURE_ENTRY + "." + ix + "." + CFG_FEATURE_ENTRY_ROOT + ".0"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	if (urlString == null)
-		return null;
-	
-	ArrayList result = new ArrayList();
-	URL url = null;
-	for (int i=1; urlString != null; i++) {
-		try {	
-			urlString = resolve(urlString); // resolve platform relative URLs
-			url = new URL(urlString);
-			if (url.getProtocol().equals("file")) { //$NON-NLS-1$
-				result.add(url.getFile().replace('/', File.separatorChar));
-			} else
-				continue; // in the future may cache
-		} catch(MalformedURLException e) {
-			// skip bad entries
-		}
-		urlString = props.getProperty(CFG_FEATURE_ENTRY + "." + ix + "." + CFG_FEATURE_ENTRY_ROOT + "." + i); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-	
-	if (result.size()>0)
-		return (String[])result.toArray(new String[0]);
-	else 
-		return null;
-}
-
-/*
- * resolve platform:/base/ URLs
- */
- private String resolve(String urlString) throws MalformedURLException { 	
- 	if (urlString.startsWith(PLATFORM_URL)) {
- 		String root = getRootURL().toExternalForm();
- 		if (!root.endsWith("/")) //$NON-NLS-1$
- 			root += "/"; //$NON-NLS-1$
- 		String path = urlString.substring(PLATFORM_URL.length());
- 		return root + path;
- 	} else
- 		return urlString;
- }
-
-/*
- * 
- */
-private String featureIndex(String id) {
-	if (id==null)
-		return null;
-	return (String)featureIndex.get(id);
-}
-
-/*
- * Entry point for logging.
- */
-private static synchronized void log(Object obj) {
-	if (obj == null)
-		return;
-	try {
-		openLogFile();
-		try {
-			if (newSession) {
-				log.write(SESSION);
-				log.write(' ');
-				for (int i=SESSION.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 static 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 static void computeLogFileLocation() {
-	if (logFile != null)
-		return;
-	// compute the base location and then append the name of the log file
-	File base = computeMetadataLocation();
-	logFile = new File(base, ".log"); //$NON-NLS-1$
-	logFile.getParentFile().mkdirs();
-}
-private static File computeLockFileLocation() {
-	// compute the base location and then append the name of the lock file
-	File base = computeMetadataLocation();
-	File result = new File(base, ".lock"); //$NON-NLS-1$
-	result.getParentFile().mkdirs();
-	return result;
-}
-private static File computeMetadataLocation() {
-
-	File result = null;
-	// check to see if the user specified a workspace location in the command-line args
-	for (int i=0; arguments != null && result == null && i<arguments.length; i++) {
-		if (arguments[i].equalsIgnoreCase(DATA)) {
-			// found the -data command line argument so the next argument should be the
-			// workspace location. Ensure that we have another arg to check
-			if (i+1<arguments.length)
-				result = new File(arguments[i+1]);
-		}
-	}
-	// otherwise use the default location
-	if (result == null)
-		result = new File(System.getProperty("user.dir"), "workspace");//$NON-NLS-1$ //$NON-NLS-2$
-	
-	// append the .metadata directory to the path
-	return new File(result, ".metadata"); //$NON-NLS-1$
-}
-/**
- * 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");
-	}
-}
-
-
-private static 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 static 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 static void closeLogFile() throws IOException {
-	try {
-		if (log != null) {
-			log.flush();
-			log.close();
-		}
-	} finally {
-		log = null;
-	}
-}
-/**
- * Return a boolean value indicating whether or not the version of the JVM is
- * deemed to be compatible with Eclipse.
- */
-private static boolean isCompatible() {
-	try {
-		String vmVersionString = System.getProperty("java.version"); //$NON-NLS-1$
-		Identifier minimum = new Identifier(1, 3, 0);
-		Identifier version = new Identifier(vmVersionString);
-		return version.isGreaterEqualTo(minimum);
-	} 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;
-	}
-}
-/**
- * Return a boolean value indicating whether or not the platform is already
- * running in this workspace.
- */
-private static boolean isAlreadyRunning() {
-	// Calculate the location of the lock file
-	File lockFile = computeLockFileLocation();
-
-	// if the lock file already exists, try to delete,
-	// assume failure means another eclipse has it open
-	if (lockFile.exists())
-		lockFile.delete();
-	return lockFile.exists();
-}
-
-}
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 f985556..0000000
--- a/platform/org.eclipse.platform/welcome.xml
+++ /dev/null
@@ -1,52 +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"  class="org.eclipse.ui.internal.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.actions.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, which you can check out as
-an Eclipse project.
-
-For an anonymous connection to the Eclipse CVS repository, choose
-<action pluginId="org.eclipse.team.cvs.ui" class="org.eclipse.team.internal.ccvs.ui.actions.NewCVSAnonEclipseConnection">New > Anonymous Repository Location to dev.eclipse.org...</action>. Select the newly created location
-and expand HEAD. You will see the list of all the Eclipse modules, most of which are platform plugins.
-Select a plugin and choose <b>Checkout as Project</b> from the context menu. This will checkout
-the module from the CVS repository and create a plugin project by that name in your workspace.</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>.</item>
-
-
-</welcomePage>
\ 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 5921923..0000000
--- a/update/org.eclipse.update.core.linux/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <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.help"/>
-    <classpathentry kind="src" path="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <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.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 d41874c..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.apache.xerces</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.help</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 40d668e..0000000
--- a/update/org.eclipse.update.core.linux/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-bin.includes = fragment.xml,\
-               os/,\
-               fragment.properties,\
-               about.html
-source.updatecorelinux.zip = src/
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 a21f2ae..0000000
--- a/update/org.eclipse.update.core.linux/fragment.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<fragment
-   id="org.eclipse.update.core.linux"
-   name="%fragmentNameLinux"
-   version="2.1.0"
-   provider-name="%providerName"
-   plugin-id="org.eclipse.update.core"
-   plugin-version="2.1.0"
-   match="compatible">
-
-   <runtime>
-   </runtime>
-
-
-</fragment>
diff --git a/update/org.eclipse.update.core.linux/os/linux/libupdate.so b/update/org.eclipse.update.core.linux/os/linux/libupdate.so
deleted file mode 100644
index 5533317..0000000
--- a/update/org.eclipse.update.core.linux/os/linux/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 b5b9703..0000000
--- a/update/org.eclipse.update.core.linux/src/build.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0"?>
-<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/"/>
-  <property name="obj-path" value="${eclipse-home}/org.eclipse.update.core/src/"/>
-  <property name="src-path" value="${eclipse-home}/org.eclipse.update.core/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="*.cpp"/>
-      <mapper type="glob" from="*.cpp" 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.cpp b/update/org.eclipse.update.core.linux/src/update.cpp
deleted file mode 100644
index fffaff9..0000000
--- a/update/org.eclipse.update.core.linux/src/update.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-# 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;
-
-	// 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);
-
-	// 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(file);
-	id = jnienv -> GetMethodID(cls, "getAbsolutePath", "()Ljava/lang/String;");
-	obj = jnienv -> CallObjectMethod(file, id);
-	lpDirectoryName = jnienv -> GetStringUTFChars((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(file);
-	id = jnienv -> GetMethodID(cls, "getAbsolutePath", "()Ljava/lang/String;");
-	obj = jnienv -> CallObjectMethod(file, id);
-	lpDirectoryName = jnienv -> GetStringUTFChars((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("java/lang/String");
-	empty = jnienv -> NewStringUTF("");
-	//returnArray = jnienv -> NewObjectArray(nDrive, stringClass, empty);
-	// for now return null as method is not implemented
-	returnArray = NULL;
-
-	for (int i = 0; i < drive; i++) {
-		// Linux implementation, create String for each mount point
-
-		str = jnienv -> NewStringUTF(driveName);
-		jnienv -> SetObjectArrayElement(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 f88aa29..0000000
--- a/update/org.eclipse.update.core.linux/src/update.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-#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/.classpath b/update/org.eclipse.update.core.win32/.classpath
deleted file mode 100644
index 5921923..0000000
--- a/update/org.eclipse.update.core.win32/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <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.help"/>
-    <classpathentry kind="src" path="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <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.core.win32/.cvsignore b/update/org.eclipse.update.core.win32/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/update/org.eclipse.update.core.win32/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/update/org.eclipse.update.core.win32/.project b/update/org.eclipse.update.core.win32/.project
deleted file mode 100644
index bb440b5..0000000
--- a/update/org.eclipse.update.core.win32/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.core.win32</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.xerces</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.help</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.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 e5de40b..0000000
--- a/update/org.eclipse.update.core.win32/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.updatecorewin32.zip = src/
-bin.includes = fragment.xml,\
-               os/,\
-               fragment.properties,\
-               about.html
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 5df5874..0000000
--- a/update/org.eclipse.update.core.win32/fragment.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<fragment
-   id="org.eclipse.update.core.win32"
-   name="%fragmentNameWin"
-   version="2.1.0"
-   provider-name="%providerName"
-   plugin-id="org.eclipse.update.core"
-   plugin-version="2.1.0"
-   match="compatible">
-
-   <runtime>
-   </runtime>
-
-
-</fragment>
diff --git a/update/org.eclipse.update.core.win32/os/win32/update.dll b/update/org.eclipse.update.core.win32/os/win32/update.dll
deleted file mode 100644
index 428e60e..0000000
--- a/update/org.eclipse.update.core.win32/os/win32/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 0e87d4b..0000000
--- a/update/org.eclipse.update.core.win32/src/build.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0"?>
-<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/"/>
-  <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 f046ade..0000000
--- a/update/org.eclipse.update.core.win32/src/update.cpp
+++ /dev/null
@@ -1,480 +0,0 @@
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-
-# 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
-	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
- 	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 0bedfe0..0000000
--- a/update/org.eclipse.update.core.win32/src/update.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-#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/bin/org/eclipse/update/examples/buildzip/java.page.jpage b/update/org.eclipse.update.examples/bin/org/eclipse/update/examples/buildzip/java.page.jpage
deleted file mode 100644
index 8b3ca30..0000000
--- a/update/org.eclipse.update.examples/bin/org/eclipse/update/examples/buildzip/java.page.jpage
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.ui.win32/.classpath b/update/org.eclipse.update.ui.win32/.classpath
deleted file mode 100644
index b7f3dc9..0000000
--- a/update/org.eclipse.update.ui.win32/.classpath
+++ /dev/null
@@ -1,11 +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"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <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.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 706350c..0000000
--- a/update/org.eclipse.update.ui.win32/.project
+++ /dev/null
@@ -1,33 +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.ui</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.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 6e2cd8b..0000000
--- a/update/org.eclipse.update.ui.win32/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-bin.includes = fragment.properties,\
-               icons/,\
-               *.jar,\
-               fragment.xml,\
-               about.html
-source.updateui32.jar = src/
-src.includes=about.html
diff --git a/update/org.eclipse.update.ui.win32/fragment.xml b/update/org.eclipse.update.ui.win32/fragment.xml
deleted file mode 100644
index 87a2535..0000000
--- a/update/org.eclipse.update.ui.win32/fragment.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<fragment
-   id="org.eclipse.update.ui.win32"
-   name="%fragmentNameWin"
-   version="2.1.0"
-   provider-name="%providerName"
-   plugin-id="org.eclipse.update.ui"
-   plugin-version="2.1.0"
-   match="compatible">
-
-   <runtime>
-      <library name="updateui32.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-
-   <requires>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-
-
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="%views.webBrowser.label"
-            icon="icons/full/cview16/browser.gif"
-            category="org.eclipse.update.ui"
-            class="org.eclipse.update.internal.ui.win32.views.WebBrowserView"
-            id="org.eclipse.update.ui.WebBrowser">
-      </view>
-   </extension>
-</fragment>
-
-
-
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/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/src/org/eclipse/update/internal/ui/win32/views/BrowserControlSite.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/update/internal/ui/win32/views/BrowserControlSite.java
deleted file mode 100644
index 840988f..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/update/internal/ui/win32/views/BrowserControlSite.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.eclipse.update.internal.ui.win32.views;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-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("");
-				}
-			}
-		});
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/update/internal/ui/win32/views/WebBrowser.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/update/internal/ui/win32/views/WebBrowser.java
deleted file mode 100644
index 2ab358c..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/update/internal/ui/win32/views/WebBrowser.java
+++ /dev/null
@@ -1,461 +0,0 @@
-package org.eclipse.update.internal.ui.win32.views;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-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)
-			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)
-			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)
-			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)
-			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)
-			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) {
-					command = varResult.getInt();
-				}
-
-				varResult = event.arguments[1];
-				if (varResult != null) {
-					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)
-			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)
-			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;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.win32/src/org/eclipse/update/internal/ui/win32/views/WebBrowserView.java b/update/org.eclipse.update.ui.win32/src/org/eclipse/update/internal/ui/win32/views/WebBrowserView.java
deleted file mode 100644
index d7d6129..0000000
--- a/update/org.eclipse.update.ui.win32/src/org/eclipse/update/internal/ui/win32/views/WebBrowserView.java
+++ /dev/null
@@ -1,269 +0,0 @@
-package org.eclipse.update.internal.ui.win32.views;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.ole.win32.OleEvent;
-import org.eclipse.swt.ole.win32.OleListener;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.update.internal.ui.UpdateUIPlugin;
-import org.eclipse.update.internal.ui.UpdateUIPluginImages;
-import org.eclipse.update.internal.ui.views.IEmbeddedWebBrowser;
-
-public class WebBrowserView extends ViewPart 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 Action backwardAction;
-	private Action forwardAction;
-
-	public WebBrowserView() {
-	}
-
-	/**
-	 * @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 =
-			getViewSite().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");
-	}
-
-	public void openTo(final String url) {
-		addressCombo.setText(url);
-		control.getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				navigate(url);
-			}
-		});
-	}
-
-	private void downloadComplete(String url) {
-		backwardAction.setEnabled(browser.isBackwardEnabled());
-		forwardAction.setEnabled(browser.isForwardEnabled());
-		stopAction.setEnabled(false);
-		refreshAction.setEnabled(true);
-	}
-
-	private void createNavBar(Composite parent) {
-		Label addressLabel = new Label(parent, SWT.NONE);
-		addressLabel.setText(UpdateUIPlugin.getResourceString(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();
-		IToolBarManager localBar =
-			getViewSite().getActionBars().getToolBarManager();
-		localBar.add(backwardAction);
-		localBar.add(forwardAction);
-	}
-
-	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);
-	}
-
-	private void makeActions() {
-		goAction = new Action() {
-			public void run() {
-				navigate(addressCombo.getText());
-			}
-		};
-		goAction.setEnabled(false);
-		goAction.setToolTipText(UpdateUIPlugin.getResourceString(KEY_GO));
-		goAction.setImageDescriptor(UpdateUIPluginImages.DESC_GO_NAV);
-		goAction.setDisabledImageDescriptor(UpdateUIPluginImages.DESC_GO_NAV_D);
-		goAction.setHoverImageDescriptor(UpdateUIPluginImages.DESC_GO_NAV_H);
-
-		stopAction = new Action() {
-			public void run() {
-				browser.stop();
-			}
-		};
-		stopAction.setToolTipText(UpdateUIPlugin.getResourceString(KEY_STOP));
-		stopAction.setImageDescriptor(UpdateUIPluginImages.DESC_STOP_NAV);
-		stopAction.setDisabledImageDescriptor(
-			UpdateUIPluginImages.DESC_STOP_NAV_D);
-		stopAction.setHoverImageDescriptor(
-			UpdateUIPluginImages.DESC_STOP_NAV_H);
-		stopAction.setEnabled(false);
-
-		refreshAction = new Action() {
-			public void run() {
-				browser.refresh();
-			}
-		};
-		refreshAction.setToolTipText(
-			UpdateUIPlugin.getResourceString(KEY_REFRESH));
-		refreshAction.setImageDescriptor(UpdateUIPluginImages.DESC_REFRESH_NAV);
-		refreshAction.setDisabledImageDescriptor(
-			UpdateUIPluginImages.DESC_REFRESH_NAV_D);
-		refreshAction.setHoverImageDescriptor(
-			UpdateUIPluginImages.DESC_REFRESH_NAV_H);
-		refreshAction.setEnabled(false);
-
-		backwardAction = new Action() {
-			public void run() {
-				browser.back();
-			}
-		};
-		backwardAction.setEnabled(false);
-		backwardAction.setToolTipText(
-			UpdateUIPlugin.getResourceString(KEY_BACKWARD));
-		backwardAction.setImageDescriptor(
-			UpdateUIPluginImages.DESC_BACKWARD_NAV);
-		backwardAction.setDisabledImageDescriptor(
-			UpdateUIPluginImages.DESC_BACKWARD_NAV_D);
-		backwardAction.setHoverImageDescriptor(
-			UpdateUIPluginImages.DESC_BACKWARD_NAV_H);
-
-		forwardAction = new Action() {
-			public void run() {
-				browser.forward();
-			}
-		};
-		forwardAction.setToolTipText(
-			UpdateUIPlugin.getResourceString(KEY_FORWARD));
-		forwardAction.setImageDescriptor(UpdateUIPluginImages.DESC_FORWARD_NAV);
-		forwardAction.setDisabledImageDescriptor(
-			UpdateUIPluginImages.DESC_FORWARD_NAV_D);
-		forwardAction.setHoverImageDescriptor(
-			UpdateUIPluginImages.DESC_FORWARD_NAV_H);
-		forwardAction.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();
-		super.dispose();
-	}
-
-	public void setFocus() {
-		if (control != null)
-			control.setFocus();
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui/doc/searchCategory.html b/update/org.eclipse.update.ui/doc/searchCategory.html
index 7c922f4..6a4c2af 100644
--- a/update/org.eclipse.update.ui/doc/searchCategory.html
+++ b/update/org.eclipse.update.ui/doc/searchCategory.html
@@ -1,34 +1,35 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HEAD><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</HEAD>
-<HTML>
-<BODY>
-<H1><CENTER>Search Category</CENTER></H1>
-<H2>Identifier</H2>
-org.eclipse.update.ui.searchCategory<H2>Description</H2>
-[Enter description of this extension point]<H2>Markup</H2>
-<p><samp>&nbsp;&nbsp; &lt;!ELEMENT extension (search+)&gt;</samp>
-<br><samp>&nbsp;&nbsp; &lt;!ATTLIST extension</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp; &gt;</samp>
-<ul>
-<li><b>point</b> - </li><li><b>id</b> - </li><li><b>name</b> - </li></ul>
-<p><samp>&nbsp;&nbsp; &lt;!ELEMENT search (description?)&gt;</samp>
-<br><samp>&nbsp;&nbsp; &lt;!ATTLIST search</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;CDATA #REQUIRED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon&nbsp;&nbsp;CDATA #IMPLIED</samp>
-<br><samp>&nbsp;&nbsp; &gt;</samp>
-<ul>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HEAD>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</HEAD>
+<HTML>
+<BODY>
+<H1><CENTER>Search Category</CENTER></H1>
+<H2>Identifier</H2>
+org.eclipse.update.ui.searchCategory<H2>Description</H2>
+[Enter description of this extension point]<H2>Markup</H2>
+<p><samp>&nbsp;&nbsp; &lt;!ELEMENT extension (search+)&gt;</samp>
+<br><samp>&nbsp;&nbsp; &lt;!ATTLIST extension</samp>
+<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point&nbsp;CDATA #REQUIRED</samp>
+<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;CDATA #IMPLIED</samp>
+<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;CDATA #IMPLIED</samp>
+<br><samp>&nbsp;&nbsp; &gt;</samp>
+<ul>
+<li><b>point</b> - </li><li><b>id</b> - </li><li><b>name</b> - </li></ul>
+<p><samp>&nbsp;&nbsp; &lt;!ELEMENT search (description?)&gt;</samp>
+<br><samp>&nbsp;&nbsp; &lt;!ATTLIST search</samp>
+<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED</samp>
+<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;CDATA #REQUIRED</samp>
+<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;CDATA #IMPLIED</samp>
+<br><samp>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon&nbsp;&nbsp;CDATA #IMPLIED</samp>
+<br><samp>&nbsp;&nbsp; &gt;</samp>
+<ul>
 <li><b>id</b> - unique identifier of this search category</li><li><b>name</b> - translatable name of this search category</li><li><b>class</b> - a fully qualified name of the class that implements 
 <samp>org.eclipse.update.internal.ui.search.ISearchQuery</samp>.</li><li><b>icon</b> - a relative path to the image that will be used to represent
-instances of this search category in the UI.</li></ul>
-<p><samp>&nbsp;&nbsp; &lt;!ELEMENT description (#CDATA)&gt;</samp>
-<H2>Example</H2>
-[Enter extension point usage example here.]<H2>API Information</H2>
-[Enter API information here.]<H2>Supplied Implementation</H2>
-[Enter information about supplied implementation of this extension point.]</BODY>
-</HTML>
+instances of this search category in the UI.</li></ul>
+<p><samp>&nbsp;&nbsp; &lt;!ELEMENT description (#CDATA)&gt;</samp>
+<H2>Example</H2>
+[Enter extension point usage example here.]<H2>API Information</H2>
+[Enter API information here.]<H2>Supplied Implementation</H2>
+[Enter information about supplied implementation of this extension point.]</BODY>
+</HTML>
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/.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>
diff --git a/update/org.eclipse.update/about.html b/update/org.eclipse.update/about.html
deleted file mode 100644
index 9a15e5c..0000000
--- a/update/org.eclipse.update/about.html
+++ /dev/null
@@ -1,30 +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>
-<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" face="Arial,Helvetica">About This Plug-in</font></b></td>
-  </tr>
-  <tr> 
-    <td> 
-<p>1st November, 2001</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in.  The plug-in 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>.  For purposes of the Common Public License, &quot;Program&quot; will mean the plug-in.</p>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update/build.properties b/update/org.eclipse.update/build.properties
deleted file mode 100644
index ac7da03..0000000
--- a/update/org.eclipse.update/build.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-source.update.jar=src/
-bin.includes=plugin.xml,icons/,plugin.properties,*.jar,about.html
diff --git a/update/org.eclipse.update/icons/full/ctool16/new.gif b/update/org.eclipse.update/icons/full/ctool16/new.gif
deleted file mode 100644
index d16d5b0..0000000
--- a/update/org.eclipse.update/icons/full/ctool16/new.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/icons/full/ctool16/update.gif b/update/org.eclipse.update/icons/full/ctool16/update.gif
deleted file mode 100644
index f011d8a..0000000
--- a/update/org.eclipse.update/icons/full/ctool16/update.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/icons/full/wizban/new.gif b/update/org.eclipse.update/icons/full/wizban/new.gif
deleted file mode 100644
index 2a0c793..0000000
--- a/update/org.eclipse.update/icons/full/wizban/new.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/icons/full/wizban/revert.gif b/update/org.eclipse.update/icons/full/wizban/revert.gif
deleted file mode 100644
index d7402a2..0000000
--- a/update/org.eclipse.update/icons/full/wizban/revert.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/icons/full/wizban/update.gif b/update/org.eclipse.update/icons/full/wizban/update.gif
deleted file mode 100644
index 4ff15da..0000000
--- a/update/org.eclipse.update/icons/full/wizban/update.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/plugin.properties b/update/org.eclipse.update/plugin.properties
deleted file mode 100644
index 9c052ee..0000000
--- a/update/org.eclipse.update/plugin.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-S_Eclipse_Update_Manager_Plugin = Install/Update Manager
-S_Software_Updates = &Software Updates
-S_Software_Updates_Preferences = Software Updates
diff --git a/update/org.eclipse.update/plugin.xml b/update/org.eclipse.update/plugin.xml
deleted file mode 100644
index 87f8787..0000000
--- a/update/org.eclipse.update/plugin.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- File written by PDE 1.0 -->
-<plugin
-   id="org.eclipse.update"
-   name="%S_Eclipse_Update_Manager_Plugin"
-   version="1.0"
-   provider-name="International Business Machines Corp."
-   class="org.eclipse.update.internal.core.UpdateManagerPlugin">
-<requires>
-   <import plugin="org.eclipse.core.runtime"/>
-   <import plugin="org.eclipse.ui"/>
-   <import plugin="org.eclipse.webdav"/>
-</requires>
-
-<runtime>
-   <library name="update.jar"/>
-</runtime>
-
-<!-- ================================================================================= -->
-<!--                                                                                   -->
-<!-- Update Manager Help Menu Action Set                                               -->
-<!--                                                                                   -->
-<!-- ================================================================================= -->
-<extension
-      point="org.eclipse.ui.actionSets">
-   <actionSet
-         label="%S_Software_Updates"
-         visible="false"
-         id="org.eclipse.update.internal.ui.UpdateManagerActionSet">
-      <action
-            label="%S_Software_Updates"
-            class="org.eclipse.update.internal.ui.UMDialogAction"
-            menubarPath="help/helpEnd"
-            id="org.eclipse.update.internal.ui.UpdateManagerAction">
-      </action>
-   </actionSet>
-</extension>
-<!-- ============================================================================================ -->
-<!--                                                                                              -->
-<!-- Update Manager Application                                                                   -->
-<!--                                                                                              -->
-<!-- ============================================================================================ -->
-<extension
-      id="updateManager"
-      point="org.eclipse.core.runtime.applications">
-   <application>
-      <run
-            class="org.eclipse.update.internal.ui.UMApplicationUserInterface">
-      </run>
-   </application>
-</extension>
-</plugin>
diff --git a/update/org.eclipse.update/plugin.xml.off b/update/org.eclipse.update/plugin.xml.off
deleted file mode 100644
index 8a83831..0000000
--- a/update/org.eclipse.update/plugin.xml.off
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- Eclipse Update Manager Plugin -->
-
-<plugin
-    id          = "org.eclipse.update"
-    name        = "%S_Eclipse_Update_Manager_Plugin"
-    version     = "1.0"
-    provider-name = "International Business Machines Corp."
-    class       = "org.eclipse.update.internal.core.UpdateManagerPlugin">
-
-    <requires>
-        <import plugin="org.eclipse.core.runtime"/>
-        <import plugin="org.eclipse.ui"/>
-        <import plugin="org.eclipse.webdav"/>
-    </requires>
-
-    <runtime>
-        <library name="update.jar" />
-    </runtime>
-
-    <!-- ================================================================================= -->
-    <!--                                                                                   -->
-    <!-- Update Manager Preference Page Settings                                           -->
-    <!--                                                                                   -->
-    <!-- ================================================================================= -->
-    <extension point="org.eclipse.ui.preferencePages">
-        <page id       = "UMPreferencePageSettings"
-              name     = "%S_Software_Updates_Preferences"
-              class    = "org.eclipse.update.internal.ui.UMPreferencePageSettings">
-        </page>
-    </extension>
-
-    <!-- ================================================================================= -->
-    <!--                                                                                   -->
-    <!-- Update Manager Help Menu Action Set                                               -->
-    <!--                                                                                   -->
-    <!-- ================================================================================= -->
-    <extension point="org.eclipse.ui.actionSets">
-        <actionSet
-            id      = "org.eclipse.update.internal.ui.UpdateManagerActionSet"
-            label   = "%S_Software_Updates"
-            visible = "true">
-            <action id          = "org.eclipse.update.internal.ui.UpdateManagerAction"
-                    menubarPath = "help/helpEnd"
-                    label       = "%S_Software_Updates"
-                    class       = "org.eclipse.update.internal.ui.UMDialogAction"/>
-        </actionSet>
-    </extension>
-
-    <!-- ============================================================================================ -->
-    <!--                                                                                              -->
-    <!-- Update Manager Application                                                                   -->
-    <!--                                                                                              -->
-    <!-- ============================================================================================ -->
-    <extension id="updateManager" point="org.eclipse.core.runtime.applications">
-        <application>
-            <run class="org.eclipse.update.internal.ui.UMApplicationUserInterface">
-            </run>
-        </application>
-    </extension>
-</plugin>
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/ISessionDefiner.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/ISessionDefiner.java
deleted file mode 100644
index 626ca05..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/ISessionDefiner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/**
- */
-import org.eclipse.core.internal.boot.update.*;
-
-public interface ISessionDefiner {
-/**
- * Creates one or more operations for the current session.
- */
-void defineOperations( UMSessionManagerSession session, IInstallable[] descriptors, boolean bVerifyJars );
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/IUMLock.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/IUMLock.java
deleted file mode 100644
index c25c907..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/IUMLock.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/**
- */
-public interface IUMLock {
-/**
- * Checks to see if the UMLock file is there.  If yes, returns true
- */
-public boolean exists();
-/**
- */
-void remove();
-/**
- */
-void set();
-/**
- */
-void set(String msg);
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMLock.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMLock.java
deleted file mode 100644
index 5c08d9a..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMLock.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/**
- */
-import org.eclipse.core.internal.boot.update.*;
-import java.io.*;
-import java.net.*;
-public class UMLock implements IUMLock {
-	File file = null;
-/**
- * UMLock constructor comment.
- */
-public UMLock() {
-	super();
-	URL lockfileURL = null;
-	try {
-		lockfileURL = new URL(UMEclipseTree.getInstallTreeURL(), IManifestAttributes.UM_LOCK);
-	} catch (MalformedURLException ex) {
-	}
-	file = getFile(lockfileURL);
-}
-/**
- * Checks to see if the UMLock file is there.  If yes, returns true
- */
-public boolean exists() {
-	
-	if (file != null) {
-		if (file.exists() == true) {
-			return true;
-		}
-	}
-	return false;
-}
-/**
- */
-public static File getFile(URL url) {
-	File file = null;
-	if (url != null) {
-
-		// Convert the URL to a string
-		//----------------------------
-		String strFilespec = UMEclipseTree.getFileInPlatformString(url);
-
-		file = new File(strFilespec);
-	}
-	return file;
-}
-/**
- */
-public void remove() {
-	if (exists())
-		file.delete();
-		
-}
-/**
- */
-public void set() {
-	set("");
-}
-/**
- */
-public void set(String msg) {
-	URL lockfileURL = null;
-	try {
-		lockfileURL = new URL(UMEclipseTree.getInstallTreeURL(), IManifestAttributes.UM_LOCK);
-	} catch (MalformedURLException ex) {
-	}
-	
-	// Create a lock file
-	//-------------------
-	Log lockfile = new Log();
-
-	try {
-		lockfile.load(lockfileURL);		// creates file if it doesn't exist
-	}
-	catch (LogStoreException ex) {
-		return;
-	}
-
-	// Add an entry
-	//-------------
-	LogEntry lockEntry = new LogEntry( lockfile, msg );
-	lockfile.addChildEntry( lockEntry );
-
-
-	try {
-		lockfile.save(lockfileURL);
-	}
-	catch (LogStoreException ex) {
-		return;
-	}
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionDefinerReferenceUpdate.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionDefinerReferenceUpdate.java
deleted file mode 100644
index 240091b..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionDefinerReferenceUpdate.java
+++ /dev/null
@@ -1,216 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/**
- */
-import org.eclipse.core.internal.boot.update.*;
-import org.eclipse.core.internal.boot.LaunchInfo;
-
-public class UMSessionDefinerReferenceUpdate implements ISessionDefiner {
-/**
- * UMUpdaterCached constructor comment.
- */
-public UMSessionDefinerReferenceUpdate() {
-	super();
-}
-/**
- * Creates one or more operations for the current parcel.
- */
-public void defineComponentOperation(UMSessionManagerParcel parcel, IInstallable descriptor, boolean bVerifyJars) {
-
-	IComponentDescriptor componentDescriptor = null;
-
-	if (descriptor instanceof IComponentDescriptor) {
-		componentDescriptor = (IComponentDescriptor) descriptor;
-	}
-	else if (descriptor instanceof IComponentEntryDescriptor) {
-		componentDescriptor = ((IComponentEntryDescriptor) descriptor).getComponentDescriptor();
-	}
-	if (componentDescriptor == null)
-		return; 
-
-	UMSessionManagerOperation operation = null;
-
-	// Create download operation
-	//--------------------------
-	operation = parcel.createOperation();
-	operation.setAction(UpdateManagerConstants.OPERATION_COPY);
-	operation.setId(componentDescriptor.getUniqueIdentifier());
-	operation.setSource(componentDescriptor.getDownloadURL().toExternalForm());
-	String downloadTarget = UMEclipseTree.getStagingArea().toExternalForm() + componentDescriptor.getDirName() + ".jar";
-	operation.setTarget(downloadTarget);
-	operation.setData(descriptor);
-
-	// Create jar verification operation
-	//----------------------------------
-	if (bVerifyJars == true) {
-		operation = parcel.createOperation();
-		operation.setAction(UpdateManagerConstants.OPERATION_VERIFY_JAR);
-		operation.setId(componentDescriptor.getUniqueIdentifier());
-		operation.setSource(downloadTarget);
-		operation.setTarget(null);
-		operation.setData(descriptor);
-	}
-
-	// Create apply operation for component files (files not in plugins/ dir structure)
-	//---------------------------------------------------------------------------------
-	operation = parcel.createOperation();
-	operation.setAction(UpdateManagerConstants.OPERATION_UNZIP_INSTALL);
-	operation.setId(componentDescriptor.getUniqueIdentifier());
-	operation.setSource(downloadTarget);
-	String applyTarget = UMEclipseTree.getBaseInstallURL().toExternalForm();
-	//	String applyTarget = "file:///c:/temp/x/" ;
-	operation.setTarget(applyTarget);
-	operation.setData(descriptor);
-
-	// Create apply operation for plug-ins		
-	//------------------------------------
-	IPluginEntryDescriptor[] plugins = componentDescriptor.getPluginEntries();
-	IFragmentEntryDescriptor[] fragments = componentDescriptor.getFragmentEntries();
-	if ((plugins.length > 0) || (fragments.length >0)) {
-		operation = parcel.createOperation();
-		operation.setAction(UpdateManagerConstants.OPERATION_UNZIP_PLUGINS);
-		operation.setId(componentDescriptor.getUniqueIdentifier());
-		operation.setSource(downloadTarget);
-		// by specifiying the install dir with a trailing slash, the unzip method
-		// will just unzip the contents of the jar into the dir
-		applyTarget = UMEclipseTree.getBaseInstallURL().toExternalForm();
-		//	applyTarget = "file:///c:/temp/x/" ;
-		operation.setTarget(applyTarget);
-		operation.setData(descriptor);
-	}
-
-}
-/**
- * Creates one or more operations for the current session.
- */
-public void defineOperations(UMSessionManagerSession session, IInstallable[] descriptors, boolean bVerifyJars) {
-
-	for (int i = 0; i < descriptors.length; ++i) {
-
-		// Products
-		//---------
-		if (descriptors[i] instanceof IProductDescriptor) {
-
-			UMSessionManagerParcel parcel = null;
-
-			// Create parcel
-			//--------------
-			parcel = session.createParcel();
-			parcel.setType(IManifestAttributes.PRODUCT);
-			parcel.setAction(UpdateManagerConstants.OPERATION_ACTION_INSTALL);
-			parcel.setId(((IProductDescriptor) descriptors[i]).getUniqueIdentifier());
-			parcel.setData((IProductDescriptor) descriptors[i]);
-
-			defineProductOperation(parcel, descriptors[i], bVerifyJars);
-		}
-
-		// Components
-		//-----------
-		else if (descriptors[i] instanceof IComponentDescriptor) {
-
-			UMSessionManagerParcel parcel = null;
-
-			// Create parcel
-			//--------------
-			parcel = session.createParcel();
-			parcel.setType(IManifestAttributes.COMPONENT);
-			parcel.setAction(UpdateManagerConstants.OPERATION_ACTION_INSTALL);
-			parcel.setId(((IComponentDescriptor) descriptors[i]).getUniqueIdentifier());
-			parcel.setData((IComponentDescriptor) descriptors[i]);
-
-			defineComponentOperation(parcel, descriptors[i], bVerifyJars);
-		}
-
-		// Component Entries
-		//------------------
-		else if (descriptors[i] instanceof IComponentEntryDescriptor) {
-
-			UMSessionManagerParcel parcel = null;
-
-			// Create parcel
-			//--------------
-			parcel = session.createParcel();
-			parcel.setType(IManifestAttributes.COMPONENT);
-			parcel.setAction(UpdateManagerConstants.OPERATION_ACTION_INSTALL);
-			parcel.setId(((IComponentEntryDescriptor) descriptors[i]).getUniqueIdentifier());
-			parcel.setData((IComponentEntryDescriptor) descriptors[i]);
-
-			defineComponentOperation(parcel, descriptors[i], bVerifyJars);
-		}
-	}
-}
-/**
- * Creates one or more operations for the current parcel.
- */
-public void defineProductOperation(UMSessionManagerParcel parcel, IInstallable descriptor, boolean bVerifyJars) {
-
-	IProductDescriptor productDescriptor = (IProductDescriptor) descriptor;
-	UMSessionManagerOperation operation = null;
-
-	// Create download operation
-	//--------------------------
-	operation = parcel.createOperation();
-	operation.setAction(UpdateManagerConstants.OPERATION_COPY);
-	operation.setId(productDescriptor.getUniqueIdentifier());
-	operation.setSource(productDescriptor.getDownloadURL().toExternalForm());
-	String downloadTarget = UMEclipseTree.getStagingArea().toString() + productDescriptor.getDirName() + ".jar";
-	operation.setTarget(downloadTarget);
-	operation.setData(productDescriptor);
-
-	// Create jar verification operation
-	//----------------------------------
-	if (bVerifyJars == true) {
-		operation = parcel.createOperation();
-		operation.setAction(UpdateManagerConstants.OPERATION_VERIFY_JAR);
-		operation.setId(productDescriptor.getUniqueIdentifier());
-		operation.setSource(downloadTarget);
-		operation.setTarget(null);
-		operation.setData(productDescriptor);
-	}
-
-	// Create apply operation for product files     
-	//-----------------------------------------
-	operation = parcel.createOperation();
-	operation.setAction(UpdateManagerConstants.OPERATION_UNZIP_INSTALL);
-	operation.setId(productDescriptor.getUniqueIdentifier());
-	operation.setSource(downloadTarget);
-	String applyTarget = UMEclipseTree.getBaseInstallURL().toExternalForm();
-	operation.setTarget(applyTarget);
-	operation.setData(productDescriptor);
-
-	// Create component sub-parcels
-	//-----------------------------
-	IComponentEntryDescriptor[] entries = productDescriptor.getComponentEntries();
-	for (int j = 0; j < entries.length; ++j) {
-		if (entries[j].isSelected()) {
-
-			UMSessionManagerParcel subparcel = null;
-			// Create parcel for each component
-			//---------------------------------
-			subparcel = parcel.createParcel();
-			subparcel.setType(IManifestAttributes.COMPONENT);
-			subparcel.setAction(UpdateManagerConstants.OPERATION_ACTION_INSTALL);
-			subparcel.setId(entries[j].getUniqueIdentifier());
-			subparcel.setData(entries[j]);
-
-			defineComponentOperation(subparcel, entries[j], bVerifyJars);
-		}
-	}
-
-	// Create apply operation for product files     
-	//-----------------------------------------
-	String app = LaunchInfo.getCurrent().getApplicationConfigurationIdentifier();
-	if ((app != null) && (app.equals(productDescriptor.getUniqueIdentifier()))) { 	// dominant app?
-		operation = parcel.createOperation();
-		operation.setAction(UpdateManagerConstants.OPERATION_UNZIP_BINDIR);
-		operation.setId(productDescriptor.getUniqueIdentifier());
-		operation.setSource(downloadTarget);
-		operation.setTarget(applyTarget);
-		operation.setData(productDescriptor);
-	}
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManager.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManager.java
deleted file mode 100644
index ab379b5..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManager.java
+++ /dev/null
@@ -1,351 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.internal.boot.update.*;
-import java.io.*;
-import java.net.*;
-import java.util.*;
-
-/**
- * Session Manager executes defined sessions, and manages the update and update history logs.
- * Logs look like this:
- *
- * <session timestamp="xxxx" status="complete" attempts="1">
- *   <operation action="urltocache" status="complete" attempts="1">
- *      <parcel type="component" id="xxx" action="add" status="complete" attempts="1">
- *         <item id="xxx" source="file:///C:/temp/sample_in.java" target="file:///C:/temp/sample_out.java" status="complete" attempts="1">
- *            <message text="successful" timestamp="Thu Mar 01 09:56:49 EST 2001" />
- *         </item>
- *      </parcel>
- *   </operation>
- * </session>
- *
- *
- *  Each element is represented by an UpdateManagerXyz class and have specific
- * member functions for accessing domain specific attributes and child elements.
- * The "status" attribute can be one of "pending", "failed", or "complete".
- */
-
-public class UMSessionManager {
-	
-	protected Log _logUpdate  = null;
-	protected Log _logHistory = null;
-	
-	protected URL _urlUpdate  = null;
-	protected URL _urlHistory = null;
-
-	protected ArrayList _alUpdateSessions = new ArrayList();
-/**
- * Constructs an UpdateManager with the update log and history log URLs.
- * The boolean specifies whether an exception should be thrown if one of
- * the logs is not found.
- */
-public UMSessionManager(URL urlUpdateLog, URL urlHistoryLog, boolean notifyIfLogNotFound) throws LogStoreException {
-
-	_urlUpdate = urlUpdateLog;
-	_urlHistory = urlHistoryLog;
-
-	// Attempt to open the two logs
-	//-----------------------------
-	_logUpdate = new Log();
-	_logHistory = new Log();
-
-	// If the files do not exist
-	// notify if required.  Otherwise assume new files
-	//------------------------------------------------
-	try {
-		_logUpdate.load(_urlUpdate);
-	}
-	catch (LogStoreException ex) {
-//		_logUpdate.printEntryTree(0);
-		if (notifyIfLogNotFound == true) {
-			throw ex;
-		}
-	}
-
-	// Create the update session structure from the log
-	//-------------------------------------------------
-	buildTreeFromLog( _logUpdate );
-
-/*	
-	try {
-		_logHistory.load(_urlUpdate);
-	}
-	catch (LogStoreException ex) {
-		
-		if (notifyIfLogNotFound == true) {
-			throw ex;
-		}
-	}
-
-	_logHistory.printEntryTree(0);
-*/
-}
-/**
- * Creates a tree of sessions from the given log.
- * @param logUpdate org.eclipse.update.internal.core.Log
- * @param alUpdate java.util.ArrayList
- */
-private void buildTreeFromLog(Log logUpdate ) {
-	
-	ILogEntry[] entryChildren = logUpdate.getChildEntries();
-
-	UMSessionManagerSession session = null;
-	
-	for( int i=0; i<entryChildren.length; ++i )
-	{
-		session = new UMSessionManagerSession( entryChildren[i] );
-
-		_alUpdateSessions.add( session );
-		
-		session.buildTreeFromLog( entryChildren[i] );
-	}
-	
-	return;
-}
-/**
- * Creates a new update session where pending operations may be defined for
- * completion.
- * @return org.eclipse.update.internal.core.UMSessionManagerSession
- */
-public UMSessionManagerSession createUpdateSession() {
-
-	UMSessionManagerSession umSession = null;
-	
-	if( _logUpdate != null )
-	{
-		ILogEntry entrySession = new LogEntry( _logUpdate, UpdateManagerConstants.STRING_SESSION );
-		
-		_logUpdate.addChildEntry( entrySession );
-
-		umSession = new UMSessionManagerSession( entrySession );
-
-		umSession.buildTreeFromLog( entrySession );
-
-		_alUpdateSessions.add( umSession );
-	}
-	
-	return umSession;
-}
-/**
- * Runs all sessions
- */
-public boolean executePendingSessions(IProgressMonitor progressMonitor) {
-
-	// Run each of the failed sessions
-	//--------------------------------
-	boolean bSuccess = true;
-
-	UMSessionManagerSession session = null;
-
-	Iterator iter = _alUpdateSessions.iterator();
-
-	while (iter.hasNext() == true) {
-
-		session = (UMSessionManagerSession) iter.next();
-
-		if (session.getStatus().equals(UpdateManagerConstants.STATUS_PENDING) == true) {
-			if (session.execute(progressMonitor) == false) {
-				bSuccess = false;
-			}
-		}
-	}
-
-	return bSuccess;
-}
-/**
- * Runs one session
- */
-public boolean executeSession(UMSessionManagerSession session, IProgressMonitor progressMonitor) {
-
-	if (session == null)
-		return false;
-
-	// Run the session
-	//----------------
-	return session.execute(progressMonitor);
-}
-/**
- * Runs one session
- */
-public boolean executeSessionUndo(UMSessionManagerSession session, IProgressMonitor progressMonitor) {
-
-	if (session == null)
-		return false;
-
-	// Run the session
-	//----------------
-	return session.executeUndo(progressMonitor);
-}
-/**
- * Returns an array of sessions that are complete.
- * @return org.eclipse.update.internal.core.UMSessionManagerSession[]
- */
-private UMSessionManagerSession[] getUpdateSessionsCompleted() {
-
-	// Obtain the successfully completed sessions
-	//-------------------------------------------
-	UMSessionManagerSession session = null;
-
-	ArrayList alSessionsCompleted = new ArrayList();
-
-	Iterator iter = _alUpdateSessions.iterator();
-
-	while (iter.hasNext() == true) {
-
-		session = (UMSessionManagerSession) iter.next();
-
-		if (session.isComplete() == true) {
-			alSessionsCompleted.add(session);
-		}
-	}
-
-	Object[] objArray = alSessionsCompleted.toArray();
-	UMSessionManagerSession[] sessions = new UMSessionManagerSession[objArray.length];
-	System.arraycopy(objArray, 0, sessions, 0, objArray.length);
-
-	return sessions;
-}
-/**
- * Removes an existing update session
- *
- */
-private boolean removeUpdateSession(UMSessionManagerSession session) {
-
-	if (session != null && _logUpdate != null) {
-
-	    // Ensure session exists
-	    //----------------------
-		if (_alUpdateSessions.contains(session) == false) {
-			return false;
-		}
-
-		// Remove the log entry
-		//---------------------
-		if (session.getLogEntry() != null) {
-
-			if (_logUpdate.removeChildEntry(session.getLogEntry()) == false) {
-				return false;
-			}
-
-			// Remove the session
-			//-------------------
-			_alUpdateSessions.remove(session);
-		}
-	}
-
-	return true;
-}
-/**
- * Saves the current state of the update log.
- */
-public void saveUpdateLog() throws LogStoreException {
-	_logUpdate.save( _urlUpdate );
-}
-/**
- * Moves all completed sessions in the update log to the history log.
- * This method does not parse the history file.  Sessions are written to
- * the end of the history log and removed from the update log tree, and update
- * session tree.  The update log is saved.
- */
-public void updateAndSaveLogs() throws LogStoreException {
-
-	// Check for history log URL
-	// If none, save the update log
-	//-----------------------------
-	if (_urlHistory == null) {
-		saveUpdateLog();
-		return;
-	}
-
-	// Obtain a list of completed update sessions
-	//-------------------------------------------
-	UMSessionManagerSession[] sessionsCompleted = getUpdateSessionsCompleted();
-
-	// If there are none, save the update log
-	//---------------------------------------
-	if (sessionsCompleted.length <= 0) {
-		saveUpdateLog();
-		return;
-	}
-
-	// Attempt to open the output log
-	//-------------------------------
-	String strFilespec = UMEclipseTree.getFileInPlatformString(_urlHistory);
-	
-
-	File file = new File(strFilespec);
-
-	boolean bExists = file.exists();
-
-	if (bExists == false) {
-		try {
-			bExists = file.createNewFile();
-		}
-		catch (IOException ex) {
-			return;
-		}
-	}
-
-	// Create a file writer and seek to the end of the file
-	//-----------------------------------------------------
-	RandomAccessFile fileWriter = null;
-
-	if (bExists == true) {
-		try {
-			fileWriter = new RandomAccessFile(file, "rw");
-			long lLength = fileWriter.length();
-			fileWriter.seek(lLength);
-		}
-		catch (IOException ex) {
-			fileWriter = null;
-		}
-	}
-
-	// Write out each session log to the history log
-	// Remove the session log from the update log
-	// Save both logs
-	//----------------------------------------------
-	StringBuffer strb = new StringBuffer();
-
-	if (fileWriter != null) {
-
-		ILogEntry logEntry = null;
-
-		for (int i = 0; i < sessionsCompleted.length; ++i) {
-
-			logEntry = sessionsCompleted[i].getLogEntry();
-
-			if (logEntry != null) {
-				logEntry.printPersistentEntryString(strb, 0);
-			}
-		}
-	}
-
-	// Write the buffer to the end of the history file
-	//------------------------------------------------
-	if (strb.length() > 0) {
-		try {
-			fileWriter.write(strb.toString().getBytes());
-			fileWriter.close();
-		}
-		catch (IOException ex) {
-
-		}
-	}
-
-	// Remove the update sessions from the update log
-	//-----------------------------------------------
-	for (int i = 0; i < sessionsCompleted.length; ++i) {
-		removeUpdateSession(sessionsCompleted[i]);
-	}
-
-	// Save the update log to keep logs in sync
-	//-----------------------------------------
-	saveUpdateLog();
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerEntry.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerEntry.java
deleted file mode 100644
index 9d616c8..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerEntry.java
+++ /dev/null
@@ -1,171 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.internal.boot.update.*;
-/**
- * Abstract class for update manager objects that have an ILogEntry
- */
-public abstract class UMSessionManagerEntry {
-	protected ILogEntry _logEntry = null;
-	protected ILogEntryProperty _propertyStatus = null;
-	protected ILogEntryProperty _propertyAttempts = null;
-	protected Object            _objData = null;
-/**
- * UpdateManagerEntry constructor comment.
- */
-public UMSessionManagerEntry( ILogEntry logEntry ) {
-	_logEntry = logEntry;
-
-	// Status
-	//-------
-	_propertyStatus = _logEntry.getProperty(UpdateManagerConstants.STRING_STATUS);
-
-	if (_propertyStatus == null) {
-		_propertyStatus = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_STATUS, UpdateManagerConstants.STATUS_PENDING );
-		logEntry.addProperty( _propertyStatus );
-	}
-
-	// Attempts
-	//---------
-	_propertyAttempts = _logEntry.getProperty(UpdateManagerConstants.STRING_ATTEMPTS);
-
-	if (_propertyAttempts == null) {
-		_propertyAttempts = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_ATTEMPTS, UpdateManagerConstants.STRING_0 );
-		logEntry.addProperty( _propertyAttempts );
-	}
-
-}
-/**
- * @param logEntry org.eclipse.update.internal.core.ILogEntry
- */
-public void buildTreeFromLog(ILogEntry logEntry) {
-	
-	// Attempts
-	//---------
-	ILogEntryProperty property = _logEntry.getProperty(UpdateManagerConstants.STRING_ATTEMPTS);
-
-	if (property != null) {
-		_propertyAttempts = property;
-	}
-	
-	// Status
-	//-------
-	property = _logEntry.getProperty(UpdateManagerConstants.STRING_STATUS);
-
-	if (property != null) {
-		_propertyStatus = property;
-	}
-}
-/**
- * 
- * @return java.lang.String
- * @param strPrefix java.lang.String
- * @param ex java.lang.Exception
- */
-public String createMessageString(String strPrefix, Exception ex) {
-
-	StringBuffer strb = new StringBuffer(strPrefix);
-
-	if (ex != null) {
-		if (ex.getLocalizedMessage() != null) {
-			strb.append(": " + ex.getLocalizedMessage());
-		}
-
-		else if (ex.toString() != null && ex.toString().length() > 0) {
-			strb.append(": " + ex.toString());
-		}
-	}
-
-	return strb.toString();
-}
-/**
- * Execute any pending or failed updates.
- */
-public abstract boolean execute( IProgressMonitor progressMonitor );
-/**
- * Execute any pending or failed updates.
- */
-public abstract boolean executeUndo( IProgressMonitor progressMonitor );
-/**
- * @return java.lang.Object
- */
-public java.lang.Object getData() {
-	return _objData;
-}
-/**
- * Returns the log entry associated with this session object.
- * @return org.eclipse.update.internal.core.ILogEntry
- */
-public ILogEntry getLogEntry() {
-	return _logEntry;
-}
-/**
- *
- * @return java.lang.String
- */
-public String getStatus() {
-
-	return _propertyStatus.getValue();
-}
-/**
- * @param strb java.lang.StringBuffer
- * @param iIndentation int
- */
-public abstract void getStatusString(StringBuffer strb, int iIndentation);
-/**
- * Increments the value of the number of attempts
- */
-public void incrementAttemptCount() {
-
-	int iAttempts = 0;
-
-	try {
-		iAttempts = new Integer(_propertyAttempts.getValue()).intValue();
-	}
-	catch (Exception ex) {
-	}
-
-	_propertyAttempts.setValue( Integer.toString( ++iAttempts ) );
-}
-/**
- * @param strb java.lang.StringBuffer
- * @param iIndentation int
- */
-public void indent(StringBuffer strb, int iIndentation) {
-
-	// Line feed
-	//----------
-	strb.append( "\n" );
-
-	// Indentation spaces
-	//-------------------
-	for( int i=0; i<iIndentation; ++i ){
-		strb.append( " " );
-	}
-}
-/**
- */
-public void resetAttemptCount() {
-	_propertyAttempts.setValue( UpdateManagerConstants.STRING_0 );
-}
-/**
- * Stores IManifestDescriptor
- * @param newData java.lang.Object
- */
-public void setData(java.lang.Object objData) {
-	_objData = objData;
-}
-/**
- * Every entry has a status property.
- * @return java.lang.String
- * @param status java.lang.String
- */
-public void setStatus(String strStatus) {
-
-	_propertyStatus.setValue( strStatus != null ? strStatus : UpdateManagerConstants.STRING_EMPTY );
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerMessage.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerMessage.java
deleted file mode 100644
index 3a9c9b9..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerMessage.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.internal.boot.update.*;
-import java.util.Date;
-
-/**
- * This class represents a failure message and consists of a timestamp and text.
- *
- */
-
-public class UMSessionManagerMessage {
-	protected ILogEntry _logEntry = null;
-	protected ILogEntryProperty _propertyTimestamp = null;
-	protected ILogEntryProperty _propertyText      = null;
-/**
- *
- * @param logEntry org.eclipse.update.internal.core.ILogEntry
- */
-public UMSessionManagerMessage(ILogEntry logEntry) {
-
-	_logEntry = logEntry;
-	
-	// Text
-	//-----
-	_propertyText = _logEntry.getProperty(UpdateManagerConstants.STRING_TEXT);
-
-	if (_propertyText == null) {
-		_propertyText = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_TEXT, UpdateManagerConstants.STRING_EMPTY );
-		logEntry.addProperty( _propertyText );
-	}
-
-	// Timestamp
-	//----------
-	_propertyTimestamp = _logEntry.getProperty(UpdateManagerConstants.STRING_TIMESTAMP);
-
-	if (_propertyTimestamp == null) {
-		_propertyTimestamp = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_TIMESTAMP, new Date().toString() );
-		logEntry.addProperty( _propertyTimestamp );
-	}
-}
-/**
- * @param logEntry org.eclipse.update.internal.core.LogEntry
- */
-public void buildTreeFromLog(ILogEntry logEntry) {
-		
-	// Text
-	//-----
-	ILogEntryProperty property = _logEntry.getProperty(UpdateManagerConstants.STRING_TEXT);
-
-	if (property != null) {
-		_propertyText = property;
-	}
-
-	// Source
-	//-------
-	property = _logEntry.getProperty(UpdateManagerConstants.STRING_TIMESTAMP);
-
-	if (property != null) {
-		_propertyTimestamp = property;
-	}
-}
-/**
- * @return java.lang.String
- */
-public String getText() {
-	
-	return _propertyText.getValue();
-}
-/**
- *
- */
-public void setText( String strID ) {
-	_propertyText.setValue( strID != null ? strID : UpdateManagerConstants.STRING_EMPTY );
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerOperation.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerOperation.java
deleted file mode 100644
index f6aadd5..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerOperation.java
+++ /dev/null
@@ -1,1189 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.webdav.http.client.Response;
-import java.util.jar.*;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.internal.boot.LaunchInfo;
-import org.eclipse.update.internal.ui.*;
-import org.eclipse.core.internal.boot.update.*;
-import java.io.*;
-import java.net.*;
-import java.util.*;
-
-/**
- * This class represents an operation such as "copy" or "unzip".
- * Attributes are id, status (pending/complete), action,
- * source, target.  Children are messages.
- */
-
-public class UMSessionManagerOperation extends UMSessionManagerEntry {
-		
-	protected ArrayList         _alMessages     = new ArrayList();
-	protected ILogEntryProperty _propertyAction = null;
-	protected ILogEntryProperty _propertyID     = null;
-	protected ILogEntryProperty _propertySource = null;
-	protected ILogEntryProperty _propertyTarget = null;
-/**
- * UpdateManagerOperation constructor comment.
- */
-public UMSessionManagerOperation( ILogEntry logEntry ) {
-	super( logEntry );
-
-	// Action
-	//-------
-	_propertyAction = _logEntry.getProperty(UpdateManagerConstants.STRING_ACTION);
-
-	if (_propertyAction == null) {
-		_propertyAction = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_ACTION, UpdateManagerConstants.STRING_EMPTY );
-		logEntry.addProperty( _propertyAction );
-	}
-
-	// Id
-	//---
-	_propertyID = _logEntry.getProperty(UpdateManagerConstants.STRING_ID);
-
-	if (_propertyID == null) {
-		_propertyID = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_ID, UpdateManagerConstants.STRING_EMPTY );
-		logEntry.addProperty( _propertyID );
-	}
-
-	// Source
-	//-------
-	_propertySource = _logEntry.getProperty(UpdateManagerConstants.STRING_SOURCE);
-
-	if (_propertySource == null) {
-		_propertySource = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_SOURCE, UpdateManagerConstants.STRING_EMPTY );
-		logEntry.addProperty( _propertySource );
-	}
-
-	// Target
-	//-------
-	_propertyTarget = _logEntry.getProperty(UpdateManagerConstants.STRING_TARGET);
-
-	if (_propertyTarget == null) {
-		_propertyTarget = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_TARGET, UpdateManagerConstants.STRING_EMPTY );
-		logEntry.addProperty( _propertyTarget);
-	}
-}
-/**
- * @param logEntry org.eclipse.update.internal.core.LogEntry
- */
-public void buildTreeFromLog(ILogEntry logEntry) {
-	
-	super.buildTreeFromLog( logEntry );
-	
-	// Action
-	//-------
-	ILogEntryProperty property = _logEntry.getProperty(UpdateManagerConstants.STRING_ACTION);
-
-	if (property != null) {
-		_propertyAction = property;
-	}
-	
-
-	// Id
-	//---
-	property = _logEntry.getProperty(UpdateManagerConstants.STRING_ID);
-
-	if (property != null) {
-		_propertyID = property;
-	}
-
-	// Source
-	//-------
-	property = _logEntry.getProperty(UpdateManagerConstants.STRING_SOURCE);
-
-	if (property != null) {
-		_propertySource = property;
-	}
-
-	// Target
-	//-------
-	property = _logEntry.getProperty(UpdateManagerConstants.STRING_TARGET);
-
-	if (property != null) {
-		_propertyTarget = property;
-	}
-
-
-	ILogEntry[] entries = logEntry.getChildEntries();
-
-	// Messages
-	//---------
-	int iIndex = 0;
-	UMSessionManagerMessage message = null;
-	
-	for( int i = 0; i < entries.length; ++i) {
-		if (entries[i] != null && entries[i].getName().equals(UpdateManagerConstants.STRING_MESSAGE) == true) {
-			message = new UMSessionManagerMessage( entries[i] );			
-	        _alMessages.add( message );
-
-	        message.buildTreeFromLog( entries[i] );
-		}
-	}
-}
-/**
- * Copies all data from input stream to output stream.
- * @param inputStream java.io.InputStream
- * @param outputStream java.io.OutputStream
- */
-public String copyStream(InputStream streamInput, OutputStream streamOutput, long lContentLength, String strTaskName, IProgressMonitor progressMonitor, boolean bSubtask) {
-
-	String strErrorMessage = null;
-
-	// Allocate buffer
-	//---------------- 
-	byte[] byteArray = null;
-
-	if (streamInput != null && streamOutput != null) {
-		byteArray = new byte[64000];
-	}
-
-	if (byteArray != null) {
-
-		// Copy
-		//-----
-		if (progressMonitor != null) {
-			if (bSubtask == false) {
-				if (lContentLength > 0 && lContentLength < Integer.MAX_VALUE)
-					progressMonitor.beginTask(UpdateManagerStrings.getString("S_Copy") + ": " +strTaskName, (int) lContentLength);
-				else
-					progressMonitor.beginTask(UpdateManagerStrings.getString("S_Copy") + ": "  + strTaskName, IProgressMonitor.UNKNOWN);
-			}
-			else {
-				progressMonitor.subTask(UpdateManagerStrings.getString("S_Copy") + ": "  + strTaskName);
-			}
-		}
-
-		int iBytesReceived = 0;
-
-		do {
-			// Read
-			//-----
-			try {
-				iBytesReceived = streamInput.read(byteArray);
-			}
-			catch (Exception ex) {
-				iBytesReceived = 0;
-				strErrorMessage = UpdateManagerStrings.getString("S_Error_reading_from_input_stream") + ": " + ex.getMessage();
-			}
-
-			// Write
-			//------
-			if (iBytesReceived > 0) {
-				try {
-					streamOutput.write(byteArray, 0, iBytesReceived);
-
-					if (progressMonitor != null && bSubtask == false)
-						progressMonitor.worked(iBytesReceived);
-				}
-				catch (IOException ex) {
-					iBytesReceived = 0;
-					strErrorMessage = UpdateManagerStrings.getString("S_Error_writing_to_output_stream") + ": " + ex.getMessage();
-				}
-			}
-		}
-		while (iBytesReceived > 0);
-
-		if (progressMonitor != null && bSubtask == false) {
-			progressMonitor.done();
-		}
-	}
-
-	return strErrorMessage;
-}
-/**
- *
- * @return org.eclipse.update.internal.core.UMSessionManagerMessage
- * @param actionType java.lang.String
- */
-public UMSessionManagerMessage createMessage() {
-
-	// Create a new log entry
-	//-----------------------
-	ILogEntry logEntryChild = new LogEntry( _logEntry, UpdateManagerConstants.STRING_MESSAGE );
-	_logEntry.addChildEntry( logEntryChild );
-
-	// Create the operation object
-	//----------------------------
-	UMSessionManagerMessage message = new UMSessionManagerMessage( logEntryChild );
-	
-	message.buildTreeFromLog( logEntryChild );
-	
-	_alMessages.add( message );
-	
-	return message;
-}
-/**
- *
- * 
- */
-public boolean doCopy(IProgressMonitor progressMonitor) {
-
-	String strErrorMessage = null;
-
-	// Input URL
-	//----------
-	URL urlInput = null;
-
-	try {
-		urlInput = new URL(getSource());
-	}
-	catch (MalformedURLException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Source_URL_is_malformed"), ex);
-	}
-
-	URL urlOutput = null;
-
-	// Output URL
-	//-----------
-	try {
-		urlOutput = new URL(getTarget());
-	}
-	catch (MalformedURLException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Target_URL_is_malformed"), ex);
-	}
-
-	// Input
-	//-------
-	InputStream streamInput = null;
-
-	long lContentLength = 0;
-
-	if (urlInput != null && urlOutput != null) {
-
-		// Input stream
-		//-------------
-		try {
-			URLHandler.Response response = (URLHandler.Response)URLHandler.open(urlInput);
-			lContentLength = response.getContentLength();
-			if( response.getResponseCode() == HttpURLConnection.HTTP_OK )
-				streamInput = response.getInputStream();
-		}
-		catch (IOException ex) {
-			strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Unable_to_obtain_source_input_stream"), ex);
-		}
-
-	}
-
-	// Output
-	//-------
-	OutputStream streamOutput = null;
-
-	if (streamInput != null) {
-
-		// Output connection
-		//------------------
-		URLConnection urlConnectionOutput = null;
-		
-		try {
-			urlConnectionOutput = urlOutput.openConnection();
-			urlConnectionOutput.setDoOutput(true);
-		}
-		catch (IOException ex) {
-			strErrorMessage = createMessageString( UpdateManagerStrings.getString("S_Unable_to_connect"), ex );
-		}
-
-		// Output stream
-		//--------------
-		if (urlConnectionOutput != null) {
-			try {
-				streamOutput = urlConnectionOutput.getOutputStream();
-			}
-			catch (IOException ex) {
-				strErrorMessage = createMessageString( UpdateManagerStrings.getString("S_Unable_to_obtain_target_output_stream"), ex );
-			}
-		}
-
-		// Attempt to create a file output stream
-		// This is used when protocol is file: or valoader:
-		// thus our local writes are all file I/O currently
-		//-------------------------------------------------
-		if (streamOutput == null) {
-	        try
-	        {
-		 		streamOutput = getFileOutputStream(urlOutput);
-	        }
-	        catch( IOException ex){
-				strErrorMessage = createMessageString( UpdateManagerStrings.getString("S_Unable_to_create_file"), ex );
-			}
-		}
-	}
-
-	if( streamInput != null && streamOutput != null )
-	{
-	    strErrorMessage = copyStream( streamInput, streamOutput, lContentLength, urlInput.toExternalForm(), progressMonitor, false );
-	}    
-
-	// Close input stream
-	//-------------------
-	if (streamInput != null) {
-		try {
-			streamInput.close();
-		}
-		catch (IOException ex) {
-		}
-	}
-
-	// Close output stream
-	//--------------------
-	if (streamOutput != null) {
-		try {
-			streamOutput.flush();
-			streamOutput.close();
-		}
-		catch (IOException ex) {
-			strErrorMessage = createMessageString( UpdateManagerStrings.getString("S_Error_closing_output_stream"), ex );
-		}
-	}
-	
-	// Increment the number of attempts
-	//---------------------------------
-	incrementAttemptCount();
-
-	// Error return
-	//-------------
-	if (strErrorMessage != null) {
-		UMSessionManagerMessage message = createMessage();
-		message.setText(strErrorMessage);
-		setStatus(UpdateManagerConstants.STATUS_FAILED);
-		return false;
-	}
-
-	// Successful return
-	//------------------
-	setStatus(UpdateManagerConstants.STATUS_SUCCEEDED);
-
-	return true;
-}
-/**
- *
- * 
- */
-public boolean doUnzip(IProgressMonitor progressMonitor) {
-
-	String strErrorMessage = null;
-	int rc = UpdateManagerConstants.UNDEFINED_CONTENTS;
-
-	// Input URL
-	//----------
-	URL urlInput = null;
-	try {
-		urlInput = new URL(getSource());
-	}
-	catch (MalformedURLException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Source_URL_is_malformed"), ex);
-	}
-
-	// Output URL
-	//-----------
-	URL urlOutput = null;
-	try {
-		urlOutput = new URL(getTarget());
-	}
-	catch (MalformedURLException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Target_URL_is_malformed"), ex);
-	}
-
-	// For unzipping plugins or component/configuration jar, 
-	// set up the list of directories to look for, also call
-	// LaunchInfo.installPending
-	//-----------------------------------------------------
-	Vector dirNames = new Vector();
-	Vector dirNamesInstalled = new Vector();// keep track of plugins/fragments unzipped
-	Vector dirNamesUnexpected = new Vector();	// keep track of unexpected plugins/fragments dir
-	ArrayList productVIDs = new ArrayList();
-	ArrayList componentVIDs = new ArrayList();
-	ArrayList pluginVIDs = new ArrayList();
-	ArrayList fragmentVIDs = new ArrayList();
-
-	if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_PLUGINS ) {
-		IComponentDescriptor comp = null;
-		if (getData() instanceof IComponentEntryDescriptor) {
-			comp = ((IComponentEntryDescriptor) getData()).getComponentDescriptor();
-		} else {
-			comp = (IComponentDescriptor) getData();
-		}
-		if (comp != null) {
-			IPluginEntryDescriptor[] plugins = comp.getPluginEntries();
-			for (int i=0; i<plugins.length; i++) {
-				dirNames.addElement( UMEclipseTree.PLUGINS_DIR + "/" + plugins[i].getDirName());
-				pluginVIDs.add(new LaunchInfo.VersionedIdentifier(plugins[i].getUniqueIdentifier(), plugins[i].getVersionStr()));
-			}
-			IFragmentEntryDescriptor[] fragments = comp.getFragmentEntries();
-			for (int i=0; i<fragments.length; i++) {
-				dirNames.addElement( UMEclipseTree.FRAGMENTS_DIR + "/" + fragments[i].getDirName());	
-				fragmentVIDs.add(new LaunchInfo.VersionedIdentifier(plugins[i].getUniqueIdentifier(), plugins[i].getVersionStr()));
-			}
-		} else {
-			strErrorMessage = UpdateManagerStrings.getString("S_Error_in_registry");
-		}
-	} else if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_INSTALL) {
-		rc = UpdateManagerConstants.INSTALL_XML_MISSING;
-		if (getData() instanceof IProductDescriptor) {
-			IProductDescriptor desc = (IProductDescriptor) getData();
-			dirNames.addElement(UMEclipseTree.INSTALL_DIR + "/" + UMEclipseTree.PRODUCTS_DIR + "/" + desc.getDirName());
-			productVIDs.add(new LaunchInfo.VersionedIdentifier(desc.getUniqueIdentifier(), desc.getVersionStr()));
-		} else { 
-			IComponentDescriptor desc = null;
-			if (getData() instanceof IComponentEntryDescriptor) {
-				desc = ((IComponentEntryDescriptor) getData()).getComponentDescriptor();
-			} else {
-				desc = (IComponentDescriptor) getData();
-			}
-			dirNames.addElement(UMEclipseTree.INSTALL_DIR + "/" + UMEclipseTree.COMPONENTS_DIR + "/" + desc.getDirName());
-			componentVIDs.add(new LaunchInfo.VersionedIdentifier(desc.getUniqueIdentifier(), desc.getVersionStr()));
-		}
-	}
-	if (!LaunchInfo.getCurrent().installPending(productVIDs, componentVIDs, pluginVIDs, fragmentVIDs)) {
-		strErrorMessage = UpdateManagerStrings.getString("S_Error_occurred_during_installation_setup");
-	}
-	
-	
-	// Create a file specification from the input URL
-	//-----------------------------------------------
-	String strFilespec = UMEclipseTree.getFileInPlatformString(urlInput);
-
-	JarFile jarFile = null;
-
-	try {
-		jarFile = new JarFile(strFilespec);
-	}
-	catch (IOException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Unable_to_open_Jar_file"), ex);
-	}
-
-	if ((jarFile != null) && (strErrorMessage == null)) {
-
-		JarEntry entry = null;
-		InputStream streamInputEntry = null;
-
-		int iCount = jarFile.size();
-		
-		// Set up progress monitor
-		// Compute the filename without the path information
-		//--------------------------------------------------
-		String strFilename = strFilespec;
-		int iIndex = strFilespec.lastIndexOf(File.separatorChar);
-		
-		if (iIndex >= 0 && iIndex < strFilespec.length() - 1) {
-			strFilename = strFilespec.substring(iIndex + 1);
-		}
-
-		if (progressMonitor != null) {
-			progressMonitor.beginTask(UpdateManagerStrings.getString("S_Install") + ": " + strFilename, iCount);
-		}
-
-
-		// Do each jar file entry
-		//-----------------------
-		Enumeration enum = jarFile.entries();
-		while (enum.hasMoreElements() == true) {
-			entry = (JarEntry) enum.nextElement();
-			String entryName = entry.getName();
-			
-			if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_PLUGINS ) {
-				// Unzip plugins and fragments.  Skip entries not under plugins/  or fragments/ trees
-				//-----------------------------------------------------------------------------------
-				if ((!entryName.startsWith(UMEclipseTree.PLUGINS_DIR) &&
-					!entryName.startsWith(UMEclipseTree.FRAGMENTS_DIR)) 
-					|| entryName.endsWith("/")) {
-					if (progressMonitor != null) progressMonitor.worked(1);
-					continue;
-				}
-				String prefix = entryName;
-				int second_slash = entryName.indexOf("/", (entryName.indexOf("/")+1));
-				if (second_slash > 0) 
-					prefix = entryName.substring(0,second_slash);
-				int match = dirNames.indexOf(prefix);
-				if (match < 0) {   // not a valid plugin
-					if (!dirNamesUnexpected.contains(prefix))
-						dirNamesUnexpected.addElement(prefix);
-					continue;
-				}
-				// got an entry with matching directory 
-				// keep track of which ones they are
-				if (!dirNamesInstalled.contains(prefix))
-					dirNamesInstalled.addElement(prefix);
-			} else if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_INSTALL) {
-				// Skip over entries that don't start with the right dir naming convention (id_version)
-				//-------------------------------------------------------------------------------------
-				if (!entryName.startsWith((String)dirNames.firstElement()) || entryName.endsWith("/")) {
-					if (progressMonitor != null) progressMonitor.worked(1);
-					continue;
-				}
-				// got an entry - as long as we have install.xml we're happy
-				if (entryName.equals((String)dirNames.firstElement()+"/"+IManifestAttributes.INSTALL_MANIFEST))
-					rc = UpdateManagerConstants.OK;
-			} else if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_BINDIR) {
-				// Unzip the bin directory, if it exists
-				//--------------------------------------
-				if (!entryName.startsWith(UMEclipseTree.BIN_DIR) || entryName.endsWith("/")) {
-					if (progressMonitor != null) progressMonitor.worked(1);
-					continue;
-				}
-				// got bin dir
-				rc = UpdateManagerConstants.OK;
-			}
-			try {
-				streamInputEntry = jarFile.getInputStream(entry);
-			}
-			catch (IOException ex) {
-				streamInputEntry = null;
-				strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Unable_to_open_jar_entry_input_stream"), ex);
-				break;
-			}
-			catch (SecurityException ex) {
-				streamInputEntry = null;
-				strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Encountered_jar_entry_security_exception"), ex);
-				break;
-			}
-
-
-			// Create an output URL
-			//---------------------
-			URL urlOutputFile = null;
-
-			if (streamInputEntry != null) {
-				try {
-					// Ensure file separator between target directory, and source file path
-					//---------------------------------------------------------------------
-					StringBuffer strbTarget = new StringBuffer(getTarget());
-					if (getTarget().endsWith("/") == false) {
-						strbTarget.append('/');
-					}
-					strbTarget.append(entryName);
-					urlOutputFile = new URL(strbTarget.toString());
-					File fTarget = new File(UMEclipseTree.getFileInPlatformString(urlOutputFile));
-					if (fTarget.exists() &&
-						(getAction() != UpdateManagerConstants.OPERATION_UNZIP_BINDIR)) {		
-						// we will not override existing files, except in bin/
-						if (progressMonitor != null) progressMonitor.worked(1);
-						continue;
-					}
-				}
-				catch (MalformedURLException ex) {
-					strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Unable_to_create_jar_entry_URL"), ex);
-					break;
-				}
-			}
-
-
-			// Create a file output stream
-			//----------------------------
-			OutputStream streamOutputFile = null;
-
-			if (urlOutputFile != null) {
-				try {
-					streamOutputFile = getFileOutputStream(urlOutputFile);
-				}
-				catch (IOException ex) {
-					strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Unable_to_create_output_file_for_Jar_entry") + ": " + urlOutputFile.toExternalForm(), ex);
-					break;
-				}
-			}
-
-			// Copy from input to output stream
-			//---------------------------------
-			if (streamInputEntry != null && streamOutputFile != null) {
-
-	            // Do not alter progress monitor
-	            //------------------------------
-				strErrorMessage = copyStream(streamInputEntry, streamOutputFile, 0, entryName, null, true );
-				if (strErrorMessage != null) {
-					break;
-				}
-			}
-			try {
-				if (streamInputEntry != null) 	streamInputEntry.close();
-				if (streamOutputFile != null) 	streamOutputFile.close();
-			} catch (java.io.IOException ex) {
-				// unchecked
-			}
-			if (progressMonitor != null) progressMonitor.worked(1);
-		}	// while
-//		strErrorMessage = "Error Injected!";
-		try {
-			jarFile.close();
-		} catch (java.io.IOException ex) {
-			// unchecked
-		}		
-	}	// if jarFile is not null
-
-	// tally up what's unzipped and what's not
-	//---------------------------------
-	if (strErrorMessage == null) {
-		if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_PLUGINS ) {
-			if (dirNamesUnexpected.size() > 0) {
-				rc = UpdateManagerConstants.UNDEFINED_CONTENTS;
-				strErrorMessage = UpdateManagerStrings.getString("S_Undefined_contents_found_in_Jar");
-			}
-			else if (!dirNamesInstalled.containsAll(dirNames)) {
-				rc = UpdateManagerConstants.MISSING_CONTENTS;
-				strErrorMessage = UpdateManagerStrings.getString("S_Unable_to_find_defined_contents_in_Jar");
-			} 
-		} else if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_INSTALL) {
-			if (rc != UpdateManagerConstants.OK)
-				strErrorMessage = UpdateManagerStrings.getString("S_Unable_to_find_install_manifest_file_in_Jar");
-		}
-	}		
-	
-	// Call LaunchInfo.installConfirmed if all clean
-	// Otherwise, call after we've cleaned up (undo*)
-	//-----------------------------------------------
-	if (strErrorMessage == null) {
-		if (!LaunchInfo.getCurrent().installConfirmed(productVIDs, componentVIDs, pluginVIDs, fragmentVIDs)) {
-			strErrorMessage = UpdateManagerStrings.getString("S_Error_occurred_during_installation_completion");
-		}
-	}
-	
-	if (progressMonitor != null) progressMonitor.done();
-
-	// Increment the number of attempts
-	//---------------------------------
-	incrementAttemptCount();
-
-	// Error return
-	//-------------
-	if (strErrorMessage != null) {
-		UMSessionManagerMessage message = createMessage();
-		message.setText(strErrorMessage);
-		setStatus(UpdateManagerConstants.STATUS_FAILED);
-		return false;
-	}
-
-	// Successful return
-	//------------------
-	setStatus(UpdateManagerConstants.STATUS_SUCCEEDED);
-
-	return true;
-}
-/**
- *
- * 
- */
-public boolean doVerify(IProgressMonitor progressMonitor) {
-
-	String strErrorMessage = null;
-
-	// Input URL
-	//----------
-	URL urlInput = null;
-
-	try {
-		urlInput = new URL(getSource());
-	}
-	catch (MalformedURLException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Source_URL_is_malformed"), ex);
-	}
-
-	IInstallable installable = (IInstallable) getData();
-
-	String strName = installable.getLabel();
-	String strId = null;
-	String strProviderName = null;
-
-	if (installable instanceof IProductDescriptor) {
-		strId = ((IProductDescriptor) installable).getUniqueIdentifier();
-		strProviderName = ((IProductDescriptor) installable).getProviderName();
-	}
-	else if (installable instanceof IComponentDescriptor) {
-		strId = ((IComponentDescriptor) installable).getUniqueIdentifier();
-		strProviderName = ((IComponentDescriptor) installable).getProviderName();
-	}
-	else if (installable instanceof IComponentEntryDescriptor) {
-		strId = ((IComponentEntryDescriptor) installable).getUniqueIdentifier();
-	}
-	else if (installable instanceof IPluginEntryDescriptor) {
-		strId = ((IPluginEntryDescriptor) installable).getUniqueIdentifier();
-	}
-	else if (installable instanceof IFragmentEntryDescriptor) {
-		strId = ((IFragmentEntryDescriptor) installable).getUniqueIdentifier();
-	}
-
-	JarVerificationService verifier = UpdateManager.getCurrentInstance().getJarVerifier();
-
-	JarVerificationResult result = verifier.okToInstall(new File(urlInput.getFile()), strId, strName, strProviderName, progressMonitor);
-
-	if (result.getResultCode() == JarVerificationResult.CANCEL_INSTALL) {
-		Exception ex = result.getResultException();
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Installation_cancelled_by_user"), ex);
-	}
-
-	// Increment the number of attempts
-	//---------------------------------
-	incrementAttemptCount();
-
-	// Error return
-	//-------------
-	if (strErrorMessage != null) {
-		UMSessionManagerMessage message = createMessage();
-		message.setText(strErrorMessage);
-		setStatus(UpdateManagerConstants.STATUS_FAILED);
-		return false;
-	}
-
-	// Successful return
-	//------------------
-	setStatus(UpdateManagerConstants.STATUS_SUCCEEDED);
-
-	return true;
-}
-/**
- * Execute copy from source URL to target URL.
- */
-public boolean execute(IProgressMonitor progressMonitor) {
-
-	if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_INSTALL ||
-		getAction() == UpdateManagerConstants.OPERATION_UNZIP_PLUGINS ||
-		getAction() == UpdateManagerConstants.OPERATION_UNZIP_BINDIR) {
-		return doUnzip(progressMonitor);
-	}
-	
-	else if (getAction() == UpdateManagerConstants.OPERATION_COPY) {
-		return doCopy(progressMonitor);
-	}
-	else if (getAction() == UpdateManagerConstants.OPERATION_VERIFY_JAR) {
-		return doVerify(progressMonitor);
-	}
-	return false;
-}
-/**
- * Execute any pending or failed updates.
- */
-public boolean executeUndo(IProgressMonitor progressMonitor) {
-
-	// Undo all successful and failed operations
-	//------------------------------------------
-	if (getStatus().equals(UpdateManagerConstants.STATUS_PENDING) == false) {
-		if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_INSTALL ||
-			getAction() == UpdateManagerConstants.OPERATION_UNZIP_PLUGINS) {
-			return undoUnzip(progressMonitor);
-		}
-		else if (getAction() == UpdateManagerConstants.OPERATION_COPY) {
-			return undoCopy(progressMonitor);
-		}
-		else if (getAction() == UpdateManagerConstants.OPERATION_VERIFY_JAR){
-			return undoVerify(progressMonitor);
-		}
-	}
-
-	return true;
-}
-/**
- * 
- * @return java.lang.String
- */
-public String getAction() {
-	
-	return _propertyAction.getValue();
-}
-/**
- * Creates a file output stream from the URL.
- * @param url java.net.URL
- */
-private FileOutputStream getFileOutputStream(URL url) throws IOException {
-
-	// Convert the URL to a string
-	//----------------------------
-	String strFilespec = UMEclipseTree.getFileInPlatformString(url);
-
-
-	// Create directory structure
-	//---------------------------
-	int iIndex = strFilespec.lastIndexOf(File.separator);
-	if (iIndex >= 0) {
-		String strPath = strFilespec.substring(0, iIndex+1);
-
-		File fileDirectory = new File(strPath);
-		if (fileDirectory.exists() == false) {
-			fileDirectory.mkdirs();
-		}
-	}
-
-	// Open / create the file
-	//-----------------------
-	File file = new File(strFilespec);
-	boolean bExists = file.exists();
-
-	if (bExists == false) {
-		bExists = file.createNewFile();
-	}
-
-	// Create the output stream
-	//-------------------------
-	return new FileOutputStream(file);
-}
-/**
- * @return java.lang.String
- */
-public String getId() {
-	
-	return _propertyID.getValue();
-}
-/**
- *
- * @return java.lang.String
- */
-public String getSource() {
-	
-	return _propertySource.getValue();
-}
-/**
- * @param strb java.lang.StringBuffer
- * @param iIndentation int
- */
-public void getStatusString(java.lang.StringBuffer strb, int iIndentation) {
-
-	if (getStatus().equals(UpdateManagerConstants.STATUS_SUCCEEDED) == true) {
-		return;
-	}
-	else if (getStatus().equals(UpdateManagerConstants.STATUS_PENDING) == true) {
-		return;
-	}
-
-	else {
-		if (getAction().equals(UpdateManagerConstants.OPERATION_COPY) == true) {
-			indent(strb, iIndentation);
-			strb.append(UpdateManagerStrings.getString("S_Copy") + ": " + getSource());
-		}
-		else if (getAction().equals(UpdateManagerConstants.OPERATION_UNZIP_INSTALL) ||
-				getAction().equals(UpdateManagerConstants.OPERATION_UNZIP_PLUGINS) == true) {
-			indent(strb, iIndentation);
-			strb.append(UpdateManagerStrings.getString("S_Install") + ": " + getSource());
-		}
-
-		// Obtain messages
-		//----------------
-		for (int i = 0; i < _alMessages.size(); ++i) {
-			indent(strb, iIndentation + 2);
-			strb.append(((UMSessionManagerMessage) _alMessages.get(i)).getText());
-		}
-	}
-}
-/**
- *
- * @return java.lang.String
- */
-public String getTarget() {
-	
-	return _propertyTarget.getValue();
-}
-/**
- *
- * @param actionType java.lang.String
- */
-public void setAction(String strAction) {
-	_propertyAction.setValue( strAction != null ? strAction : UpdateManagerConstants.STRING_EMPTY );
-}
-/**
- *
- */
-public void setId( String strID ) {
-	_propertyID.setValue( strID != null ? strID : UpdateManagerConstants.STRING_EMPTY );
-}
-/**
- *
- */
-public void setSource( String strSource ) {
-	_propertySource.setValue( strSource != null ? strSource : UpdateManagerConstants.STRING_EMPTY );
-}
-/**
- *
- */
-public void setTarget( String strTarget ) {
-	_propertyTarget.setValue( strTarget != null ? strTarget : UpdateManagerConstants.STRING_EMPTY );
-}
-/**
- *
- * 
- */
-public boolean undoCopy(IProgressMonitor progressMonitor) {
-
-	String strErrorMessage = null;
-
-	// Output URL
-	//-----------
-	URL urlOutput = null;
-
-	try {
-		urlOutput = new URL(getTarget());
-	}
-	catch (MalformedURLException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Target_URL_is_malformed"), ex);
-	}
-
-	if (urlOutput != null) {
-
-		// Convert the URL to a string
-		//----------------------------
-		String strFilespec = UMEclipseTree.getFileInPlatformString(urlOutput);
-
-		// Delete the file
-		//----------------
-		File file = new File(strFilespec);
-		if (file.exists() == true) {
-			if (file.delete() == false) {
-				strErrorMessage = UpdateManagerStrings.getString("S_Unable_to_delete_file") + ": " + strFilespec;
-			}
-		}
-	}
-
-	// Reset the number of attempts
-	//-----------------------------
-	resetAttemptCount();
-
-	// Error return
-	//-------------
-	if (strErrorMessage != null) {
-		if (getStatus().equals(UpdateManagerConstants.STATUS_SUCCEEDED) == true)
-			setStatus(UpdateManagerConstants.STATUS_SUCCEEDED_UNDO_FAILED);
-		else
-			setStatus(UpdateManagerConstants.STATUS_FAILED_UNDO_FAILED);
-
-		return false;
-	}
-
-	// Successful return
-	//------------------
-	if (getStatus().equals(UpdateManagerConstants.STATUS_SUCCEEDED) == true)
-		setStatus(UpdateManagerConstants.STATUS_SUCCEEDED_UNDO_SUCCEEDED);
-	else
-		setStatus(UpdateManagerConstants.STATUS_FAILED_UNDO_SUCCEEDED);
-
-	return true;
-}
-/**
- *
- * 
- */
-public boolean undoUnzip(IProgressMonitor progressMonitor) {
-
-	String strErrorMessage = null;
-
-	// Input URL
-	//----------
-	URL urlInput = null;
-	try {
-		urlInput = new URL(getSource());
-	}
-	catch (MalformedURLException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Source_URL_is_malformed"), ex);
-	}
-
-	// Output URL
-	//-----------
-	URL urlOutput = null;
-	try {
-		urlOutput = new URL(getTarget());
-	}
-	catch (MalformedURLException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Target_URL_is_malformed"), ex);
-	}
-
-	// For plugins or component/configuration jar, 
-	// set up the list of directories to look for
-	// This section contains subtle differences from doUnzip()
-	//--------------------------------------------------------
-	Vector dirNames = new Vector();
-	ArrayList productVIDs = new ArrayList();
-	ArrayList componentVIDs = new ArrayList();
-	ArrayList pluginVIDs = new ArrayList();
-	ArrayList fragmentVIDs = new ArrayList();
-	if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_PLUGINS ) {
-		IComponentDescriptor comp = null;
-		if (getData() instanceof IComponentEntryDescriptor) {
-			comp = ((IComponentEntryDescriptor) getData()).getComponentDescriptor();
-		} else {
-			comp = (IComponentDescriptor) getData();
-		}
-		if (comp != null) {
-			IPluginEntryDescriptor[] plugins = comp.getPluginEntries();
-			for (int i=0; i<plugins.length; i++) {
-				dirNames.addElement( UMEclipseTree.PLUGINS_DIR + "/" + plugins[i].getDirName());
-				pluginVIDs.add(new LaunchInfo.VersionedIdentifier(plugins[i].getUniqueIdentifier(), plugins[i].getVersionStr()));
-			}
-			IFragmentEntryDescriptor[] fragments = comp.getFragmentEntries();
-			for (int i=0; i<fragments.length; i++) {
-				dirNames.addElement( UMEclipseTree.FRAGMENTS_DIR + "/" + fragments[i].getDirName());	
-				fragmentVIDs.add(new LaunchInfo.VersionedIdentifier(plugins[i].getUniqueIdentifier(), plugins[i].getVersionStr()));
-			}
-		} else {
-			strErrorMessage = UpdateManagerStrings.getString("S_Error_in_registry");
-		}
-	} else if (getAction() == UpdateManagerConstants.OPERATION_UNZIP_INSTALL) {
-		// rc = UpdateManagerConstants.INSTALL_XML_MISSING;
-		if (getData() instanceof IProductDescriptor) {
-			IProductDescriptor desc = (IProductDescriptor) getData();
-			dirNames.addElement(UMEclipseTree.INSTALL_DIR + "/" + UMEclipseTree.PRODUCTS_DIR + "/" + desc.getDirName() + "/");
-			productVIDs.add(new LaunchInfo.VersionedIdentifier(desc.getUniqueIdentifier(), desc.getVersionStr()));
-		} else { 
-			IComponentDescriptor desc = (IComponentDescriptor) getData();
-			dirNames.addElement(UMEclipseTree.INSTALL_DIR + "/" + UMEclipseTree.COMPONENTS_DIR + "/" + desc.getDirName() + "/");
-			componentVIDs.add(new LaunchInfo.VersionedIdentifier(desc.getUniqueIdentifier(), desc.getVersionStr()));
-		}
-	}
-
-		
-	// Create a file specification from the input URL
-	//-----------------------------------------------
-	String strFilespec = UMEclipseTree.getFileInPlatformString(urlInput);
-
-	JarFile jarFile = null;
-	
-	try {
-		jarFile = new JarFile(strFilespec);
-	}
-	catch (IOException ex) {
-		strErrorMessage = createMessageString(UpdateManagerStrings.getString("S_Unable_to_open_Jar_file"), ex);
-	}
-
-	if (jarFile != null) {
-
-		JarEntry entry = null;
-
-		int iCount = jarFile.size();
-
-		// Set up progress monitor
-		// Compute the filename without the path information
-		//--------------------------------------------------
-		String strFilename = strFilespec;
-		int iIndex = strFilespec.lastIndexOf(File.separatorChar);
-		
-		if (iIndex >= 0 && iIndex < strFilespec.length() - 1) {
-			strFilename = strFilespec.substring(iIndex + 1);
-		}
-		
-		if (progressMonitor != null) progressMonitor.beginTask(UpdateManagerStrings.getString("S_Undo") + ": " + strFilename, iCount);
-
-		// Do each jar file entry
-		//-----------------------
-		Enumeration enum = jarFile.entries();
-
-		while (enum.hasMoreElements() == true) {
-			entry = (JarEntry) enum.nextElement();
-			String entryName = entry.getName();
-			
-			if (getAction().equals(UpdateManagerConstants.OPERATION_UNZIP_PLUGINS)) {
-				// Remove the plugins and fragments.  Skip entries not under plugins/ or fragments/ trees
-				//----------------------------------------------------------------------------------------
-				if ((!entryName.startsWith(UMEclipseTree.PLUGINS_DIR)) &&
-					(!entryName.startsWith(UMEclipseTree.FRAGMENTS_DIR))) {
-					if (progressMonitor != null) progressMonitor.worked(1);
-					continue;
-				}												
-				if ((entryName.equals(UMEclipseTree.PLUGINS_DIR + "/")) ||
-					(entryName.equals(UMEclipseTree.FRAGMENTS_DIR + "/"))) {
-					if (progressMonitor != null) progressMonitor.worked(1);
-					continue;
-				}
-				// Don't bother cleaning up the entries not matching the expected list
-				// They weren't unzipped in the first place
-				//--------------------------------------------------------------------
-				String prefix = entryName;
-				int second_slash = entryName.indexOf("/", (entryName.indexOf("/")+1));
-				if (second_slash > 0) 
-					prefix = entryName.substring(0,second_slash);
-				int match = dirNames.indexOf(prefix);
-				if (match < 0) {   // not a valid plugin
-					continue;
-				}
-			} else if (getAction().equals(UpdateManagerConstants.OPERATION_UNZIP_INSTALL)) {
-				// Remove the component/product items.  Skip over entries that don't match the dirname
-				//------------------------------------------------------------------------------------
-				if (!entryName.startsWith((String)dirNames.firstElement())) {
-					if (progressMonitor != null) progressMonitor.worked(1);
-					continue;
-				}
-			} else if (getAction().equals(UpdateManagerConstants.OPERATION_UNZIP_BINDIR)) {
-				// No-op.   The bin directory contents cannot be undone
-				//-----------------------------------------------------
-				break;
-			}
-
-			if (urlOutput != null) {
-				// Build pathname to actual install location
-				//------------------------------------------
-				strFilespec = urlOutput.getFile() + "/" + entryName;
-				strFilespec = strFilespec.replace('/',File.separatorChar);
-				int k = strFilespec.indexOf(UMEclipseTree.DEVICE_SEPARATOR);
-				if (k != -1 && strFilespec.startsWith(File.separator)) {
-					strFilespec = strFilespec.substring(1);
-				}
-
-				// Delete the file or directory
-				//-----------------------------
-				File file = new File(strFilespec);
-				if (file.exists() == true) {
-					if (file.isDirectory())
-						UpdateManager.cleanupDirectory(file);
-					if (file.delete() == false) {
-						strErrorMessage = UpdateManagerStrings.getString("S_Unable_to_delete_file") + ": " + strFilespec;
-					}
-				}
-			}
-		if (progressMonitor != null) progressMonitor.worked(1);		
-		} // while
-
-		try {
-			jarFile.close();
-		} catch (java.io.IOException ex) {
-			// unchecked
-		}
-	} // if jarFile is not null
-
-	// Call LaunchInfo.installConfirmed if all clean
-	//-----------------------------------------------
-	if (strErrorMessage == null) {
-		if (!LaunchInfo.getCurrent().installConfirmed(productVIDs, componentVIDs, pluginVIDs, fragmentVIDs)) {
-			strErrorMessage = UpdateManagerStrings.getString("S_Error_occurred_during_installation_completion");
-		}
-	}
-	
-	if (progressMonitor != null) progressMonitor.done();
-	
-	// Reset the number of attempts
-	//-----------------------------
-	resetAttemptCount();
-
-	// Error return
-	//-------------
-	if (strErrorMessage != null) {
-		if (getStatus().equals(UpdateManagerConstants.STATUS_SUCCEEDED) == true)
-			setStatus(UpdateManagerConstants.STATUS_SUCCEEDED_UNDO_FAILED);
-		else
-			setStatus(UpdateManagerConstants.STATUS_FAILED_UNDO_FAILED);
-
-		return false;
-	}
-
-	// Successful return
-	//------------------
-	if (getStatus().equals(UpdateManagerConstants.STATUS_SUCCEEDED) == true)
-		setStatus(UpdateManagerConstants.STATUS_SUCCEEDED_UNDO_SUCCEEDED);
-	else
-		setStatus(UpdateManagerConstants.STATUS_FAILED_UNDO_SUCCEEDED);
-
-	return true;
-}
-/**
- *
- * 
- */
-public boolean undoVerify(IProgressMonitor progressMonitor) {
-	
-	resetAttemptCount();
-	
-	if (getStatus().equals(UpdateManagerConstants.STATUS_SUCCEEDED) == true)
-		setStatus(UpdateManagerConstants.STATUS_SUCCEEDED_UNDO_SUCCEEDED);
-	else
-		setStatus(UpdateManagerConstants.STATUS_FAILED_UNDO_SUCCEEDED);
-
-	return true;
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerParcel.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerParcel.java
deleted file mode 100644
index b0c7d97..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerParcel.java
+++ /dev/null
@@ -1,327 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.internal.boot.update.*;
-import java.util.*;
-
-/**
- * This class represents either a component or a product.  A parcel can
- * have sub parcels, and copy objects.  Attributes are action (add, fix), id, status (pending, complete),
- * type (component / product).
- */
-
-public class UMSessionManagerParcel extends UMSessionManagerEntry {
-	
-	protected ArrayList _alParcels = new ArrayList();
-	protected ArrayList _alOperations   = new ArrayList();
-	
-	protected ILogEntryProperty _propertyAction = null;
-	protected ILogEntryProperty _propertyID     = null;
-	protected ILogEntryProperty _propertyType   = null;
-/**
- * UpdateManagerParcel constructor comment.
- */
-public UMSessionManagerParcel( ILogEntry logEntry ) {
-	super( logEntry );
-
-	// Action
-	//-------
-	_propertyAction = _logEntry.getProperty(UpdateManagerConstants.STRING_ACTION);
-
-	if (_propertyAction == null) {
-		_propertyAction = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_ACTION, UpdateManagerConstants.STRING_EMPTY );
-		logEntry.addProperty( _propertyAction );
-	}
-
-	// Id
-	//---
-	_propertyID = _logEntry.getProperty(UpdateManagerConstants.STRING_ID);
-
-	if (_propertyID == null) {
-		_propertyID = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_ID, UpdateManagerConstants.STRING_EMPTY );
-		logEntry.addProperty( _propertyID );
-	}
-
-	// Type
-	//-----
-	_propertyType = _logEntry.getProperty(UpdateManagerConstants.STRING_TYPE);
-
-	if (_propertyType == null) {
-		_propertyType = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_TYPE, UpdateManagerConstants.STRING_EMPTY );
-		logEntry.addProperty( _propertyType );
-	}
-}
-/**
- * @param logEntry org.eclipse.update.internal.core.LogEntry
- */
-public void buildTreeFromLog(ILogEntry logEntry) {
-
-	super.buildTreeFromLog( logEntry );
-	
-	// Action
-	//-------
-	ILogEntryProperty property = _logEntry.getProperty(UpdateManagerConstants.STRING_ACTION);
-
-	if (property != null) {
-		_propertyAction = property;
-	}
-
-	// Id
-	//---
-	property = _logEntry.getProperty(UpdateManagerConstants.STRING_ID);
-
-	if (property != null) {
-		_propertyID = property;
-	}
-
-	// Type  
-	//-----
-	property = _logEntry.getProperty(UpdateManagerConstants.STRING_TYPE);
-
-	if (property != null) {
-		_propertyType = property;
-	}
-		
-	ILogEntry[] entries = logEntry.getChildEntries();
-
-	// Parcels
-	//--------	
-	int iIndex = 0;
-	UMSessionManagerParcel parcel = null;
-	
-	for( int i = 0; i < entries.length; ++i) {
-		if (entries[i] != null && entries[i].getName().equals(UpdateManagerConstants.STRING_PARCEL) == true) {
-			parcel = new UMSessionManagerParcel( entries[i] );			
-	        _alParcels.add( parcel );
-
-	        parcel.buildTreeFromLog( entries[i] );
-		}
-	}
-
-	// Operations
-	//-----------
-	iIndex = 0;
-	UMSessionManagerOperation operation = null;
-	
-	for( int i = 0; i < entries.length; ++i) {
-		if (entries[i] != null && entries[i].getName().equals(UpdateManagerConstants.STRING_OPERATION) == true) {
-			operation = new UMSessionManagerOperation( entries[i] );			
-	        _alOperations.add( operation );
-
-	        operation.buildTreeFromLog( entries[i] );
-		}
-	}
-}
-/**
- * @return org.eclipse.update.internal.core.UMSessionManagerOperation
- * @param actionType java.lang.String
- */
-public UMSessionManagerOperation createOperation() {
-
-	// Create a new log entry
-	//-----------------------
-	ILogEntry logEntryChild = new LogEntry( _logEntry, UpdateManagerConstants.STRING_OPERATION );
-	_logEntry.addChildEntry( logEntryChild );
-
-	// Create the operation object
-	//----------------------------
-	UMSessionManagerOperation operation = new UMSessionManagerOperation( logEntryChild );
-	_alOperations.add( operation );
-	
-	return operation;
-}
-/**
- * Creates a sub-parcel
- * @return org.eclipse.update.internal.core.UpdateManagerParcel
- * @param actionType java.lang.String
- */
-public UMSessionManagerParcel createParcel() {
-
-	// Create a new log entry
-	//-----------------------
-	ILogEntry logEntryChild = new LogEntry( _logEntry, UpdateManagerConstants.STRING_PARCEL );
-	_logEntry.addChildEntry( logEntryChild );
-
-	// Create the parcel object
-	//-------------------------
-	UMSessionManagerParcel parcel = new UMSessionManagerParcel( logEntryChild );
-	_alParcels.add( parcel );
-	
-	return parcel;
-}
-/**
- * Execute any pending or failed updates.
- */
-public boolean execute(IProgressMonitor progressMonitor) {
-
-	// Stop if any failure occurs
-	//---------------------------
-	boolean bSuccess = true;
-
-	// Parcels may be sequential, do in forward order
-	//-----------------------------------------------
-	for (int i = 0; i < _alParcels.size(); ++i) {
-
-		if (((UMSessionManagerParcel) _alParcels.get(i)).execute(progressMonitor) == false) {
-			bSuccess = false;
-			break;
-		}
-	}
-
-	// Operations may be sequential, do in forward order
-	//--------------------------------------------------
-	if (bSuccess == true) {
-		for (int i = 0; i < _alOperations.size(); ++i) {
-
-			if (((UMSessionManagerOperation) _alOperations.get(i)).execute(progressMonitor) == false) {
-				bSuccess = false;
-				break;
-			}
-		}
-	}
-
-	// Status
-	//-------
-	setStatus(bSuccess == true ? UpdateManagerConstants.STATUS_SUCCEEDED : UpdateManagerConstants.STATUS_FAILED);
-
-	incrementAttemptCount();
-
-	return bSuccess;
-}
-/**
- * Execute any pending or failed updates.
- */
-public boolean executeUndo(org.eclipse.core.runtime.IProgressMonitor progressMonitor) {
-
-	// Undo only failed attempts
-	//--------------------------
-	if (getStatus().equals(UpdateManagerConstants.STATUS_FAILED) == false) {
-		return true;
-	}
-
-	// Attempt all even if failure occurs
-	//-----------------------------------	
-	boolean bSuccess = true;
-
-	// Parcels may be sequential, undo in reverse order
-	//-------------------------------------------------
-	for (int i = _alParcels.size() - 1; i >= 0; --i) {
-
-		if (((UMSessionManagerParcel) _alParcels.get(i)).executeUndo(progressMonitor) == false) {
-			bSuccess = false;
-		}
-	}
-
-	// Operations may be sequential, undo in reverse order
-	//----------------------------------------------------
-	for (int i = _alOperations.size() - 1; i >= 0; --i) {
-
-		if (((UMSessionManagerOperation) _alOperations.get(i)).executeUndo(progressMonitor) == false) {
-			bSuccess = false;
-		}
-	}
-
-	// Status
-	//-------
-	setStatus(bSuccess == true ? UpdateManagerConstants.STATUS_FAILED_UNDO_SUCCEEDED : UpdateManagerConstants.STATUS_FAILED_UNDO_FAILED);
-
-	resetAttemptCount();
-
-	return bSuccess;
-}
-/**
- * @return java.lang.String
- */
-public String getAction() {
-	
-	return _propertyAction.getValue();
-}
-/**
- * @return java.lang.String
- */
-public String getId() {
-	
-	return _propertyID.getValue();
-}
-/**
- * Returns all operations
- * @return org.eclipse.update.internal.core.UMSessionManagerOperation[]
- */
-public UMSessionManagerOperation[] getOperations() {
-
-	UMSessionManagerOperation[] operations = new UMSessionManagerOperation[_alOperations.size()];
-	return (UMSessionManagerOperation[])_alOperations.toArray( operations );
-}
-/**
- * Returns all sub-parcels
- * @return org.eclipse.update.internal.core.UpdateManagerParcel[]
- */
-public UMSessionManagerParcel[] getParcels() {
-
-	UMSessionManagerParcel[] parcels = new UMSessionManagerParcel[_alParcels.size()];
-	return (UMSessionManagerParcel[])_alParcels.toArray( parcels );
-}
-/**
- * @param strb java.lang.StringBuffer
- * @param iIndentation int
- */
-public void getStatusString(java.lang.StringBuffer strb, int iIndentation) {
-
-	if (getStatus().equals(UpdateManagerConstants.STATUS_SUCCEEDED) == true) {
-		return;
-	}
-
-	else {
-		// Parcel label
-		//-------------
-		IInstallable descriptor = (IInstallable) getData();
-
-		indent(strb, iIndentation);
-		strb.append( descriptor.getLabel());
-
-
-		// Parcels may be sequential, do in forward order
-		//-----------------------------------------------
-		for (int i = 0; i < _alParcels.size(); ++i) {
-
-			((UMSessionManagerParcel) _alParcels.get(i)).getStatusString(strb, iIndentation + 2);
-		}
-
-		// Operations may be sequential, do in forward order
-		//--------------------------------------------------
-		for (int i = 0; i < _alOperations.size(); ++i) {
-
-			((UMSessionManagerOperation) _alOperations.get(i)).getStatusString(strb, iIndentation + 2);
-		}
-	}
-}
-/**
- * @return java.lang.String
- */
-public String getType() {
-	
-	return _propertyType.getValue();
-}
-/**
- *
- */
-public void setAction( String strAction ) {
-	_propertyAction.setValue( strAction != null ? strAction : UpdateManagerConstants.STRING_EMPTY );
-}
-/**
- *
- */
-public void setId( String strID ) {
-	_propertyID.setValue( strID != null ? strID : UpdateManagerConstants.STRING_EMPTY );
-}
-/**
- *
- */
-public void setType( String strType ) {
-	_propertyType.setValue( strType != null ? strType : UpdateManagerConstants.STRING_EMPTY );
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerSession.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerSession.java
deleted file mode 100644
index 369855a..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UMSessionManagerSession.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.internal.boot.update.*;
-import java.util.Date;
-import java.util.*;
-
-/**
- * This class represents a session in which update manager operations are
- * executed.  This class contains parcel objects and has status and timestamp
- * as its attributes.  The timestamp attribute is automatically set when the session
- * is created for the first time.
- */
-
-public class UMSessionManagerSession extends UMSessionManagerEntry {
-	protected ArrayList _alParcels = new ArrayList();
-	protected ILogEntryProperty _propertyTimestamp = null;
-/**
- * UpdateManagerSession constructor comment.
- */
-public UMSessionManagerSession(ILogEntry logEntry) {
-	super( logEntry );
-
-	// Timestamp
-	//----------
-	_propertyTimestamp = _logEntry.getProperty(UpdateManagerConstants.STRING_TIMESTAMP);
-
-	if (_propertyTimestamp == null) {
-		_propertyTimestamp = new LogEntryProperty(logEntry, UpdateManagerConstants.STRING_TIMESTAMP, new Date().toString() );
-		logEntry.addProperty( _propertyTimestamp );
-	}
-}
-/**
- * @param logEntry org.eclipse.update.internal.core.LogEntry
- */
-public void buildTreeFromLog(ILogEntry logEntry) {
-	
-	super.buildTreeFromLog( logEntry );
-	
-	// Timestamp
-	//----------
-	ILogEntryProperty property = _logEntry.getProperty(UpdateManagerConstants.STRING_TIMESTAMP);
-
-	if (property != null) {
-		_propertyTimestamp = property;
-	}
-
-	
-	ILogEntry[] entries = logEntry.getChildEntries();
-	
-	// Parcels
-	//--------
-	int iIndex = 0;
-	UMSessionManagerParcel parcel = null;
-	
-	for( int i = 0; i < entries.length; ++i) {
-		if (entries[i] != null && entries[i].getName().equals(UpdateManagerConstants.STRING_PARCEL) == true) {
-			parcel = new UMSessionManagerParcel( entries[i] );			
-	        _alParcels.add( parcel );
-
-	        parcel.buildTreeFromLog( entries[i] );
-		}
-	}
-}
-/**
- *
- * @return org.eclipse.update.internal.core.UMTaskManagerParcel
- * @param actionType java.lang.String
- */
-public UMSessionManagerParcel createParcel() {
-
-	// Create a new log entry
-	//-----------------------
-	ILogEntry logEntryChild = new LogEntry( _logEntry, UpdateManagerConstants.STRING_PARCEL );
-	_logEntry.addChildEntry( logEntryChild );
-
-	// Create the copy object
-	//-----------------------
-	UMSessionManagerParcel parcel = new UMSessionManagerParcel( logEntryChild );
-	_alParcels.add( parcel );
-	
-	return parcel;
-}
-/**
- * Execute any pending or failed updates.
- */
-public boolean execute(IProgressMonitor progressMonitor) {
-
-	// Attempt all even if failure occurs
-	//-----------------------------------	
-	boolean bSuccess = true;
-
-	// Parcels may be sequential, do in forward order
-	//-----------------------------------------------
-	for (int i = 0; i < _alParcels.size(); ++i) {
-
-		if (((UMSessionManagerParcel) _alParcels.get(i)).execute(progressMonitor) == false) {
-			bSuccess = false;
-		}
-	}
-
-	// Status
-	//-------
-	setStatus(bSuccess == true ? UpdateManagerConstants.STATUS_SUCCEEDED : UpdateManagerConstants.STATUS_FAILED);
-
-	incrementAttemptCount();
-
-	return bSuccess;
-}
-/**
- * Execute any pending or failed updates.
- */
-public boolean executeUndo(org.eclipse.core.runtime.IProgressMonitor progressMonitor) {
-
-	// Undo only failed attempts
-	//--------------------------
-	if (getStatus().equals(UpdateManagerConstants.STATUS_FAILED) == false) {
-		return true;
-	}
-	
-	// Attempt all even if failure occurs
-	//-----------------------------------	
-	boolean bSuccess = true;
-
-	// Parcels may be sequential, undo in reverse order
-	//-------------------------------------------------
-	for (int i = _alParcels.size() - 1; i >= 0; --i) {
-
-		if (((UMSessionManagerParcel) _alParcels.get(i)).executeUndo(progressMonitor) == false) {
-			bSuccess = false;
-		}
-	}
-
-	// Status
-	//-------
-	setStatus(bSuccess == true ? UpdateManagerConstants.STATUS_FAILED_UNDO_SUCCEEDED : UpdateManagerConstants.STATUS_FAILED_UNDO_FAILED);
-
-	resetAttemptCount();
-	
-	return bSuccess;
-}
-/**
- * Returns all parcels
- * @return org.eclipse.update.internal.core.UMSessionManagerParcel[]
- */
-public UMSessionManagerParcel[] getParcels() {
-
-	UMSessionManagerParcel[] parcels = new UMSessionManagerParcel[_alParcels.size()];
-	return (UMSessionManagerParcel[])_alParcels.toArray( parcels );
-}
-/**
- * @return java.lang.String
- */
-public String getStatusString() {
-	
-	StringBuffer strb = new StringBuffer();
-
-	getStatusString( strb, 0 );
-	
-	return strb.toString();
-}
-/**
- * @param strb java.lang.StringBuffer
- * @param iIndentation int
- */
-public void getStatusString(java.lang.StringBuffer strb, int iIndentation) {
-
-	String strStatus = getStatus();
-
-	if (strStatus.equals(UpdateManagerConstants.STATUS_SUCCEEDED) == true) {
-		strb.append(UpdateManagerStrings.getString("S_Installations_have_completed_successfully"));
-		strb.append("\n");
-		strb.append(UpdateManagerStrings.getString("S_You_must_restart_the_workbench_to_activate_any_changes"));
-	}
-
-	else {
-		strb.append(UpdateManagerStrings.getString("S_An_installation_error_or_cancellation_has_occurred"));
-
-		// Parcels may be sequential, do in forward order
-		//-----------------------------------------------
-		for (int i = 0; i < _alParcels.size(); ++i) {
-
-			((UMSessionManagerParcel) _alParcels.get(i)).getStatusString(strb, 2);
-		}
-	}
-}
-/**
- * @return java.lang.String
- */
-public String getTimestamp() {
-	
-	return _propertyTimestamp.getValue();
-}
-/**
- * Returns whether this session is complete
- * @return boolean
- */
-public boolean isComplete() {
-
-	return _propertyStatus.getValue().equals(UpdateManagerConstants.STATUS_SUCCEEDED) ||
-		   _propertyStatus.getValue().equals(UpdateManagerConstants.STATUS_FAILED_UNDO_SUCCEEDED);
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/URLHandler.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/URLHandler.java
deleted file mode 100644
index 50eed69..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/URLHandler.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.internal.boot.update.*;
-import org.eclipse.webdav.http.client.*;
-import org.eclipse.webdav.client.WebDAVFactory;
-import org.eclipse.webdav.Context;
-import java.io.*;
-import java.net.*;
-
-public class URLHandler extends BaseURLHandler {
-
-	private static HttpClient http = null;
-	private static WebDAVFactory factory = null;
-	
-	private static final String HTTP = "http";
-	
-	static class Response extends BaseURLHandler.Response {
-		private org.eclipse.webdav.http.client.Response r = null;
-		private Response(org.eclipse.webdav.http.client.Response r) {
-			this.r = r;
-		}
-		public InputStream getInputStream() throws IOException {
-			return r.getInputStream();
-		}
-		public long getContentLength() {
-			return r.getContentLength();
-		}
-		public int getResponseCode() {
-			return r.getStatusCode();
-		}
-		public String getResponseMessage() {
-			return r.getStatusMessage();
-		}
-	}
-
-private URLHandler() {}
-public static BaseURLHandler.Response open(URL url) throws IOException {
-
-	if (url==null) return null;
-
-	if (!url.getProtocol().equals(HTTP)) {
-		URLConnection c = url.openConnection();
-		Context ctx = factory.newContext();
-		int i = 1;
-		String name = null;
-		while ((name = c.getHeaderFieldKey(i)) != null) {
-			ctx.put(name.toLowerCase(), c.getHeaderField(i));
-			i++;
-		}	
-		InputStream is = c.getInputStream();	
-		return new Response(new org.eclipse.webdav.http.client.Response(UNKNOWN_STATUS,UNKNOWN_MSG,ctx,is));
-	}
-	else {
-		if (http==null) throw new IllegalStateException(UpdateManagerStrings.getString("S_HTTP_client_not_set"));	
-		Request request = new Request("GET", url, null);
-		return new Response(http.invoke(request));
-	}	
-}
-protected BaseURLHandler.Response openURL(URL url) throws IOException {
-	return URLHandler.open(url);
-}
-public static void setHttpClient(HttpClient c) {
-
-	if (http==null) {
-		http = c;
-		factory = new WebDAVFactory();
-
-		// setup this handler as the handler for boot portion of update manager
-		BaseURLHandler.setURLHandler(new URLHandler());
-	}
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManager.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManager.java
deleted file mode 100644
index e456884..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManager.java
+++ /dev/null
@@ -1,640 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.TreeSet;
-
-import org.eclipse.core.internal.boot.LaunchInfo;
-import org.eclipse.core.internal.boot.LaunchInfo.VersionedIdentifier;
-import org.eclipse.core.internal.boot.update.IComponentDescriptor;
-import org.eclipse.core.internal.boot.update.IComponentEntryDescriptor;
-import org.eclipse.core.internal.boot.update.IFragmentEntryDescriptor;
-import org.eclipse.core.internal.boot.update.IInstallable;
-import org.eclipse.core.internal.boot.update.IPluginEntryDescriptor;
-import org.eclipse.core.internal.boot.update.IProductDescriptor;
-import org.eclipse.core.internal.boot.update.IUMRegistry;
-import org.eclipse.core.internal.boot.update.IURLNamePair;
-import org.eclipse.core.internal.boot.update.LogStoreException;
-import org.eclipse.core.internal.boot.update.UMEclipseTree;
-import org.eclipse.core.internal.boot.update.UMRegistryManager;
-import org.eclipse.core.internal.boot.update.UpdateManagerConstants;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.update.internal.ui.JarVerificationService;
-
-/**
- * Update Manager updates a workstation in one of three modes:
- * <ol>
- * <li>local</li>
- * <li>remote</li>
- * <li>remote cached</li>
- * </ol>
- * Usage:
- * <ol>
- * <li>Create an instance of this class</li>
- * <li>Set persistent properties as required</li>
- * <ul>
- * <li>mode</li>
- * <li>update log URL</li>
- * <li>history log URL</li>
- * </ul>
- * <li>Call the initialize function</li>
- * <li>Call the update function</li>
- * </ol>
- * Persistent properties are loaded before any are changed, and saved after any
- * are changed.
- */
-
-public class UpdateManager {
-
-	// Package name for this class
-	// Used by UpdateManagerStrings to obtain its resource bundle properties file
-	//---------------------------------------------------------------------------
-	public static final String _strPackageName = "org.eclipse.update.internal.core";
-	public static UpdateManager _updateManagerInstance = null;
-	
-	// Persistent properties
-	//----------------------
-	protected int    _iMode         = UpdateManagerConstants.MODE_LOCAL;
-	protected String _strUpdateLogURL  = null;
-	protected String _strHistoryLogURL = null;
-
-	// Instance state data
-	//--------------------
-	protected UMRegistryManager _registryManager = null;
-	protected UMSessionManager  _sessionManager  = null;
-	protected Shell             _shell           = null;
-	
-	protected JarVerificationService _jarVerifier = null;
-/**
- * Constructs an instance of this class, then initializes by loading its persistent properties
- */
-public UpdateManager() {
-}
-/**
- * Constructs an instance of this class, then initializes by loading its persistent properties
- */
-public UpdateManager( Shell shell ) {
-	_updateManagerInstance = this;
-	_shell = shell;
-}
-/**
- * Deletes all files in the staging area.
- */
-public void cleanup() {
-	String strStagingDirectory = UMEclipseTree.getFileInPlatformString(UMEclipseTree.getStagingArea());
-
-	File fileStagingDirectory = new File(strStagingDirectory);
-
-	if (fileStagingDirectory.exists() == true) {
-		File[] files = fileStagingDirectory.listFiles();
-		for (int i = 0; i < files.length; ++i) {
-			if (files[i].isDirectory() == true) {
-				cleanupDirectory(files[i]);
-			}
-			boolean bSuccessful = files[i].delete();
-			
-		}
-	}
-}
-/**
- */
-public static void cleanupDirectory(File fileDirectory) {
-
-	File[] files = fileDirectory.listFiles();
-	
-	for (int i = 0; i < files.length; ++i) {
-		if (files[i].isDirectory() == true) {
-			cleanupDirectory(files[i]);
-		}
-
-		boolean bSuccessful = files[i].delete();
-//		if (!bSuccessful)
-//			System.out.println("ooops!" + files[i]);
-	}
-}
-/**
- */
-public UMSessionManagerSession createSession(IInstallable[] descriptors, boolean bVerifyJars) throws UpdateManagerException {
-
-	// FOR NOW DO NOT DO JAR VERIFICATION
-	//-----------------------------------
-	bVerifyJars = false;
-
-	// Create a new update session
-	//----------------------------
-	UMSessionManagerSession session = _sessionManager.createUpdateSession();
-
-	// Create a definer that can define the operations required
-	//---------------------------------------------------------
-	ISessionDefiner sessionDefiner = new UMSessionDefinerReferenceUpdate();
-	
-	// Define a set of operations
-	//---------------------------
-	sessionDefiner.defineOperations(session, descriptors, bVerifyJars);
-
-	// Save the update log
-	//--------------------
-	try {
-		_sessionManager.saveUpdateLog();
-	}
-	catch (LogStoreException ex) {
-		throw new UpdateManagerException(ex.getMessage());
-	}
-
-	return session;
-}
-/**
- * Updates the local machine by:
- * <ol>
- * <li>defining the operations</li>
- * <li>downloading any new objects</li>
- * <li>applying any downloaded updates</li>
- * <li>displaying a progress monitor</li>
- * </ol>
- */
-public UMSessionManagerSession executeSession( UMSessionManagerSession session, IProgressMonitor progressMonitor ) throws UpdateManagerException {
-
-	// Throw any exception when complete
-	//----------------------------------
-	UpdateManagerException umException = null;
-	
-	// Execute the session
-	//--------------------
-	_sessionManager.executeSession( session, progressMonitor );
-
-	// Move successful sessions from update log to history log
-	//--------------------------------------------------------
-	try {
-		_sessionManager.updateAndSaveLogs();
-	}
-	catch (LogStoreException ex) {
-		if (umException != null) {
-			umException = new UpdateManagerException("S_Unable_to_save_update_logs");
-		}
-	}
-
-	// Throw any exceptions found
-	//---------------------------
-	if (umException != null) {
-		throw umException;
-	}
-
-	return session;
-}
-/**
- * Updates the local machine by:
- * <ol>
- * <li>defining the operations</li>
- * <li>downloading any new objects</li>
- * <li>applying any downloaded updates</li>
- * <li>displaying a progress monitor</li>
- * </ol>
- */
-public UMSessionManagerSession executeSessionUndo( UMSessionManagerSession session, IProgressMonitor progressMonitor ) throws UpdateManagerException {
-
-	// Throw any exception when complete
-	//----------------------------------
-	UpdateManagerException umException = null;
-	
-	// Execute the session
-	//--------------------
-	_sessionManager.executeSessionUndo( session, progressMonitor );
-
-	// Move successful sessions from update log to history log
-	//--------------------------------------------------------
-	try {
-		_sessionManager.updateAndSaveLogs();
-	}
-	catch (LogStoreException ex) {
-		if (umException != null) {
-			umException = new UpdateManagerException("S Unable to save update logs");
-		}
-	}
-
-	// Throw any exceptions found
-	//---------------------------
-	if (umException != null) {
-		throw umException;
-	}
-
-	return session;
-}
-/**
- */
-public static UpdateManager getCurrentInstance() {
-	return _updateManagerInstance;
-}
-/**
- * Takes a string with an Id + '_' + Version, and returns the Id.
- */
-private String getIdFromInfoString(String strInfo) {
-
-	String strId = null;
-
-	int iIndex = strInfo.lastIndexOf('_');
-	
-	if (iIndex >= 0) {
-		strId = strInfo.substring(0, iIndex);
-	}
-
-	else {
-		strId = strInfo;
-	}
-
-	return strId;
-}
-// return the jar verifier
-
-public JarVerificationService getJarVerifier() {
-	if (_jarVerifier == null)	
-		_jarVerifier = new JarVerificationService( _shell );
-	return _jarVerifier;
-}
-/**
- * Returns a list of components that require updating by:
- *<ol>
- *<li>Loading all product/component manifests from .install/tree </li>
- *<li>Determining which components require updating by:</li>
- *<ol>
- *<li>Collecting update URLs from each component</li>
- *<li>Collecting update URLs from products that components are a part of</li>
- *</ol>
- *<li>Determining what updates are available by:</li>
- *<ol>
- *<li>Accessing the update URL</li>
- *<li>Determining if the component is a newer version of the existing one</li>
- *</ol>
- *<li>
- *</ol>
- */
-public IURLNamePair[] getLocalDiscoveryURLs() {
-
-	IURLNamePair[] urlNPs = null;
-	
-	// Obtain the local registry
-	//--------------------------
-	IUMRegistry registry = _registryManager.getLocalRegistry();
-
-	// Create a list of all URLs
-	//--------------------------
-	TreeSet setURLs = new TreeSet( new UpdateManagerURLComparator() );
-
-	// Obtain a list of all installed components
-	//------------------------------------------
-	IComponentDescriptor[] componentDescriptors = registry.getComponentDescriptors();
-
-	// Obtain a list of discovery URLs
-	//--------------------------------
-	for (int i = 0; i < componentDescriptors.length; ++i) {
-		urlNPs = componentDescriptors[i].getDiscoveryURLs();
-
-		for (int j = 0; j < urlNPs.length; ++j) {
-			setURLs.add(urlNPs[j]);
-		}
-	}
-
-	// Obtain a list of all installed products
-	//----------------------------------------
-	IProductDescriptor[] productDescriptors = registry.getProductDescriptors();
-
-	// Obtain a list of discovery URLs
-	//--------------------------------
-	for (int i = 0; i < productDescriptors.length; ++i) {
-		urlNPs = productDescriptors[i].getDiscoveryURLs();
-
-		for (int j = 0; j < urlNPs.length; ++j) {
-			setURLs.add(urlNPs[j]);
-		}
-	}
-
-	urlNPs = new IURLNamePair[ setURLs.size() ];
-	System.arraycopy(setURLs.toArray(), 0, urlNPs, 0, setURLs.size() );
-	
-	return urlNPs;
-}
-/**
- * Returns a list of components that require updating by:
- *<ol>
- *<li>Loading all product/component manifests from .install/tree </li>
- *<li>Determining which components require updating by:</li>
- *<ol>
- *<li>Collecting update URLs from each component</li>
- *<li>Collecting update URLs from products that components are a part of</li>
- *</ol>
- *<li>Determining what updates are available by:</li>
- *<ol>
- *<li>Accessing the update URL</li>
- *<li>Determining if the component is a newer version of the existing one</li>
- *</ol>
- *<li>
- *</ol>
- */
-public IURLNamePair[] getLocalUpdateURLs() {
-
-	IURLNamePair[] urlNPs = null;
-	
-	// Obtain the local registry
-	//--------------------------
-	IUMRegistry registry = _registryManager.getLocalRegistry();
-
-	// Create a list of all URLs
-	//--------------------------
-	TreeSet setURLs = new TreeSet( new UpdateManagerURLComparator() );
-
-	// Obtain a list of all installed components
-	//------------------------------------------
-	IComponentDescriptor[] componentDescriptors = registry.getComponentDescriptors();
-
-	// Obtain a list of discovery URLs
-	//--------------------------------
-	for (int i = 0; i < componentDescriptors.length; ++i) {
-		urlNPs = componentDescriptors[i].getUpdateURLs();
-
-		for (int j = 0; j < urlNPs.length; ++j) {
-			setURLs.add(urlNPs[j]);
-		}
-	}
-
-	// Obtain a list of all installed products
-	//----------------------------------------
-	IProductDescriptor[] productDescriptors = registry.getProductDescriptors();
-
-	// Obtain a list of discovery URLs
-	//--------------------------------
-	for (int i = 0; i < productDescriptors.length; ++i) {
-		urlNPs = productDescriptors[i].getUpdateURLs();
-
-		for (int j = 0; j < urlNPs.length; ++j) {
-			setURLs.add(urlNPs[j]);
-		}
-	}
-
-	urlNPs = new IURLNamePair[ setURLs.size() ];
-	System.arraycopy(setURLs.toArray(), 0, urlNPs, 0, setURLs.size() );
-	
-	return urlNPs;
-}
-// return the local (current) registry
-
-public IUMRegistry getRegistryAt(URL url) {
-	
-	return _registryManager.getRegistryAt( url );
-}
-/**
- */
-public UMRegistryManager getRegistryManager() {
-	return _registryManager;
-}
-/**
- * Initializes the update and history log URLs,creates a session manager,
- * and creates a registry manager.
- */
-public void initialize() throws UpdateManagerException{
-
-	// Obtain install URL
-	//-------------------
-	URL urlBase = UMEclipseTree.getBaseInstallURL();
-	String strUrlBase = urlBase.toExternalForm();
-	String strUrlInstall = strUrlBase + "install/";
-
-	String strUrlUpdateLog = strUrlInstall + "update.log";
-	String strUrlHistoryLog = strUrlInstall + "history.log";
-
-	setUpdateLogURL(strUrlUpdateLog);
-	setHistoryLogURL(strUrlHistoryLog);
-
-	// Create a session manager
-	//-------------------------
-	try {
-		_sessionManager = new UMSessionManager(new URL(_strUpdateLogURL), new URL(_strHistoryLogURL), true);
-	}
-	catch (MalformedURLException ex) {
-		throw new UpdateManagerException("Invalid log URL specification");
-	}
-	catch (LogStoreException ex) {
-		throw new UpdateManagerException(ex.getMessage());
-	}
-
-	// Registry Manager
-	//-----------------
-	_registryManager = new UMRegistryManager(urlBase);
-}
-/**
- * 
- */
-public void removeComponent(IComponentDescriptor componentDescriptor) {
-	removeComponent(componentDescriptor, null);
-}
-/**
- * 
- */
-public void removeComponent(IComponentDescriptor componentDescriptor, IProductDescriptor productDescriptor) {
-
-	if( componentDescriptor == null )
-		return;
-		
-	LaunchInfo launchInfo = LaunchInfo.getCurrent();
-	LaunchInfo.VersionedIdentifier vid = null;
-
-	// Plugins
-	//--------
-	IPluginEntryDescriptor[] pluginEntries = componentDescriptor.getPluginEntries();
-
-	for (int i = 0; i < pluginEntries.length; ++i) {
-		vid = new LaunchInfo.VersionedIdentifier(pluginEntries[i].getUniqueIdentifier(), pluginEntries[i].getVersionStr());
-		launchInfo.removePlugin(vid);
-	}
-
-	// Fragments
-	//----------
-	IFragmentEntryDescriptor[] fragmentEntries = componentDescriptor.getFragmentEntries();
-
-	for (int i = 0; i < fragmentEntries.length; ++i) {
-		vid = new LaunchInfo.VersionedIdentifier(fragmentEntries[i].getUniqueIdentifier(), pluginEntries[i].getVersionStr());
-		launchInfo.removeFragment(vid);
-	}
-
-	// Component
-	//----------
-	vid = new LaunchInfo.VersionedIdentifier(componentDescriptor.getUniqueIdentifier(), componentDescriptor.getVersionStr());
-	launchInfo.removeComponent(vid);
-	_registryManager.removeComponentDescriptorFromLocal(componentDescriptor, productDescriptor);
-	
-	return;
-}
-/**
- * 
- */
-public void removeProduct(IProductDescriptor productDescriptor) {
-
-	if( productDescriptor == null )
-		return;
-		
-	// Components
-	//-----------
-	IComponentEntryDescriptor[] componentEntries = productDescriptor.getComponentEntries();
-
-	for (int i = 0; i < componentEntries.length; ++i) {
-		IComponentDescriptor componentDescriptor = componentEntries[i].getComponentDescriptor();
-		if (componentDescriptor.isRemovable(productDescriptor))
-			removeComponent(componentDescriptor, productDescriptor);
-	}
-
-	// Product
-	//--------
-	LaunchInfo.VersionedIdentifier vid = new LaunchInfo.VersionedIdentifier(productDescriptor.getUniqueIdentifier(), productDescriptor.getVersionStr());
-	LaunchInfo.getCurrent().removeConfiguration(vid);
-	_registryManager.removeProductDescriptorFromLocal(productDescriptor);
-}
-/**
- * Sets the URL for the history log.  This property is persistent.
- */
-public void setHistoryLogURL(String strURL) throws UpdateManagerException {
-
-	// Check for valid URL
-	//--------------------
-	try {
-		new URL(strURL);
-	}
-	catch (MalformedURLException ex) {
-		throw new UpdateManagerException("Invalid log URL specification");
-	}
-
-	// Change the property
-	//--------------------
-	_strHistoryLogURL = strURL;
-}
-/**
- * Sets the URL for the update log.  This property is persistent.
- */
-public void setUpdateLogURL(String strURL) throws UpdateManagerException {
-	
-	// Check for valid URL
-	//--------------------
-	try {
-		new URL(strURL);
-	}
-	catch (MalformedURLException ex) {
-		throw new UpdateManagerException("Invalid log URL specification");
-	}
-
-	// Change the property
-	//--------------------
-	_strUpdateLogURL = strURL;
-}
-/**
- * Updates the boot loader's launch information with what is currently installed.
- */
-public void updateLaunchInfoAndRegistry(UMSessionManagerSession session) {
-
-	// Update launch info even if this session had a failure
-	// One or more parcels could have succeeded
-	//------------------------------------------------------
-	if (session != null) {
-		
-		LaunchInfo launchInfo = LaunchInfo.getCurrent();
-
-		// Obtain product/component information
-		//-------------------------------------
-		UMSessionManagerParcel[] parcels = session.getParcels();
-
-		for (int i = 0; i < parcels.length; ++i) {
-			updateLaunchInfoAndRegistryParcel( parcels[i], launchInfo );
-		}
-	}
-}
-/**
- * Recursively updates the boot loader's information for this parcel and sub-parcels.
- */
-protected void updateLaunchInfoAndRegistryParcel(UMSessionManagerParcel parcel, LaunchInfo launchInfo) {
-
-	// Update the profile only if the install was successful
-	//------------------------------------------------------
-	if (parcel != null && parcel.getStatus().equals(UpdateManagerConstants.STATUS_SUCCEEDED) == true) {
-
-		Object objData = parcel.getData();
-
-		// Product
-		//--------
-		if (objData instanceof IProductDescriptor) {
-			updateLaunchInfoProduct((IProductDescriptor) objData, launchInfo);
-			_registryManager.addProductDescriptorToLocal((IProductDescriptor) objData);
-		}
-
-		// Component
-		//----------
-		else if (objData instanceof IComponentDescriptor) {
-			updateLaunchInfoComponent((IComponentDescriptor) objData, launchInfo);
-			_registryManager.addComponentDescriptorToLocal((IComponentDescriptor) objData, true);
-		}
-			
-		// Component Entry
-		//----------------
-		else if (objData instanceof IComponentEntryDescriptor) {
-			IComponentDescriptor comp = ((IComponentEntryDescriptor)objData).getComponentDescriptor();
-			updateLaunchInfoComponent(comp, launchInfo);
-			_registryManager.addComponentDescriptorToLocal(comp, false);
-		}
-
-		// Do child parcels
-		//-----------------
-		UMSessionManagerParcel[] parcelChildren = parcel.getParcels();
-
-		for (int i = 0; i < parcelChildren.length; ++i) {
-			updateLaunchInfoAndRegistryParcel(parcelChildren[i], launchInfo);
-		}
-	}
-}
-/**
- * Updates the boot loader's launch information with what is currently installed.
- */
-public void updateLaunchInfoComponent(IComponentDescriptor descriptor, LaunchInfo launchInfo) {
-
-	// Component
-	//----------
-	launchInfo.setComponent(new LaunchInfo.VersionedIdentifier(descriptor.getUniqueIdentifier(), descriptor.getVersionStr()));
-
-	// Plugins
-	//--------
-	IPluginEntryDescriptor[] pluginDescriptors = descriptor.getPluginEntries();
-
-	for (int i = 0; i < pluginDescriptors.length; ++i) {
-		updateLaunchInfoPlugin(pluginDescriptors[i], launchInfo);
-	}
-
-	// Fragments
-	//----------
-	IFragmentEntryDescriptor[] fragmentDescriptors = descriptor.getFragmentEntries();
-
-	for (int i = 0; i < fragmentDescriptors.length; ++i) {
-		updateLaunchInfoFragment(fragmentDescriptors[i], launchInfo);
-	}
-}
-/**
- * Updates the boot loader's launch information with what is currently installed.
- */
-public void updateLaunchInfoFragment(IFragmentEntryDescriptor descriptor, LaunchInfo launchInfo) {
-
-	launchInfo.setFragment(new LaunchInfo.VersionedIdentifier(descriptor.getUniqueIdentifier(),descriptor.getVersionStr()));
-}
-/**
- * Updates the boot loader's launch information with what is currently installed.
- */
-public void updateLaunchInfoPlugin(IPluginEntryDescriptor descriptor, LaunchInfo launchInfo) {
-
-	launchInfo.setPlugin(new LaunchInfo.VersionedIdentifier(descriptor.getUniqueIdentifier(),descriptor.getVersionStr()));
-}
-/**
- * Updates the boot loader's launch information with what is currently installed.
- */
-public void updateLaunchInfoProduct(IProductDescriptor descriptor, LaunchInfo launchInfo) {
-
-	launchInfo.setConfiguration(new LaunchInfo.VersionedIdentifier(descriptor.getUniqueIdentifier(),descriptor.getVersionStr()), descriptor.getApplication());
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerException.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerException.java
deleted file mode 100644
index e25de36..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerException.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/**
- * 
- */
-public class UpdateManagerException  extends Exception {
-/**
- * UpdateManagerException constructor comment.
- */
-public UpdateManagerException( String strMessage ) {
-	super( strMessage );
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerPlugin.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerPlugin.java
deleted file mode 100644
index e05d25d..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerPlugin.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.net.MalformedURLException;
-import java.net.URL;
-/**
- */
-import org.eclipse.core.runtime.*;
-import org.eclipse.update.internal.ui.*;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.webdav.http.client.HttpClient;
-
-public class UpdateManagerPlugin extends Plugin {
-	private static UpdateManagerPlugin _pluginInstance = null;
-	private	HttpClient client =null;
-/**
- * UpdateManagerPlugin constructor comment.
- */
-public UpdateManagerPlugin( IPluginDescriptor pluginDescriptor ) {
-	super( pluginDescriptor );
-
-	_pluginInstance = this;
-}
-/**
- * Returns the image descriptor of an image file relative to this plugin
- * @return org.eclipse.jface.resource.ImageDescriptor
- * @param strImage java.lang.String
- */
-public static ImageDescriptor getImageDescriptor(String strImage) {
-
-	UpdateManagerPlugin plugin = getPluginInstance();
-
-	if (plugin != null) {
-
-		// Obtain my plugin descriptor
-		//----------------------------
-		IPluginDescriptor pluginDescriptor = plugin.getDescriptor();
-
-		// Determine where I am installed
-		//-------------------------------
-		URL path = pluginDescriptor.getInstallURL();
-
-		// Add the relative file location to the install location
-		// Create the image descriptor
-		//-------------------------------------------------------
-		URL urlFullPathString = null;
-
-		try {
-			urlFullPathString = new URL(path, strImage);
-			return ImageDescriptor.createFromURL(urlFullPathString);
-		}
-
-		catch (MalformedURLException e) {
-		}
-	}
-	return null;
-}
-/**
- * @return org.eclipse.update.internal.core.UpdateManagerPlugin
- */
-public static UpdateManagerPlugin getPluginInstance() {
-	return _pluginInstance;
-}
-/**
- * Shuts down this plug-in and discards all plug-in state.
- * <p>
- * This method should be re-implemented in subclasses that need to do something
- * when the plug-in is shut down.  Implementors should call the inherited method
- * to ensure that any system requirements can be met.
- * </p>
- * <p>
- * Plug-in shutdown code should be robust. In particular, this method
- * should always make an effort to shut down the plug-in. Furthermore,
- * the code should not assume that the plug-in was started successfully,
- * as this method will be invoked in the event of a failure during startup.
- * </p>
- * <p>
- * Note 1: If a plug-in has been started, this method will be automatically
- * invoked by the platform when the platform is shut down.
- * </p>
- * <p>
- * Note 2: This method is intended to perform simple termination
- * of the plug-in environment. The platform may terminate invocations
- * that do not complete in a timely fashion.
- * </p>
- * <b>Cliens must never explicitly call this method.</b>
- *
- * @exception CoreException if this method fails to shut down
- *   this plug-in 
- */
-public void shutdown() throws CoreException {
-	if(client!=null) client.close(); 
-}
-/**
- * Starts up this plug-in.
- * <p>
- * This method should be overridden in subclasses that need to do something
- * when this plug-in is started.  Implementors should call the inherited method
- * to ensure that any system requirements can be met.
- * </p>
- * <p>
- * If this method throws an exception, it is taken as an indication that
- * plug-in initialization has failed; as a result, the plug-in will not
- * be activated; moreover, the plug-in will be marked as disabled and 
- * ineligible for activation for the duration.
- * </p>
- * <p>
- * Plug-in startup code should be robust. In the event of a startup failure,
- * the plug-in's <code>shutdown</code> method will be invoked automatically,
- * in an attempt to close open files, etc.
- * </p>
- * <p>
- * Note 1: This method is automatically invoked by the platform 
- * the first time any code in the plug-in is executed.
- * </p>
- * <p>
- * Note 2: This method is intended to perform simple initialization 
- * of the plug-in environment. The platform may terminate initializers 
- * that do not complete in a timely fashion.
- * </p>
- * <b>Cliens must never explicitly call this method.</b>
- *
- * @exception CoreException if this plug-in did not start up properly
- */
-public void startup() throws CoreException {
-	// Setup HTTP client
-	//------------------
-	client = new HttpClient();
-	client.setAuthenticator(new AuthorizationDatabase());
-	URLHandler.setHttpClient(client);
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerStrings.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerStrings.java
deleted file mode 100644
index 21b7ecd..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerStrings.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/**
- * This class loads translatable strings from a resource bundle properties file.
- */
-import java.util.ResourceBundle;
-import java.util.MissingResourceException;
-
-public class UpdateManagerStrings
-{
-	private static ResourceBundle _resourceBundle = null;
-/**
- * Obtains a NL translated string from a resource bundle
- * @param strKey java.lang.String
- */
-public static String getString( String strKey ) 
-{
-	String strTranslated = strKey;
-
-	// Obtain the set of translated strings
-	//-------------------------------------
-	if( _resourceBundle == null )
-	{
-		try
-		{
-			_resourceBundle = ResourceBundle.getBundle( UpdateManager._strPackageName + ".updatemanagerstrings" );
-		}
-		catch( MissingResourceException ex )
-		{
-			_resourceBundle = null;
-		}
-	}
-
-	// Obtain the translated string
-	//-----------------------------
-	if( _resourceBundle != null )
-	{
-		try
-		{
-			strTranslated = _resourceBundle.getString( strKey );
-		}
-		catch( MissingResourceException ex )
-		{
-			strTranslated = strKey;
-		}
-	}
-
-	return strTranslated;
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerURLComparator.java b/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerURLComparator.java
deleted file mode 100644
index ede4744..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/UpdateManagerURLComparator.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.eclipse.update.internal.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.internal.boot.update.*;
-import java.net.*;
-/**
- * 
- */
-import java.util.Comparator;
-public class UpdateManagerURLComparator implements Comparator{
-/**
- * UpdateManagerTreeItemComparator constructor comment.
- */
-public UpdateManagerURLComparator() {
-	super();
-}
-/**
- * Compares two strings independent of case.
- * 
- * @return a negative integer, zero, or a positive integer as the
- *         first argument is less than, equal to, or greater than the
- *         second. 
- * @throws ClassCastException if the arguments' types prevent them from
- *         being compared by this Comparator.
- */
-public int compare(java.lang.Object o1, java.lang.Object o2) {
-
-	if (o1 instanceof URLNamePair && o2 instanceof URLNamePair) {
-		return ((URLNamePair) o1).getURL().toExternalForm().toLowerCase().compareTo(((URLNamePair) o2).getURL().toExternalForm().toLowerCase());
-	}
-
-	return 0;
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/core/updatemanagerstrings.properties b/update/org.eclipse.update/src/org/eclipse/update/internal/core/updatemanagerstrings.properties
deleted file mode 100644
index 5cec005..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/core/updatemanagerstrings.properties
+++ /dev/null
@@ -1,112 +0,0 @@
-S_Add                                                     = Add
-S_Additional_Locations                                    = Additional Locations
-S_An_installation_error_or_cancellation_has_occurred      = An installation error or cancellation has occurred
-S_At_the_following_domain                                 = At the following domain
-S_Available                                               = Available
-S_Cancel_component_installation                           = Cancel component installation
-S_Component                                               = Component
-S_Component_identifier                                    = Component identifier
-S_Component_name                                          = Component name
-S_Configuration_Change                                    = Configuration Change
-S_Copy                                                    = Copy
-S_Current_installation                                    = Current installation
-S_Description                                             = Description
-S_Encountered_jar_entry_security_exception                = Encountered jar entry security exception
-S_Enter_a_user_name_and_password_for                      = Enter a user name and password for
-S_Error_closing_output_stream                             = Error closing output stream
-S_Error_in_registry                                       = Error in registry
-S_Error_occurred_during_installation_completion           = Error occurred during installation completion
-S_Error_occurred_during_installation_setup                = Error occurred during installation setup
-S_Error_occurred_during_verification                      = Error occurred during verification
-S_Error_reading_from_input_stream                         = Error reading from input stream
-S_Error_writing_to_output_stream                          = Error writing to output stream
-S_Examining                                               = Examining
-S_File_is_not_a_valid_JAR_file                            = File is not a valid JAR file
-S_File_name                                               = File name
-S_HTTP_client_not_set                                     = HTTP client not set
-S_Identifier                                              = Identifier
-S_Information                                             = Information
-S_Install                                                 = Install
-S_Install_component                                       = Install component
-S_Install_Components                                      = Install Components
-S_Installation                                            = Installation
-S_Installation_cancelled_by_user                          = Installation cancelled by user
-S_Installation_completed                                  = Installation completed
-S_Installations_have_completed_successfully               = Installations have completed successfully
-S_Installed                                               = Installed
-S_Installed_Components                                    = Installed Components
-S_Installing_this_component_may_corrupt_your_installation = Installing this component may corrupt your installation
-S_Location                                                = Location
-S_New_Component_Updates                                   = New Component Updates
-S_New_Components                                          = New Components
-S_No_installable_items_were_found                         = No installable items were found
-S_not_available                                           = not available
-S_not_compatible                                          = not compatible
-S_not_newer                                               = not newer
-S_not_updatable                                           = not updatable
-S_Number_of_installation_histories_to_keep                = Number of installation histories to keep
-S_Obtaining_information                                   = Obtaining information
-S_OK                                                      = OK
-S_optional                                                = optional
-S_Password                                                = Password
-S_Password_Required                                       = Password Required
-S_Predefined_Locations                                    = Predefined Locations
-S_Provider                                                = Provider
-S_Reading                                                 = Reading
-S_Remove                                                  = Remove
-S_Remove_selected_components                              = Remove selected components
-S_Revert                                                  = Revert
-S_Revert_to_a_Previous_Installation                       = Revert to a Previous Installation
-S_Revert_to_another_installation                          = Revert to another installation
-S_Search_for_more_recent_versions_to_install              = Search for more recent versions to install
-S_Search_for_new_components                               = Search for new components
-S_Search_for_updates_for_all_components                   = Search for updates for all components
-S_Search_for_updates_for_selected_components              = Search for updates for selected components
-S_Select_a_previous_installation_to_revert_to             = Select a previous installation to revert to
-S_Select_any_optional_components_to_install               = Select any optional components to install
-S_Select_available_versions_to_install                    = Select available versions to install
-S_Select_components_to_install                            = Select components to install
-S_Select_locations_to_update_from                         = Select locations to update from
-S_Show_only_most_recent_versions                          = Show only most recent versions
-S_Software_Updates                                        = Software Updates
-S_Source_location                                         = Source location
-S_Source_URL_is_malformed                                 = Source URL is malformed
-S_Specify_search_locations_for_new_components             = Specify search locations for new components
-S_Status                                                  = Status
-S_Target_URL_is_malformed                                 = Target URL is malformed
-S_The_certificates_used_to_authenticate_this_component_are_not_recognized = The certificates used to authenticate this component are not recognized
-S_The_content_of_this_component_has_been_corrupted        = The content of this component has been corrupted
-S_The_following_installation_will_become_active_when_the_workbench_is_restarted = The following installation will become active when the workbench is restarted
-S_The_following_items_will_be_installed                   = The following items will be installed
-S_The_following_items_will_be_updated                     = The following items will be updated
-S_The_installation_process_will_be_aborted                = The installation process will be aborted
-S_The_provider_of_this_component_cannot_be_verified       = The provider of this component cannot be verified
-S_This_component_has_not_been_digitally_signed            = This component has not been digitally signed
-S_This_component_will_not_be_installed                    = This component will not be installed
-S_Update                                                  = Update
-S_Update_All                                              = Update All
-S_Updates_completed                                       = Updates completed
-S_Unable_to_access_the_following_locations                = Unable to access the following locations
-S_Unable_to_connect                                       = Unable to connect
-S_Unable_to_create_file                                   = Unable to create file
-S_Unable_to_create_jar_entry_URL                          = Unable to create jar entry URL
-S_Unable_to_create_output_file_for_Jar_entry              = Unable to create output file for Jar entry
-S_Unable_to_delete_file                                   = Unable to delete file
-S_Unable_to_find_install_manifest_file_in_Jar             = Unable to find install manifest file in Jar
-S_Unable_to_find_defined_contents_in_Jar                  = Unable to find defined contents in Jar
-S_Unable_to_obtain_source_input_stream                    = Unable to obtain source input stream
-S_Unable_to_obtain_target_output_stream                   = Unable to obtain target output stream
-S_Unable_to_open_error_logs                               = Unable to open error_logs
-S_Unable_to_open_jar_entry_input_stream                   = Unable to open jar entry input stream
-S_Unable_to_open_Jar_file                                 = Unable to open Jar file
-S_Undefined_contents_found_in_Jar                         = Undefined contents found in Jar
-S_Undo                                                    = Undo
-S_User_name                                               = User name
-S_Verification                                            = Verification
-S_Verification_cancelled                                  = Verification cancelled
-S_Verify                                                  = Verify
-S_Version                                                 = Version
-S_You_are_about_to_install_a_signed_component             = You are about to install a signed component
-S_You_are_about_to_install_an_unsigned_component          = You are about to install an unsigned component
-S_You_may_choose_to_install_the_component_or_cancel_its_installation = You may choose to install the component or cancel its installation
-S_You_must_restart_the_workbench_to_activate_any_changes  = You must restart the workbench to activate any changes
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/AuthorizationDatabase.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/AuthorizationDatabase.java
deleted file mode 100644
index 8d2af15..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/AuthorizationDatabase.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.eclipse.update.internal.ui;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.net.URL;
-import java.util.Hashtable;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.update.internal.core.UpdateManagerPlugin;
-import org.eclipse.webdav.http.client.IAuthenticator;
-
-/**
- * A transient database that remembers information, such as usernames and
- * passwords.  The information is stored in memory only and is discarted
- * when the Plaform shuts down.
- */
-public class AuthorizationDatabase implements IAuthenticator {
-
-	/**
-	 * The Map containing the userid and password
-	 */
-	private Map result = new Hashtable();
-
-	/**
-	 * 
-	 */
-	public void addAuthenticationInfo(URL serverUrl, String realm, String scheme, Map info) {
-		try {
-			Platform.addAuthorizationInfo(serverUrl, realm, scheme, info);
-		}
-		catch (CoreException e) {
-			UpdateManagerPlugin.getPluginInstance().getLog().log(e.getStatus());
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void addProtectionSpace(URL resourceUrl, String realm) {
-		try {
-			Platform.addProtectionSpace(resourceUrl, realm);
-		}
-		catch (CoreException e) {
-			UpdateManagerPlugin.getPluginInstance().getLog().log(e.getStatus());
-		}
-
-	}
-	/**
-	 *
-	 */
-	public Map getAuthenticationInfo(URL serverUrl, String realm, String scheme) {
-
-		return Platform.getAuthorizationInfo(serverUrl, realm, scheme);
-	}
-	/**
-	 * 
-	 */
-	public String getProtectionSpace(URL resourceUrl) {
-		return Platform.getProtectionSpace(resourceUrl);
-	}
-	/**
-	 * 
-	 */
-	public Map requestAuthenticationInfo(final URL resourceUrl, final String realm, final String scheme) {
-
-		result = new Hashtable();
-		if (scheme.equalsIgnoreCase("Basic")) {
-
-			Display disp = Display.getCurrent();
-			if (disp != null) {
-				promptForPassword(resourceUrl, realm, result);
-			}
-			else {
-				Display.getDefault().syncExec(new Runnable() {
-					public void run() {
-						promptForPassword(resourceUrl, realm, result);
-					}
-				});
-			};
-		}
-		return result;
-	}
-
-	/**
-	 *
-	 */
-	private void promptForPassword(URL resourceUrl, String realm, Map info) {
-
-		Shell shell = new Shell();
-		UserValidationDialog ui = new UserValidationDialog(shell, resourceUrl, realm, "");
-		ui.setUsernameMutable(true);
-		ui.setBlockOnOpen(true);
-		ui.open();
-
-		if (ui.getReturnCode() != ui.CANCEL) {
-			info.put("username", ui.getUserid());
-			info.put("password", ui.getPassword());
-		}
-		shell.dispose();
-
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/Installation.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/Installation.java
deleted file mode 100644
index 056f820..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/Installation.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package org.eclipse.update.internal.ui;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Date;
-import org.eclipse.core.internal.boot.LaunchInfo;
-import org.eclipse.core.internal.boot.LaunchInfo.History;
-/**
- */
-public class Installation {
-	private static final String STRING_ID = "-id";
-	private static final String STRING_LIST = "-list";
-	private static final String STRING_LOCATION = "-location";
-	private static final String STRING_SET = "-set";
-
-	private boolean _bList = false;
-	private boolean _bSet = false;
-	private String _strLocation = null;
-	private String _strId = null;
-	private int _iId = -1;
-	private LaunchInfo _launchInfo = null;
-	/**
-	 * Installation constructor comment.
-	 */
-	public Installation() {
-		super();
-	}
-	/**
-	 * 
-	 */
-	private String checkCommandLineOptions() {
-
-		// Command
-		//--------
-		if (_bList == true) {
-			if (_bSet == true) {
-				return "Invalid option syntax";
-			}
-		}
-
-		else if (_bSet == true) {
-			if (_bList == true) {
-				return "Invalid option syntax";
-			}
-		}
-
-		else {
-			return "Command missing";
-		}
-
-		// Location
-		//---------
-		if (_strLocation == null || _strLocation.length() == 0) {
-			return "Location missing";
-		}
-
-		URL urlLocation = null;
-
-		try {
-			urlLocation = new URL(_strLocation);
-		}
-		catch (MalformedURLException ex) {
-			return "Invalid location syntax";
-		}
-
-		// Set the location of the installation directory
-		//-----------------------------------------------
-		//	LaunchInfo.startup(urlLocation);
-		_launchInfo = LaunchInfo.getCurrent();
-
-		// Set
-		//----
-		if (_bSet == true) {
-			if (_strId == null || _strId.length() == 0) {
-				return "Installation identifier number missing";
-			}
-
-			try {
-				_iId = new Integer(_strId).intValue();
-			}
-			catch (NumberFormatException ex) {
-				return "Invalid identifier syntax";
-			}
-		}
-
-		return null;
-	}
-	/**
-	 */
-	public String doList() {
-
-		LaunchInfo launchInfoFormer = null;
-
-		LaunchInfo.History[] histories = _launchInfo.getLaunchInfoHistory();
-
-		if (histories.length == 0)
-			return "No histories found";
-
-		if (histories.length == 1 && histories[0].getLaunchInfoDate() == null)
-			return "No histories found";
-
-		// Same order as doSet()
-		// Most recent to oldest order
-		//----------------------------
-		int iIndex = 1;
-
-		for (int i = histories.length - 1; i >= 0; --i) {
-
-			Date date = histories[i].getLaunchInfoDate();
-
-			// Older profile
-			//--------------
-			if (date != null) {
-				System.out.println(Integer.toString(iIndex++) + " " + histories[i].getLaunchInfoDate().toString());
-			}
-		}
-
-		return null;
-	}
-	/**
-	 * 
-	 */
-	public String doSet() {
-
-		LaunchInfo.History[] histories = _launchInfo.getLaunchInfoHistory();
-
-		if (_iId < histories.length) {
-
-			int iIndex = 1;
-
-			// Same algorithm as doList()
-			// Most recent to oldest order
-			//----------------------------
-			for (int i = histories.length - 1; i >= 0; --i) {
-
-				Date date = histories[i].getLaunchInfoDate();
-
-				// Older profile
-				//--------------
-				if (date != null) {
-					if (iIndex == _iId) {
-						_launchInfo.revertTo(histories[i]);
-						System.out.println(date.toString());
-						return null;
-					}
-					else {
-						iIndex++;
-					}
-				}
-			}
-		}
-
-		return "Identifier not found";
-	}
-	/**
-	 */
-	public static void main(String[] args) {
-
-		Installation installation = new Installation();
-
-		installation.parseCommandLineOptions(args);
-
-		String strError = installation.checkCommandLineOptions();
-
-		if (strError == null) {
-			if (installation._bList == true)
-				strError = installation.doList();
-
-			else if (installation._bSet == true)
-				strError = installation.doSet();
-		}
-
-		if (strError != null) {
-			System.out.println(strError);
-			printUsage();
-			System.exit(-1);
-		}
-	}
-	/**
-	 */
-	public void parseCommandLineOptions(String[] straArgs) {
-
-		for (int i = 0; i < straArgs.length; ++i) {
-
-			// Command: List
-			//--------------
-			if (straArgs[i].equalsIgnoreCase(STRING_LIST) == true) {
-				_bList = true;
-			}
-
-			// Command: Set
-			//-------------
-			else if (straArgs[i].equalsIgnoreCase(STRING_SET) == true) {
-				_bSet = true;
-			}
-
-			// Location to install from
-			//-------------------------
-			else if (straArgs[i].equalsIgnoreCase(STRING_LOCATION) == true && i < straArgs.length - 1) {
-				_strLocation = straArgs[++i];
-			}
-
-			// Identifier
-			//-----------
-			else if (straArgs[i].equalsIgnoreCase(STRING_ID) == true && i < straArgs.length - 1) {
-				_strId = straArgs[++i];
-			}
-		}
-	}
-	/**
-	 */
-	public static void printUsage() {
-		System.out.println("");
-		System.out.println("-list -location urlPath");
-		System.out.println("-set  -location urlPath -id number");
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerificationDialog.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerificationDialog.java
deleted file mode 100644
index 6d5389d..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerificationDialog.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerificationResult.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerificationResult.java
deleted file mode 100644
index 1711181..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerificationResult.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.update.internal.ui;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/**
- * Result of the service
- */
-public class JarVerificationResult {
-
-	public static final int CANCEL_INSTALL = 0;
-	public static final int OK_TO_INSTALL = 1;
-
-	private int resultCode;
-	private Exception resultException;
-	/**
-	 */
-	public int getResultCode() {
-		return resultCode;
-	}
-	/**
-	 */
-	public Exception getResultException() {
-		return resultException;
-	}
-	/**
-	 */
-	public void setResultCode(int newResultCode) {
-		resultCode = newResultCode;
-	}
-	/**
-	 * called by JarVerificationService only
-	 */
-	void setResultException(Exception newResultException) {
-		resultException = newResultException;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerificationService.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerificationService.java
deleted file mode 100644
index 69b4339..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerificationService.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerifier.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerifier.java
deleted file mode 100644
index dda11d7..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/JarVerifier.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/KeyStores.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/KeyStores.java
deleted file mode 100644
index 7284e0a..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/KeyStores.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/Main.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/Main.java
deleted file mode 100644
index e0f0367..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/Main.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package org.eclipse.update.internal.ui;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.net.*;
-import java.lang.reflect.*;
-import java.io.PrintWriter;
-import java.util.StringTokenizer;
-import java.util.Vector;
-/**
- * Startup class for Eclipse. Creates a class loader using
- * supplied URL of platform installation, loads and calls
- * the Eclipse Boot Loader
- */
-public class Main {
-	protected boolean debug = false;
-	protected boolean usage = false;
-	protected String bootLocation = null;
-	protected String application;
-	protected URL pluginPathLocation;
-	protected String location;
-
-	// constants
-	private static final String APPLICATION = "-application";
-	private static final String BOOT = "-boot";
-	private static final String DEBUG = "-debug";
-	private static final String USAGE = "-?";
-	private static final String BOOTLOADER = "org.eclipse.core.boot.BootLoader";
-
-	// The project containing the boot loader code.  This is used to construct
-	// the correct class path for running in VAJ and VAME.
-	private static final String PROJECT_NAME = "Eclipse Core Boot";
-
-	private static boolean inVAJ;
-	static {
-		try {
-			Class.forName("com.ibm.uvm.lang.ProjectClassLoader");
-			inVAJ = true;
-		} catch (Exception e) {
-			inVAJ = false;
-		}
-	}
-	private static boolean inVAME;
-	static {
-		try {
-			Class.forName("com.ibm.eclipse.VAME");
-			inVAME = true;
-		} catch (Exception e) {
-			inVAME = false;
-		}
-	}
-
-protected void basicRun(String[] args) throws Exception {
-	Class clazz = getBootLoader(bootLocation);
-	Method method = clazz.getDeclaredMethod("run", new Class[] { String.class, URL.class, String.class, String[].class });
-	try {
-		method.invoke(clazz, new Object[] { application, pluginPathLocation, location, args });
-	} catch (InvocationTargetException e) {
-		if (e.getTargetException() instanceof Error)
-			throw (Error) e.getTargetException();
-		else
-			throw e;
-	}
-}
-public Class getBootLoader(String base) throws Exception {
-	URLClassLoader loader = new URLClassLoader(new URL[] { getBootURL(base)}, null);
-	return loader.loadClass(BOOTLOADER);
-}
-/**
- * Returns the <code>URL</code> where the boot classes are located.
- */
-protected URL getBootURL(String base) throws MalformedURLException {
-	URL url = null;
-	if (base != null) 
-		return new URL(base);
-	// Create a URL based on the location of this class' code.
-	// strip off jar file and/or last directory to get 
-	// to the directory containing projects.
-	url = getClass().getProtectionDomain().getCodeSource().getLocation();
-	String path = url.getFile();
-	if (path.endsWith(".jar"))
-		path = path.substring(0, path.lastIndexOf("/"));
-	if (path.endsWith("/"))
-		path = path.substring(0, path.length() - 1);
-	if (inVAJ || inVAME) {
-		int ix = path.lastIndexOf("/");
-		path = path.substring(0, ix + 1);
-		path = path + PROJECT_NAME + "/";
-	} else
-		path = path + "/plugins/org.eclipse.core.boot/boot.jar";
-	return new URL(url.getProtocol(), url.getHost(), url.getPort(), path);
-}
-/**
- * Print the usage of this launcher on the system console
- */
-protected void printUsage(PrintWriter out) {
-	out.println("The general form of using the Platform bootstrap main is:");
-	out.println("      java <main class> -application <name> [option list]");
-	out.println("where the required arguments are:");
-	out.println("      -application <name> : the application to run ");
-	out.println("and where the option list can be any number of the following:");
-	out.println("      -platform <location> : run in the given location");
-	out.println("      -debug [debug options file] : turn on debug mode.  Read debug options from ");
-	out.println("          the specified file or from ./.options if not specified.");
-	out.println("      -? : print this message");
-	out.flush();
-}
-protected String[] processCommandLine(String[] args) throws Exception {
-	int[] configArgs = new int[100];
-	configArgs[0] = -1; // need to initialize the first element to something that could not be an index.
-	int configArgIndex = 0;
-	for (int i = 0; i < args.length; i++) {
-		boolean found = false;
-		// check for args without parameters (i.e., a flag arg)
-		// 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
-		}
-
-		// look for the usage flag
-		if (args[i].equalsIgnoreCase(USAGE)) {
-			usage = true;
-			// passed thru this arg (i.e., do not set found = true
-		}
-
-		if (found) {
-			configArgs[configArgIndex++] = i;
-			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("-")) {
-			continue;
-		}
-		String arg = args[++i];
-
-		// look for the laucher to run
-		if (args[i - 1].equalsIgnoreCase(BOOT)) {
-			found = true;
-			bootLocation = arg;
-		}
-
-		// look for the application to run
-		if (args[i - 1].equalsIgnoreCase(APPLICATION)) {
-			found = true;
-			application = arg;
-		}
-
-		// done checking for args.  Remember where an arg was found 
-		if (found) {
-			configArgs[configArgIndex++] = i - 1;
-			configArgs[configArgIndex++] = i;
-		}
-	}
-
-	// remove all the arguments consumed by this argument parsing
-	if (configArgIndex == 0)
-		return args;
-	String[] passThruArgs = new String[args.length - configArgIndex];
-	configArgIndex = 0;
-	int j = 0;
-	for (int i = 0; i < args.length; i++) {
-		if (i == configArgs[configArgIndex])
-			configArgIndex++;
-		else
-			passThruArgs[j++] = args[i];
-	}
-	return passThruArgs;
-}
-public void run(String[] args) throws Exception {
-	String[] passThruArgs = processCommandLine(args);
-	if (usage) {
-		printUsage(new PrintWriter(System.out));
-		return;
-	}
-	basicRun(passThruArgs);
-}
-}
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplication.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplication.java
deleted file mode 100644
index 3bb792a..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplication.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.eclipse.update.internal.ui;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/* 
- * Update Manager Install Application
- *
- * Command to run from command line:
- *
- *.\jre\bin\java -verify -cp startup.jar org.eclipse.core.launcher.UIMain -application org.eclipse.update.internal.ui.updateManager -install -url http://klicnik.torolab.ibm.com/eclipse/site/ -id org.eclipse.sdk %*
- *
- *
- * Arguments are:
- *   -install   Install command
- *   -url [url] Location from which to install from
- *   -id  [id]  Identifier of the manifest to install
- *
- * Sample:
- *   -install -url file:/c:/temp/updatesite/ -id org.eclipse.sdk
- */
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-public class UMApplication extends Main {
-	private static final String DEFAULT_APPLICATION = "org.eclipse.update.internal.ui.updateManager";
-	public UMApplication() {
-		super();
-		application = DEFAULT_APPLICATION;
-	}
-	public static void main(String[] args) {
-
-		int iReturnCode = 0;
-
-		try {
-			new UMApplication().run(args);
-		}
-
-		catch (Exception e) {
-		}
-
-		System.exit(0);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplicationUserInterface.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplicationUserInterface.java
deleted file mode 100644
index 2543bc2..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplicationUserInterface.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplicationUserInterfaceProperties.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplicationUserInterfaceProperties.java
deleted file mode 100644
index ac84b0b..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplicationUserInterfaceProperties.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplicationWindow.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplicationWindow.java
deleted file mode 100644
index 9d6394b..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMApplicationWindow.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMDialog.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMDialog.java
deleted file mode 100644
index a098936..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMDialog.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMDialogAction.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMDialogAction.java
deleted file mode 100644
index 19dd3d4..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMDialogAction.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMPreferencePageSettings.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMPreferencePageSettings.java
deleted file mode 100644
index d5a2709..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMPreferencePageSettings.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizard.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizard.java
deleted file mode 100644
index 0adbc08..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizard.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageComplete.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageComplete.java
deleted file mode 100644
index 5d3a7ec..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageComplete.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageInstallable.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageInstallable.java
deleted file mode 100644
index b2803d4..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageInstallable.java
+++ /dev/null
@@ -1,1333 +0,0 @@
-package org.eclipse.update.internal.ui;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.TreeSet;
-import java.util.Vector;
-
-import org.eclipse.core.internal.boot.update.IComponentDescriptor;
-import org.eclipse.core.internal.boot.update.IComponentEntryDescriptor;
-import org.eclipse.core.internal.boot.update.IManifestDescriptor;
-import org.eclipse.core.internal.boot.update.IProductDescriptor;
-import org.eclipse.core.internal.boot.update.IUMRegistry;
-import org.eclipse.core.internal.boot.update.UMEclipseTree;
-import org.eclipse.core.internal.boot.update.URLNamePair;
-import org.eclipse.core.internal.boot.update.UpdateManagerConstants;
-import org.eclipse.core.internal.boot.update.BaseURLHandler.Response;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.TableTree;
-import org.eclipse.swt.custom.TableTreeItem;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.update.internal.core.URLHandler;
-import org.eclipse.update.internal.core.UpdateManagerStrings;
-import org.eclipse.webdav.http.client.IStatusCodes;
-
-/**
- * Presents products and components that may be selected for installation.
- */
-public class UMWizardPageInstallable extends WizardPage implements MouseMoveListener, MouseTrackListener, SelectionListener {
-	protected boolean _bRefreshRequired = true;
-	protected UMWizard _wizard = null;
-	protected TableTree _tableTreeItems = null;
-	protected Hashtable _hashRegistryCache = new Hashtable();
-	protected TreeSet _treeSetItems = null;
-	protected TreeSet _treeSetLocations = null;
-	protected Text _textDescription = null;
-	protected String _strDescription = null;
-	protected boolean _bUpdateMode = false;
-	protected SashForm _sashFormTopBottom = null;
-	protected IProgressMonitor _progressMonitor = null;
-	protected URLNamePair[] _urlNamePairs = null;
-	protected Button _buttonShowLatestOnly = null;
-	protected boolean _bShowLatestOnly = true;
-	/**
-	 *
-	 */
-	public UMWizardPageInstallable(UMWizard wizard, String strName, boolean bUpdateMode) {
-		super(strName);
-		_wizard = wizard;
-		_bUpdateMode = bUpdateMode;
-
-		if (bUpdateMode == true) {
-			this.setTitle(UpdateManagerStrings.getString("S_New_Component_Updates"));
-			this.setDescription(UpdateManagerStrings.getString("S_Select_available_versions_to_install"));
-		}
-		else {
-			this.setTitle(UpdateManagerStrings.getString("S_New_Components"));
-			this.setDescription(UpdateManagerStrings.getString("S_Select_components_to_install"));
-		}
-	}
-	/**
-	 * 
-	 */
-	public void addLocationToTree(IUMRegistry registryRemote, IUMRegistry registryLocal, IProgressMonitor progressMonitor) {
-
-		UMWizardTreeItem itemProduct = null;
-		UMWizardTreeItem itemComponent = null;
-		UMWizardTreeItem itemComponentEntry = null;
-		UMWizardTreeItem itemLocation = null;
-		UMWizardTreeItem itemComponentCategory = null;
-		UMWizardTreeItem itemProductCategory = null;
-
-		IProductDescriptor descriptorLocalProduct = null;
-		IProductDescriptor[] descriptorsProduct = null;
-		IComponentDescriptor descriptorLocalComponent = null;
-		IComponentDescriptor[] descriptorsComponent = null;
-		IComponentEntryDescriptor[] descriptorsEntry = null;
-
-		// Obtain descriptors
-		//-------------------
-		if (_bShowLatestOnly == true) {
-			descriptorsProduct = registryRemote.getProductDescriptors();
-			descriptorsComponent = registryRemote.getComponentDescriptors();
-		}
-		else {
-			descriptorsProduct = registryRemote.getAllProductDescriptors();
-			descriptorsComponent = registryRemote.getAllComponentDescriptors();
-		}
-
-		if (descriptorsProduct.length + descriptorsComponent.length > 0) {
-
-			itemLocation = new UMWizardTreeItem();
-			itemLocation._iType = UpdateManagerConstants.TYPE_URL;
-			itemLocation._strDescription = registryRemote.getRegistryBaseURL().toExternalForm();
-			itemLocation._strName = getURLDescription(itemLocation._strDescription);
-			itemLocation._strURLUpdate = itemLocation._strName;
-
-			progressMonitor.beginTask(UpdateManagerStrings.getString("S_Examining") + ":", descriptorsProduct.length + descriptorsComponent.length);
-			progressMonitor.subTask(itemLocation._strName);
-
-			IManifestDescriptor[] descriptorsSelected = _wizard._manifestDescriptors;
-
-			boolean bIncludeThisOne = false;
-
-			// Products
-			//---------
-			if (descriptorsProduct.length > 0) {
-
-				itemProductCategory = new UMWizardTreeItem();
-				itemProductCategory._iType = UpdateManagerConstants.TYPE_PRODUCT_CATEGORY;
-				itemProductCategory._strName = "products";
-
-				// Add product category to location tree later
-				//--------------------------------------------
-				IProductDescriptor descriptorProductSelected = null;
-
-				for (int i = 0; i < descriptorsProduct.length; ++i) {
-
-					// Include all if selected descriptors is null
-					// Otherwise, include only those selected
-					//--------------------------------------------
-					bIncludeThisOne = true;
-
-					if (descriptorsSelected != null) {
-						bIncludeThisOne = false;
-
-						for (int j = 0; j < descriptorsSelected.length; ++j) {
-							if (descriptorsSelected[j] instanceof IProductDescriptor) {
-								descriptorProductSelected = (IProductDescriptor) descriptorsSelected[j];
-								if (descriptorProductSelected.getUniqueIdentifier() != null) {
-									if (descriptorProductSelected.getUniqueIdentifier().equals(descriptorsProduct[i].getUniqueIdentifier()) == true) {
-										bIncludeThisOne = true;
-										break;
-									}
-								}
-							}
-						}
-					}
-
-					// Display only non-installed items
-					//---------------------------------
-					if (_bUpdateMode == false) {
-						if (registryLocal.getProductDescriptor(descriptorsProduct[i].getUniqueIdentifier()) != null) {
-							bIncludeThisOne = false;
-						}
-					}
-
-					if (bIncludeThisOne == true) {
-						itemProduct = new UMWizardTreeItem();
-						itemProduct._iType = UpdateManagerConstants.TYPE_PRODUCT;
-						itemProduct._strDescription = descriptorsProduct[i].getDescription();
-						itemProduct._strName = descriptorsProduct[i].getLabel();
-						itemProduct._strId = descriptorsProduct[i].getUniqueIdentifier();
-						itemProduct._strVendorName = descriptorsProduct[i].getProviderName();
-						itemProduct._strVersionAvailable = descriptorsProduct[i].getVersionStr();
-						itemProduct._descriptorAvailable = descriptorsProduct[i];
-
-						descriptorLocalProduct = registryLocal.getProductDescriptor(itemProduct._strId);
-
-						if (descriptorLocalProduct != null) {
-							itemProduct._descriptorCurrent = descriptorLocalProduct;
-							itemProduct._strVersionCurrent = descriptorLocalProduct.getVersionStr();
-						}
-
-						itemProductCategory.addChildItem(itemProduct);
-
-						// Component entries of the product
-						//---------------------------------
-						descriptorsEntry = descriptorsProduct[i].getComponentEntries();
-
-						for (int j = 0; j < descriptorsEntry.length; ++j) {
-
-							// Turn off selected flag
-							//-----------------------
-							descriptorsEntry[j].isSelected(false);
-							itemComponentEntry = new UMWizardTreeItem();
-							itemComponentEntry._iType = UpdateManagerConstants.TYPE_COMPONENT_ENTRY;
-							itemComponentEntry._strName = descriptorsEntry[j].getLabel();
-							itemComponentEntry._strId = descriptorsEntry[j].getUniqueIdentifier();
-							itemComponentEntry._strVersionAvailable = descriptorsEntry[j].getVersionStr();
-							itemComponentEntry._descriptorEntry = descriptorsEntry[j];
-
-							descriptorLocalComponent = registryLocal.getComponentDescriptor(itemComponentEntry._strId);
-
-							if (descriptorLocalComponent != null) {
-								itemComponentEntry._strVersionCurrent = descriptorLocalComponent.getVersionStr();
-								itemComponentEntry._strVendorName = descriptorLocalComponent.getProviderName();
-								itemComponentEntry._descriptorCurrent = descriptorLocalComponent;
-							}
-
-							itemProduct.addChildItem(itemComponentEntry);
-						}
-					}
-
-					progressMonitor.worked(1);
-				}
-
-				// Add component category if there are any components
-				//---------------------------------------------------
-				if (itemProductCategory._vectorChildren != null && itemProductCategory._vectorChildren.size() > 0) {
-					itemLocation.addChildItem(itemProductCategory);
-				}
-			}
-
-			// Components
-			//-----------
-			if (descriptorsComponent.length > 0) {
-
-				itemComponentCategory = new UMWizardTreeItem();
-				itemComponentCategory._iType = UpdateManagerConstants.TYPE_COMPONENT_CATEGORY;
-				itemComponentCategory._strName = "components";
-
-				// Add product category to location tree later
-				//--------------------------------------------
-				IComponentDescriptor descriptorComponentSelected = null;
-				for (int i = 0; i < descriptorsComponent.length; ++i) {
-
-					// Include all if selected descriptors is null
-					// Otherwise, include only those selected
-					//--------------------------------------------
-					bIncludeThisOne = true;
-					if (descriptorsSelected != null) {
-						bIncludeThisOne = false;
-						for (int j = 0; j < descriptorsSelected.length; ++j) {
-							if (descriptorsSelected[j] instanceof IComponentDescriptor) {
-								descriptorComponentSelected = (IComponentDescriptor) descriptorsSelected[j];
-								if (descriptorComponentSelected.getUniqueIdentifier() != null) {
-									if (descriptorComponentSelected.getUniqueIdentifier().equals(descriptorsComponent[i].getUniqueIdentifier()) == true) {
-										bIncludeThisOne = true;
-										break;
-									}
-								}
-							}
-						}
-					}
-
-					// Display only non-installed items
-					//---------------------------------
-					if (_bUpdateMode == false) {
-						if (registryLocal.getComponentDescriptor(descriptorsComponent[i].getUniqueIdentifier()) != null) {
-							bIncludeThisOne = false;
-						}
-					}
-
-					if (bIncludeThisOne == true) {
-						itemComponent = new UMWizardTreeItem();
-						itemComponent._iType = UpdateManagerConstants.TYPE_COMPONENT;
-						itemComponent._strDescription = descriptorsComponent[i].getDescription();
-						itemComponent._strName = descriptorsComponent[i].getLabel();
-						itemComponent._strId = descriptorsComponent[i].getUniqueIdentifier();
-						itemComponent._strVendorName = descriptorsComponent[i].getProviderName();
-						itemComponent._strVersionAvailable = descriptorsComponent[i].getVersionStr();
-						itemComponent._descriptorAvailable = descriptorsComponent[i];
-
-						descriptorLocalComponent = registryLocal.getComponentDescriptor(itemComponent._strId);
-
-						if (descriptorLocalComponent != null) {
-							itemComponent._strVersionCurrent = descriptorLocalComponent.getVersionStr();
-							itemComponent._descriptorCurrent = descriptorLocalComponent;
-						}
-
-						itemComponentCategory.addChildItem(itemComponent);
-					}
-					progressMonitor.worked(1);
-				}
-
-				// Add component category if there are any components
-				//---------------------------------------------------
-				if (itemComponentCategory._vectorChildren != null && itemComponentCategory._vectorChildren.size() > 0) {
-					itemLocation.addChildItem(itemComponentCategory);
-				}
-			}
-			progressMonitor.done();
-
-			// Add location if there are any products/components
-			//---------------------------------------------------       
-			if (itemLocation._vectorChildren != null && itemLocation._vectorChildren.size() > 0) {
-				_treeSetItems.add(itemLocation);
-			}
-		}
-	}
-	/**
-	 *
-	 */
-	public void connectToTree() {
-
-		// Remove all existing tree items
-		//-------------------------------
-		_tableTreeItems.removeAll();
-
-		UMWizardTreeItem item = null;
-
-		Iterator iter = _treeSetItems.iterator();
-
-		while (iter.hasNext() == true) {
-
-			item = (UMWizardTreeItem) iter.next();
-
-			// Create a new tree item for the top level (URL)
-			//-----------------------------------------------
-			TableTreeItem treeItem = new TableTreeItem(_tableTreeItems, SWT.NULL);
-
-			if (item._strName != null)
-				treeItem.setText(0, item._strName);
-
-			if (item._strVendorName != null)
-				treeItem.setText(4, item._strVendorName);
-
-			treeItem.setData(item);
-
-			// Create child tree items
-			//------------------------
-			if (item._vectorChildren != null) {
-				for (int i = 0; i < item._vectorChildren.size(); ++i) {
-					connectToTree((UMWizardTreeItem) item._vectorChildren.elementAt(i), treeItem);
-				}
-			}
-
-			treeItem.setExpanded(true);
-		}
-	}
-	/**
-	 * Connects items to a new tree widget.
-	 */
-	public void connectToTree(UMWizardTreeItem item, TableTreeItem treeItemParent) {
-
-		// Ignore product category and component category items
-		//-----------------------------------------------------
-		TableTreeItem treeItem = treeItemParent;
-
-		// Create a new tree item
-		//-----------------------
-		if (item._iType == UpdateManagerConstants.TYPE_PRODUCT || item._iType == UpdateManagerConstants.TYPE_COMPONENT || item._iType == UpdateManagerConstants.TYPE_COMPONENT_ENTRY) {
-
-			treeItem = new TableTreeItem(treeItemParent, SWT.NULL);
-			treeItem.setText(0, item._strName);
-			treeItem.setData(item);
-
-			// Table text
-			//-----------
-			if (item._strVersionCurrent != null)
-				treeItem.setText(1, item._strVersionCurrent);
-
-			if (item._strVersionAvailable != null)
-				treeItem.setText(2, item._strVersionAvailable);
-
-			if (item._strVendorName != null)
-				treeItem.setText(4, item._strVendorName);
-
-			// Status text
-			//------------
-			boolean bInstallable = false;
-
-			if (item._iType == UpdateManagerConstants.TYPE_PRODUCT) {
-				int iInstallable = isInstallableProduct(treeItem);
-				treeItem.setText(3, convertInstallableToString(iInstallable));
-			}
-
-			else if (item._iType == UpdateManagerConstants.TYPE_COMPONENT) {
-				int iInstallable = isInstallableComponent(treeItem);
-				treeItem.setText(3, convertInstallableToString(iInstallable));
-			}
-
-			else if (item._iType == UpdateManagerConstants.TYPE_COMPONENT_ENTRY) {
-
-				int iInstallable = isInstallableComponentEntry(treeItem);
-				treeItem.setText(3, convertInstallableToString(iInstallable));
-
-				if (iInstallable == UpdateManagerConstants.OK_TO_INSTALL) {
-					// Optional installation
-					//---------------------- 
-					if (item._descriptorEntry.isOptionalForInstall() == true) {
-						treeItem.setText(3, UpdateManagerStrings.getString("S_optional"));
-					}
-				}
-				else {
-					treeItem.setText(3, convertInstallableToString(iInstallable));
-				}
-			}
-		}
-
-		// Create child tree items
-		//------------------------
-		if (item._vectorChildren != null) {
-			for (int i = 0; i < item._vectorChildren.size(); ++i) {
-				connectToTree((UMWizardTreeItem) item._vectorChildren.elementAt(i), treeItem);
-			}
-		}
-
-		// Expand only after children have been created
-		//---------------------------------------------
-		if (item._iType != UpdateManagerConstants.TYPE_PRODUCT)
-			treeItem.setExpanded(true);
-
-		return;
-	}
-	/**
-	 * Converts installable constant to a displayable string
-	 */
-	public String convertInstallableToString(int iInstallable) {
-
-		switch (iInstallable) {
-			case UpdateManagerConstants.NOT_COMPATIBLE :
-				return UpdateManagerStrings.getString("S_not_compatible");
-			case UpdateManagerConstants.NOT_NEWER :
-				return UpdateManagerStrings.getString("S_not_newer");
-			case UpdateManagerConstants.NOT_UPDATABLE :
-				return UpdateManagerStrings.getString("S_not_updatable");
-			case UpdateManagerConstants.NOT_AVAILABLE :
-				return UpdateManagerStrings.getString("S_not_available");
-			default :
-				return "";
-		}
-	}
-	/**
-	 * createContents method comment.
-	 */
-	public void createControl(Composite compositeParent) {
-		// Content
-		//--------
-		Composite compositeContent = new Composite(compositeParent, SWT.NULL);
-
-		GridLayout layout = new GridLayout();
-		compositeContent.setLayout(layout);
-
-		GridData gridData = new GridData();
-		gridData.horizontalAlignment = GridData.FILL;
-		gridData.verticalAlignment = GridData.FILL;
-		gridData.grabExcessHorizontalSpace = true;
-		gridData.grabExcessVerticalSpace = true;
-		compositeContent.setLayoutData(gridData);
-
-		// Checkbox: Show most recent versions only
-		//-----------------------------------------
-		_buttonShowLatestOnly = new Button(compositeContent, SWT.CHECK);
-		_buttonShowLatestOnly.setText(UpdateManagerStrings.getString("S_Show_only_most_recent_versions"));
-		_buttonShowLatestOnly.setSelection(_bShowLatestOnly);
-		_buttonShowLatestOnly.addSelectionListener(this);
-
-		// SashPane Top/Bottom
-		//--------------------
-		_sashFormTopBottom = new SashForm(compositeContent, SWT.VERTICAL);
-
-		gridData = new GridData();
-		gridData.horizontalAlignment = GridData.FILL;
-		gridData.verticalAlignment = GridData.FILL;
-		gridData.grabExcessHorizontalSpace = true;
-		gridData.grabExcessVerticalSpace = true;
-		_sashFormTopBottom.setLayoutData(gridData);
-
-		// Tree: Installable
-		//------------------
-		_tableTreeItems = new TableTree(_sashFormTopBottom, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER | SWT.CHECK);
-
-		String[] columnTitles = { UpdateManagerStrings.getString("S_Component"), UpdateManagerStrings.getString("S_Installed"), UpdateManagerStrings.getString("S_Available"), UpdateManagerStrings.getString("S_Status"), UpdateManagerStrings.getString("S_Provider")};
-		int[] iColumnWeight = { 40, 15, 15, 15, 15 };
-		TableLayout layoutTable = new TableLayout();
-
-		for (int i = 0; i < columnTitles.length; i++) {
-			TableColumn tableColumn = new TableColumn(_tableTreeItems.getTable(), SWT.NONE);
-			tableColumn.setText(columnTitles[i]);
-			ColumnLayoutData cLayout = new ColumnWeightData(iColumnWeight[i], true);
-			layoutTable.addColumnData(cLayout);
-		}
-
-		_tableTreeItems.getTable().setLinesVisible(true);
-		_tableTreeItems.getTable().setHeaderVisible(true);
-		_tableTreeItems.getTable().setLayout(layoutTable);
-		_tableTreeItems.getTable().addMouseMoveListener(this);
-		_tableTreeItems.getTable().addMouseTrackListener(this);
-
-		_tableTreeItems.addSelectionListener(this);
-
-		gridData = new GridData();
-		gridData.horizontalAlignment = GridData.FILL;
-		gridData.verticalAlignment = GridData.FILL;
-		gridData.grabExcessHorizontalSpace = true;
-		gridData.grabExcessVerticalSpace = true;
-		_tableTreeItems.setLayoutData(gridData);
-
-		// Text: Description
-		//------------------
-		_textDescription = new Text(_sashFormTopBottom, SWT.WRAP | SWT.READ_ONLY | SWT.MULTI | SWT.BORDER);
-		gridData = new GridData();
-		gridData.horizontalAlignment = GridData.FILL;
-		gridData.verticalAlignment = GridData.FILL;
-		gridData.heightHint = 50;
-		_textDescription.setLayoutData(gridData);
-
-		_sashFormTopBottom.setWeights(new int[] { 80, 20 });
-
-		setControl(compositeContent);
-
-		setPageComplete(false);
-	}
-	/**
-	 * 
-	 */
-	public IUMRegistry getRegistryAt(String strLocation) {
-
-		IUMRegistry registry = (IUMRegistry) _hashRegistryCache.get(strLocation);
-
-		// Create new entry if not found
-		//------------------------------
-		if (registry == null) {
-			URL url = null;
-
-			try {
-				url = new URL(strLocation);
-			}
-			catch (MalformedURLException ex) {
-				return null;
-			}
-
-			registry = _wizard._updateManager.getRegistryAt(url);
-
-			if (registry != null) {
-				_hashRegistryCache.put(strLocation, registry);
-			}
-		}
-
-		return registry;
-	}
-	/**
-	 * 
-	 */
-	public UMWizardTreeItem[] getSelectedItems() {
-
-		UMWizardTreeItem[] items = null;
-
-		// Obtain all selected items
-		//--------------------------
-		TableTreeItem[] treeItemChildren = _tableTreeItems.getItems();
-
-		// Place them into an array
-		//-------------------------
-		Hashtable hashProducts = new Hashtable();
-		Hashtable hashComponents = new Hashtable();
-		Hashtable hashComponentEntries = new Hashtable();
-
-		for (int i = 0; i < treeItemChildren.length; ++i) {
-			getSelectedItemsRecursive(treeItemChildren[i], hashProducts, hashComponents, hashComponentEntries);
-		}
-
-		// Copy items to an array
-		//-----------------------
-		items = new UMWizardTreeItem[hashProducts.size() + hashComponents.size() + hashComponentEntries.size()];
-
-		// Products
-		//---------
-		Object[] objArray = hashProducts.values().toArray();
-		System.arraycopy(objArray, 0, items, 0, objArray.length);
-
-		// Components
-		//-----------
-		objArray = hashComponents.values().toArray();
-		System.arraycopy(objArray, 0, items, hashProducts.size(), objArray.length);
-
-		// Component Entries
-		//------------------
-		objArray = hashComponentEntries.values().toArray();
-		System.arraycopy(objArray, 0, items, hashProducts.size() + hashComponents.size(), objArray.length);
-
-		return items;
-	}
-	/**
-	 * 
-	 */
-	public void getSelectedItemsRecursive(TableTreeItem treeItem, Hashtable hashProducts, Hashtable hashComponents, Hashtable hashComponentEntries) {
-
-		// Obtain all selected items
-		//--------------------------
-		UMWizardTreeItem umTreeItem = null;
-
-		if (treeItem.getChecked() == true) {
-			umTreeItem = (UMWizardTreeItem) treeItem.getData();
-
-			if (umTreeItem != null) {
-				if (umTreeItem._iType == UpdateManagerConstants.TYPE_PRODUCT) {
-
-					// Remove duplicates by storing newer ones only
-					//---------------------------------------------
-					if (hashProducts.containsKey(umTreeItem._strId) == true) {
-						UMWizardTreeItem umTreeItemPrevious = (UMWizardTreeItem) hashProducts.get(umTreeItem._strId);
-						if (((IProductDescriptor) umTreeItem._descriptorAvailable).compare((IProductDescriptor) umTreeItemPrevious._descriptorAvailable) > 0) {
-							hashProducts.remove(umTreeItem._strId);
-							hashProducts.put(umTreeItem._strId, umTreeItem);
-						}
-					}
-					else {
-						hashProducts.put(umTreeItem._strId, umTreeItem);
-					}
-				}
-
-				else if (umTreeItem._iType == UpdateManagerConstants.TYPE_COMPONENT) {
-
-					// Remove duplicates by storing newer ones only
-					//---------------------------------------------
-					if (hashComponents.containsKey(umTreeItem._strId) == true) {
-						UMWizardTreeItem umTreeItemPrevious = (UMWizardTreeItem) hashComponents.get(umTreeItem._strId);
-						if (((IComponentDescriptor) umTreeItem._descriptorAvailable).compare((IComponentDescriptor) umTreeItemPrevious._descriptorAvailable) > 0) {
-							hashComponents.remove(umTreeItem._strId);
-							hashComponents.put(umTreeItem._strId, umTreeItem);
-						}
-					}
-					else {
-						hashComponents.put(umTreeItem._strId, umTreeItem);
-					}
-				}
-
-				else if (umTreeItem._iType == UpdateManagerConstants.TYPE_COMPONENT_ENTRY) {
-
-					// Add only if the parent product has not been selected
-					//-----------------------------------------------------
-					TableTreeItem treeItemParent = treeItem.getParentItem();
-					if (treeItemParent.getChecked() == false) {
-
-						// Remove duplicates by storing newer ones only
-						//---------------------------------------------
-						if (hashComponentEntries.containsKey(umTreeItem._strId) == true) {
-							UMWizardTreeItem umTreeItemPrevious = (UMWizardTreeItem) hashComponentEntries.get(umTreeItem._strId);
-							if (((IComponentEntryDescriptor) umTreeItem._descriptorEntry).compare((IComponentEntryDescriptor) umTreeItemPrevious._descriptorEntry) > 0) {
-								hashComponentEntries.remove(umTreeItem._strId);
-								hashComponentEntries.put(umTreeItem._strId, umTreeItem);
-							}
-						}
-						else {
-							hashComponentEntries.put(umTreeItem._strId, umTreeItem);
-						}
-					}
-				}
-			}
-		}
-
-		// Do child items
-		//---------------
-		TableTreeItem[] treeItemChildren = treeItem.getItems();
-
-		for (int i = 0; i < treeItemChildren.length; ++i) {
-			getSelectedItemsRecursive(treeItemChildren[i], hashProducts, hashComponents, hashComponentEntries);
-		}
-
-		return;
-	}
-	/**
-	 */
-	public String getURLDescription(String strURL) {
-
-		if (_treeSetLocations != null && _treeSetLocations.size() > 0) {
-			Iterator iter = _treeSetLocations.iterator();
-			URLNamePair pair = null;
-			while (iter.hasNext() == true) {
-				pair = (URLNamePair) iter.next();
-				if (pair._getURL().equals(strURL) == true) {
-					if (pair._getName() != null && pair._getName().length() > 0) {
-						return pair._getName();
-					}
-				}
-			}
-		}
-
-		return strURL;
-	}
-	/**
-	 * Obtains a list of registered component URLs from the local update registry.
-	 * Obtains a list of bookmarked URLs from the persistent data.
-	 * Creates a tree for all of the URLs.
-	 */
-	protected void initializeContent() {
-
-		if (_bRefreshRequired == false) {
-			return;
-		}
-
-		// Add all selected locations to a set
-		//------------------------------------
-		_treeSetLocations = new TreeSet(new UMWizardURLNamePairComparator());
-
-		// Obtain predefined locations strings from location page
-		//-------------------------------------------------------
-		UMWizardPageLocations pageLocations = (UMWizardPageLocations) _wizard.getPage("locations");
-
-		URLNamePair[] pairs = pageLocations.getSelectedPredefinedLocations();
-
-		for (int i = 0; i < pairs.length; ++i) {
-			_treeSetLocations.add(pairs[i]);
-		}
-
-		// Obtain additional locations strings from location page
-		//-------------------------------------------------------
-		pairs = pageLocations.getSelectedAdditionalLocations();
-
-		for (int i = 0; i < pairs.length; ++i) {
-			_treeSetLocations.add(pairs[i]);
-		}
-
-		// Obtain local registry in case there are installed versions
-		//-----------------------------------------------------------
-		final IUMRegistry registryLocal = _wizard._updateManager.getRegistryManager().getCurrentRegistry();
-
-		final Vector vectorRegistries = new Vector();
-		final Vector vectorURLsFailed = new Vector();
-
-		_tableTreeItems.setRedraw(false);
-
-		// Create an operation that read and create a registry for each location
-		//----------------------------------------------------------------------
-		IRunnableWithProgress operation = new IRunnableWithProgress() {
-			public void run(IProgressMonitor progressMonitor) throws InvocationTargetException, InterruptedException {
-
-				_progressMonitor = progressMonitor;
-
-				progressMonitor.beginTask(UpdateManagerStrings.getString("S_Reading") + ":", _treeSetLocations.size());
-
-				URLNamePair pair = null;
-				IUMRegistry registry = null;
-
-				Iterator iter = _treeSetLocations.iterator();
-
-				boolean bUrlOk = false;
-
-				while (iter.hasNext() == true) {
-
-					bUrlOk = false;
-
-					// Obtain the registry for the URL
-					// This will download the information
-					//-----------------------------------
-					pair = (URLNamePair) iter.next();
-
-					progressMonitor.subTask(pair._getName());
-
-					// Attempt to open the stream
-					//---------------------------
-					try {
-						URL url = new URL(pair._getURL());
-						url = UMEclipseTree.appendTrailingSlash(url);
-						Response response = URLHandler.open(url);
-						// we open the url to get authenticated.  response code not
-						// important at this point
-					/*	if (response.getResponseCode() == IStatusCodes.HTTP_OK) {
-							InputStream stream = response.getInputStream();
-
-							if (stream != null) {
-								stream.close();*/
-								bUrlOk = true;
-					//		}
-					//	}
-					}
-					catch (Exception ex) {
-					}
-
-					if (bUrlOk == true) { 
-						registry = getRegistryAt(pair._getURL());
-
-						// Add it to the list
-						//-------------------
-						if (registry != null)
-							vectorRegistries.add(registry);
-					}
-					else {
-						vectorURLsFailed.add(pair);
-					}
-
-					progressMonitor.worked(1);
-				}
-				progressMonitor.done();
-
-				_progressMonitor = null;
-			}
-		};
-
-		// Run the operation
-		//------------------
-		try {
-			_wizard.getContainer().run(true, true, operation);
-		}
-		catch (InterruptedException e) {
-		}
-		catch (InvocationTargetException e) {
-		}
-
-		// Create a new tree
-		//------------------
-		_treeSetItems = new TreeSet(new UMWizardTreeItemComparator());
-
-		// Create an operation that will fill the tree with information
-		// Location URL A
-		//   products
-		//     Product A
-		//     Product B
-		//   components
-		//     Component A
-		//     Component B
-		// Location URL B
-		// ...
-		//-------------------------------------------------------------
-		operation = new IRunnableWithProgress() {
-			public void run(IProgressMonitor progressMonitor) throws InvocationTargetException {
-
-				IUMRegistry registryRemote = null;
-
-				for (int i = 0; i < vectorRegistries.size(); ++i) {
-					registryRemote = (IUMRegistry) vectorRegistries.elementAt(i);
-					addLocationToTree(registryRemote, registryLocal, progressMonitor);
-				}
-			}
-		};
-
-		// Run the operation
-		//------------------
-		try {
-			_wizard.getContainer().run(true, true, operation);
-		}
-		catch (InterruptedException e) {
-			return;
-			//		System.out.println( "Interrupted" );
-		}
-		catch (InvocationTargetException e) {
-			//		System.out.println( "Invocation" );
-		}
-
-		_tableTreeItems.setRedraw(true);
-
-		// Create tree widget items for each update manager tree item
-		//-----------------------------------------------------------
-		connectToTree();
-
-		StringBuffer strbMessage = new StringBuffer();
-
-		// Determine whether there are any updatable items
-		//------------------------------------------------
-		if (_tableTreeItems.getItemCount() == 0)
-			strbMessage.append(UpdateManagerStrings.getString("S_No_installable_items_were_found") + "\n\n");
-
-		// Determine if any locations could not be accessed
-		//-------------------------------------------------
-		if (vectorURLsFailed.size() > 0) {
-			strbMessage.append(UpdateManagerStrings.getString("S_Unable_to_access_the_following_locations") + ":");
-			for (int i = 0; i < vectorURLsFailed.size(); ++i) {
-				strbMessage.append("\n   ");
-				strbMessage.append(((URLNamePair) vectorURLsFailed.elementAt(i))._getName());
-				strbMessage.append(" (");
-				strbMessage.append(((URLNamePair) vectorURLsFailed.elementAt(i))._getURL());
-				strbMessage.append(")");
-			}
-		}
-
-		if (strbMessage.length() > 0) {
-			MessageDialog.openInformation(getControl().getShell(), UpdateManagerStrings.getString("S_Information"), strbMessage.toString());
-		}
-
-		// Reset refresh flag
-		//-------------------
-		_bRefreshRequired = false;
-
-		return;
-	}
-	/**
-	 */
-	public int isInstallableComponent(TableTreeItem treeItemComponent) {
-
-		UMWizardTreeItem umTreeItem = (UMWizardTreeItem) treeItemComponent.getData();
-
-		// False if none available to install
-		//-----------------------------------
-		if (umTreeItem._descriptorAvailable == null) {
-			return -1;
-		}
-
-		// True if not yet installed
-		//--------------------------
-		if (umTreeItem._descriptorCurrent == null) {
-			return UpdateManagerConstants.OK_TO_INSTALL;
-		}
-
-		// True if installable
-		//--------------------
-		return ((IComponentDescriptor) umTreeItem._descriptorAvailable).isInstallable((IComponentDescriptor) umTreeItem._descriptorCurrent);
-	}
-	/**
-	 * @return int
-	 * @param treeItemComponent org.eclipse.swt.custom.TableTreeItem
-	 */
-	public int isInstallableComponentEntry(TableTreeItem treeItemComponentEntry) {
-
-		UMWizardTreeItem umTreeItem = (UMWizardTreeItem) treeItemComponentEntry.getData();
-
-		// False if none available to install
-		//-----------------------------------
-		if (umTreeItem._descriptorEntry == null) {
-			return -1;
-		}
-
-		// Is the product installable?
-		//----------------------------
-		TableTreeItem treeItemProduct = treeItemComponentEntry.getParentItem();
-
-		int iProductInstallable = isInstallableProduct(treeItemProduct);
-
-		// If the product is not installable, disable if mandatory component
-		//------------------------------------------------------------------
-		if (iProductInstallable != UpdateManagerConstants.OK_TO_INSTALL) {
-			if (umTreeItem._descriptorEntry.isOptionalForInstall() == false) {
-				return iProductInstallable;
-			}
-		}
-
-		return umTreeItem._descriptorEntry.isInstallable((IComponentDescriptor) umTreeItem._descriptorCurrent);
-	}
-	/**
-	 * @return int
-	 * @param treeItemComponent org.eclipse.swt.custom.TableTreeItem
-	 */
-	public int isInstallableProduct(TableTreeItem treeItemProduct) {
-
-		UMWizardTreeItem umTreeItem = (UMWizardTreeItem) treeItemProduct.getData();
-
-		// False if none available to install
-		//-----------------------------------
-		if (umTreeItem._descriptorAvailable == null) {
-			return -1;
-		}
-
-		// True if not yet installed
-		//--------------------------
-		else if (umTreeItem._descriptorCurrent == null) {
-			return UpdateManagerConstants.OK_TO_INSTALL;
-		}
-
-		// True if installable
-		//--------------------
-		return ((IProductDescriptor) umTreeItem._descriptorAvailable).isInstallable((IProductDescriptor) umTreeItem._descriptorCurrent);
-	}
-	/**
-	 * 
-	 */
-	public boolean isInstallableRecursive(TableTreeItem treeItem) {
-
-		boolean bInstallable = false;
-
-		UMWizardTreeItem umTreeItem = (UMWizardTreeItem) treeItem.getData();
-
-		// True if product or component is checked
-		//----------------------------------------
-		if (treeItem.getChecked() == true) {
-			if (umTreeItem._iType == UpdateManagerConstants.TYPE_COMPONENT || umTreeItem._iType == UpdateManagerConstants.TYPE_PRODUCT || umTreeItem._iType == UpdateManagerConstants.TYPE_COMPONENT_ENTRY) {
-				return true;
-			}
-		}
-
-		// Check all children
-		//-------------------
-		TableTreeItem[] treeItemChildren = treeItem.getItems();
-
-		for (int i = 0; i < treeItemChildren.length; ++i) {
-			if (isInstallableRecursive(treeItemChildren[i]) == true) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-	/**
-	 * Sent when the mouse pointer passes into the area of
-	 * the screen covered by a control.
-	 */
-	public void mouseEnter(org.eclipse.swt.events.MouseEvent e) {
-	}
-	/**
-	 * Sent when the mouse pointer passes out of the area of
-	 * the screen covered by a control.  Erases the description text area.
-	 */
-	public void mouseExit(MouseEvent e) {
-		if (_strDescription != _wizard._strEmpty) {
-			_textDescription.setText(_wizard._strEmpty);
-			_strDescription = _wizard._strEmpty;
-		}
-	}
-	/**
-	 * Sent when the mouse pointer hovers (that is, stops moving
-	 * for an (operating system specified) period of time) over
-	 * a control.
-	 */
-	public void mouseHover(MouseEvent e) {
-	}
-	/**
-	 * Determines which item the mouse is over.  Sets the text in the description text area to the description of the item.
-	 */
-	public void mouseMove(MouseEvent e) {
-
-		// Table item
-		//-----------
-		TableItem tableItem = _tableTreeItems.getTable().getItem(new Point(e.x, e.y));
-
-		// TableTree item
-		//---------------
-		if (tableItem != null) {
-
-			TableTreeItem tableTreeItem = (TableTreeItem) tableItem.getData();
-
-			// UMWizardTreeItem
-			//---------------------- 
-			if (tableTreeItem != null) {
-
-				UMWizardTreeItem item = (UMWizardTreeItem) tableTreeItem.getData();
-
-				// Description string
-				//-------------------
-				if (item != null) {
-					if (item._strDescription != null) {
-						if (_strDescription != item._strDescription) {
-							_textDescription.setText(item._strDescription);
-							_strDescription = item._strDescription;
-						}
-					}
-					else {
-						if (_strDescription != _wizard._strEmpty) {
-							_textDescription.setText(_wizard._strEmpty);
-							_strDescription = _wizard._strEmpty;
-						}
-					}
-				}
-				else if (_strDescription != _wizard._strEmpty) {
-					_textDescription.setText(_wizard._strEmpty);
-					_strDescription = _wizard._strEmpty;
-				}
-
-			}
-		}
-		else if (_strDescription != _wizard._strEmpty) {
-			_textDescription.setText(_wizard._strEmpty);
-			_strDescription = _wizard._strEmpty;
-		}
-	}
-	/**
-	 * @return boolean
-	 */
-	public boolean performCancel() {
-
-		if (_progressMonitor == null)
-			return true;
-
-		_progressMonitor.setCanceled(true);
-		return false;
-	}
-	/**
-	 */
-	protected boolean setCheckedComponent(TableTreeItem treeItemComponent) {
-
-		if (treeItemComponent.getChecked() == false) {
-			int iInstallable = isInstallableComponent(treeItemComponent);
-
-			setTreeItemChecked(treeItemComponent, iInstallable == 0);
-			return iInstallable == 0;
-		}
-
-		return true;
-	}
-	/**
-	 */
-	protected boolean setCheckedComponentEntry(TableTreeItem treeItemComponentEntry) {
-
-		if (treeItemComponentEntry.getChecked() == false) {
-
-			UMWizardTreeItem umTreeItem = (UMWizardTreeItem) treeItemComponentEntry.getData();
-
-			int iInstallable = isInstallableComponentEntry(treeItemComponentEntry);
-
-			if (iInstallable == 0) {
-
-				// Set checked the product and all of its mandatory components
-				//------------------------------------------------------------
-				TableTreeItem treeItemProduct = treeItemComponentEntry.getParentItem();
-
-				boolean bInstallableProduct = setCheckedProduct(treeItemProduct);
-
-				// If the product is not installable, disable if mandatory component
-				//------------------------------------------------------------------
-				if (bInstallableProduct == false) {
-
-					if (umTreeItem._descriptorEntry.isOptionalForInstall() == false) {
-						if (treeItemComponentEntry.getChecked() == true)
-							treeItemComponentEntry.setChecked(false);
-						return false;
-					}
-				}
-			}
-
-			setTreeItemChecked(treeItemComponentEntry, iInstallable == 0);
-			umTreeItem._descriptorEntry.isSelected(iInstallable == 0);
-
-			return iInstallable == 0;
-		}
-
-		return true;
-	}
-	/**
-	 * This routine assumes that the checkbox was unchecked and is currently checked
-	 */
-	protected boolean setCheckedProduct(TableTreeItem treeItemProduct) {
-
-		if (treeItemProduct.getChecked() == false) {
-
-			int iInstallable = isInstallableProduct(treeItemProduct);
-
-			setTreeItemChecked(treeItemProduct, iInstallable == 0);
-
-			if (iInstallable == 0) {
-
-				TableTreeItem[] treeItemChildren = treeItemProduct.getItems();
-
-				UMWizardTreeItem umTreeItem = null;
-
-				for (int i = 0; i < treeItemChildren.length; ++i) {
-					setCheckedComponentEntry(treeItemChildren[i]);
-				}
-			}
-
-			return iInstallable == 0;
-		}
-
-		return true;
-	}
-	/**
-	 * This routine assumes that the checkbox was unchecked and is currently checked.
-	 */
-	protected boolean setCheckedURL(TableTreeItem treeItemURL) {
-
-		TableTreeItem[] treeItemChildren = treeItemURL.getItems();
-		UMWizardTreeItem umTreeItem = null;
-
-		for (int i = 0; i < treeItemChildren.length; ++i) {
-			umTreeItem = (UMWizardTreeItem) treeItemChildren[i].getData();
-
-			if (umTreeItem._iType == UpdateManagerConstants.TYPE_PRODUCT) {
-				setCheckedProduct(treeItemChildren[i]);
-			}
-			else if (umTreeItem._iType == UpdateManagerConstants.TYPE_COMPONENT) {
-				setCheckedComponent(treeItemChildren[i]);
-			}
-		}
-
-		// Always checked
-		//---------------
-		if (treeItemURL.getChecked() == false)
-			treeItemURL.setChecked(true);
-
-		return true;
-	}
-	/**
-	 */
-	protected void setTreeItemChecked(TableTreeItem treeItem, boolean bChecked) {
-
-		if (bChecked == true) {
-			if (treeItem.getChecked() == false)
-				treeItem.setChecked(true);
-		}
-		else {
-			if (treeItem.getChecked() == true)
-				treeItem.setChecked(false);
-		}
-	}
-	/**
-	 */
-	public void setTreeItemChecked(boolean bChecked) {
-	}
-	/**
-	 */
-	public void setTreeItemUncheckedRecursiveBackward(TableTreeItem treeItem) {
-
-		if (treeItem.getChecked() != false) {
-			treeItem.setChecked(false);
-		}
-
-		TableTreeItem treeItemParent = treeItem.getParentItem();
-
-		if (treeItemParent != null) {
-			setTreeItemUncheckedRecursiveBackward(treeItemParent);
-		}
-	}
-	/**
-	 */
-	public void setTreeItemUncheckedRecursiveForward(TableTreeItem treeItem) {
-
-		if (treeItem.getChecked() != false) {
-
-			treeItem.setChecked(false);
-			/*
-					UMWizardTreeItem umTreeItem = (UMWizardTreeItem) treeItem.getData();
-			
-					if (umTreeItem._iType == UpdateManagerConstants.TYPE_COMPONENT_ENTRY) {
-			
-						if (umTreeItem._descriptorEntry.isOptionalForInstall() == true) {
-							umTreeItem._descriptorEntry.isSelected(false);
-						}
-					}
-			*/
-		}
-
-		TableTreeItem[] treeItemChildren = treeItem.getItems();
-
-		for (int i = 0; i < treeItemChildren.length; ++i) {
-			setTreeItemUncheckedRecursiveForward(treeItemChildren[i]);
-		}
-	}
-	/**
-	 * 
-	 */
-	public void setVisible(boolean bVisible) {
-
-		super.setVisible(bVisible);
-
-		if (bVisible == true) {
-			_sashFormTopBottom.layout();
-			initializeContent();
-
-		}
-	}
-	/**
-	 * Sent when default selection occurs in the control.
-	 */
-	public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
-	}
-	/**
-	 * Sent when selection occurs in the control.
-	 */
-	public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
-
-		// Checkbox: Show latest versions only
-		//------------------------------------
-		if (e.widget == _buttonShowLatestOnly) {
-			_bShowLatestOnly = _buttonShowLatestOnly.getSelection();
-			_bRefreshRequired = true;
-			initializeContent();
-		}
-
-		// TableTreeItem: Checkbox
-		//------------------------
-		else if (e.widget == _tableTreeItems && e.detail == SWT.CHECK) {
-
-			// Set page complete to false in case there are
-			// no selected items, or until selection is determined to be valid
-			//----------------------------------------------------------------
-			setPageComplete(false);
-
-			TableTreeItem treeItem = (TableTreeItem) e.item;
-
-			UMWizardTreeItem umTreeItem = (UMWizardTreeItem) treeItem.getData();
-
-			boolean bChecked = treeItem.getChecked();
-
-			// Check
-			//------
-			if (bChecked == true) {
-				// Temporarily uncheck
-				//--------------------
-				treeItem.setChecked(false);
-
-				if (umTreeItem._iType == UpdateManagerConstants.TYPE_URL)
-					setCheckedURL(treeItem);
-
-				else if (umTreeItem._iType == UpdateManagerConstants.TYPE_PRODUCT)
-					setCheckedProduct(treeItem);
-
-				else if (umTreeItem._iType == UpdateManagerConstants.TYPE_COMPONENT)
-					setCheckedComponent(treeItem);
-
-				else if (umTreeItem._iType == UpdateManagerConstants.TYPE_COMPONENT_ENTRY)
-					setCheckedComponentEntry(treeItem);
-			}
-
-			// Uncheck
-			//--------
-			else {
-				switch (umTreeItem._iType) {
-					case UpdateManagerConstants.TYPE_COMPONENT_ENTRY :
-						umTreeItem._descriptorEntry.isSelected(false);
-						if (umTreeItem._descriptorEntry.isOptionalForInstall() == false)
-							setTreeItemUncheckedRecursiveBackward(treeItem);
-						break;
-
-					default :
-						setTreeItemUncheckedRecursiveBackward(treeItem);
-						setTreeItemUncheckedRecursiveForward(treeItem);
-						break;
-				}
-			}
-
-			// Determine if page is complete
-			//------------------------------
-			boolean bPageComplete = false;
-
-			TableTreeItem[] treeItems = _tableTreeItems.getItems();
-
-			for (int i = 0; i < treeItems.length; ++i) {
-				if (isInstallableRecursive(treeItems[i]) == true) {
-					setPageComplete(true);
-					break;
-				}
-			}
-		}
-
-		return;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageInstalling.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageInstalling.java
deleted file mode 100644
index 7eb1bb8..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageInstalling.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageLaunchHistory.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageLaunchHistory.java
deleted file mode 100644
index 9589619..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageLaunchHistory.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageLaunchHistoryComplete.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageLaunchHistoryComplete.java
deleted file mode 100644
index 84a9d61..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageLaunchHistoryComplete.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageLocations.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageLocations.java
deleted file mode 100644
index d61bfbb..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageLocations.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLComplete.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLComplete.java
deleted file mode 100644
index 582c842..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLComplete.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLInstall.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLInstall.java
deleted file mode 100644
index 4057a14..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLInstall.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLInstallable.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLInstallable.java
deleted file mode 100644
index 0e87c19..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLInstallable.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLInstalling.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLInstalling.java
deleted file mode 100644
index ba49c34..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPageURLInstalling.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPersistentProperties.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPersistentProperties.java
deleted file mode 100644
index 9cd1af7..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardPersistentProperties.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentNew.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentNew.java
deleted file mode 100644
index cdf3a47..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentNew.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentRevert.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentRevert.java
deleted file mode 100644
index 908d541..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentRevert.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentURLInstall.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentURLInstall.java
deleted file mode 100644
index 5c08941..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentURLInstall.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentUpdate.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentUpdate.java
deleted file mode 100644
index f686d65..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardProductComponentUpdate.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardTreeItem.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardTreeItem.java
deleted file mode 100644
index 57ebf4a..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardTreeItem.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardTreeItemComparator.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardTreeItemComparator.java
deleted file mode 100644
index 96c1981..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardTreeItemComparator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.eclipse.update.internal.ui;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/**
- * 
- */
-import java.util.Comparator;
-public class UMWizardTreeItemComparator implements Comparator {
-	/**
-	 * UpdateManagerTreeItemComparator constructor comment.
-	 */
-	public UMWizardTreeItemComparator() {
-		super();
-	}
-	/**
-	 * Compares its two arguments for order.  Returns a negative integer,
-	 * zero, or a positive integer as the first argument is less than, equal
-	 * to, or greater than the second.<p>
-	 *
-	 * The implementor must ensure that <tt>sgn(compare(x, y)) ==
-	 * -sgn(compare(y, x))</tt> for all <tt>x</tt> and <tt>y</tt>.  (This
-	 * implies that <tt>compare(x, y)</tt> must throw an exception if and only
-	 * if <tt>compare(y, x)</tt> throws an exception.)<p>
-	 *
-	 * The implementor must also ensure that the relation is transitive:
-	 * <tt>((compare(x, y)&gt;0) &amp;&amp; (compare(y, z)&gt;0))</tt> implies
-	 * <tt>compare(x, z)&gt;0</tt>.<p>
-	 *
-	 * Finally, the implementer must ensure that <tt>compare(x, y)==0</tt>
-	 * implies that <tt>sgn(compare(x, z))==sgn(compare(y, z))</tt> for all
-	 * <tt>z</tt>.<p>
-	 *
-	 * It is generally the case, but <i>not</i> strictly required that 
-	 * <tt>(compare(x, y)==0) == (x.equals(y))</tt>.  Generally speaking,
-	 * any comparator that violates this condition should clearly indicate
-	 * this fact.  The recommended language is "Note: this comparator
-	 * imposes orderings that are inconsistent with equals."
-	 * 
-	 * @return a negative integer, zero, or a positive integer as the
-	 *         first argument is less than, equal to, or greater than the
-	 *         second. 
-	 * @throws ClassCastException if the arguments' types prevent them from
-	 *         being compared by this Comparator.
-	 */
-	public int compare(java.lang.Object o1, java.lang.Object o2) {
-
-		if (o1 instanceof UMWizardTreeItem && o2 instanceof UMWizardTreeItem) {
-			if (((UMWizardTreeItem) o1)._strName != null && ((UMWizardTreeItem) o2)._strName != null) {
-				return ((UMWizardTreeItem) o1)._strName.compareTo(((UMWizardTreeItem) o2)._strName);
-			}
-		}
-
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardURLNamePairComparator.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardURLNamePairComparator.java
deleted file mode 100644
index 59cd313..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UMWizardURLNamePairComparator.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UserValidationDialog.java b/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UserValidationDialog.java
deleted file mode 100644
index 8645286..0000000
--- a/update/org.eclipse.update/src/org/eclipse/update/internal/ui/UserValidationDialog.java
+++ /dev/null
Binary files differ
