diff --git a/ant/org.eclipse.ant.core/.classpath b/ant/org.eclipse.ant.core/.classpath
deleted file mode 100644
index eeb713f..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="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.core.resources"/>
-    <classpathentry kind="src" path="/org.apache.ant"/>
-    <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.core/.cvsignore b/ant/org.eclipse.ant.core/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/ant/org.eclipse.ant.core/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/.vcm_meta b/ant/org.eclipse.ant.core/.vcm_meta
deleted file mode 100644
index d9a7fb3..0000000
--- a/ant/org.eclipse.ant.core/.vcm_meta
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project-description>
-	<nature id="org.eclipse.jdt.core.javanature"/>
-	<reference project-name="org.apache.ant"/>
-	<reference project-name="org.apache.xerces"/>
-	<reference project-name="org.eclipse.core.boot"/>
-	<reference project-name="org.eclipse.core.resources"/>
-	<reference project-name="org.eclipse.core.runtime"/>
-	<builder name="org.eclipse.jdt.core.javabuilder">
-	</builder>
-</project-description>
diff --git a/ant/org.eclipse.ant.core/about.html b/ant/org.eclipse.ant.core/about.html
deleted file mode 100644
index 9df5d4f..0000000
--- a/ant/org.eclipse.ant.core/about.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<html>
-<head>
-<title>About</title>
-<style type="text/css">
-p, table, td, th { font-family: arial, helvetica, geneva; font-size: 10pt}
-pre { font-family: "Courier New", Courier, mono; font-size: 10pt}
-h2 { font-family: arial, helvetica, geneva; font-size: 18pt; font-weight: bold ; line-height: 14px}
-code { font-family: "Courier New", Courier, mono; font-size: 10pt}
-sup { font-family: arial,helvetica,geneva; font-size: 10px}
-h3 { font-family: arial, helvetica, geneva; font-size: 14pt; font-weight: bold}
-li { font-family: arial, helvetica, geneva; font-size: 10pt}
-h1 { font-family: arial, helvetica, geneva; font-size: 28px; font-weight: bold}
-body { font-family: arial, helvetica, geneva; font-size: 10pt; clip: rect(   ); margin-top: 5mm; margin-left: 3mm}
-</style>
-</head>
-<body lang="EN-US" link="blue" vlink="purple">
-<table border="0" cellspacing="5" cellpadding="2" width="100%" >
-  <tr> 
-    <td align="LEFT" valign="TOP" colspan="2" bgcolor="#0080C0"><b><font color="#FFFFFF">About This Content</font></b></td>
-  </tr>
-  <tr> 
-    <td> 
-<p>11th December, 2001</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in &quot;Content&quot;.  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-<a href="http://www.eclipse.org/legal/cpl-v05.html">Common Public License Version 0.5</a> &quot;CPL&quot;.  For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Third Party Content</h3>
-
-<p>The Content includes items that have been sourced from third parties as follows:</p>
-
-<p><b>Ant 1.4.1</b></p>
-<p>The plug-in is based on software developed by The Apache Software Foundation as part of the Jakarta project.
-The following classes contained in antsupport.jar and antsupportsrc.zip &quot;Ant Derivative Work&quot; are based on Ant code:</p>
-
-<ul>
-	<li>AntRunner</li>
-	<li>CommaPatternSet</li>
-	<li>EclipseAnt</li>
-	<li>EclipseCopy</li>
-	<li>EclipseProject</li>
-	<li>EclipseJavac</li>
-</ul>
-
-<p>The Ant Derivative Work is:</p>
-
-<blockquote>Copyright (c) 1999 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
-<a href="http://jakarta.apache.org/ant/manual/LICENSE">Apache Software License 1.1</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>
-</td></tr></table>
-</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 248b94b..0000000
--- a/ant/org.eclipse.ant.core/build.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-source.antsupport.jar=src/
-bin.includes=os/,plugin.xml,*.jar,plugin.properties,about.html
-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 ca9979d..0000000
--- a/ant/org.eclipse.ant.core/buildnotes_platform-ant.html
+++ /dev/null
@@ -1,165 +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] (Win98; I) [Netscape]">
-   <title>Eclipse Platform Release Notes Core</title>
-<!-- saved from url=(0079)http://home.ott.oti.com/hubba/drops/sdk/latest-javadoc/doc/buildnotes_core.html -->
-<!-- saved from url=(0079)http://home.ott.oti.com/hubba/drops/sdk/latest-javadoc/doc/buildnotes_core.html -->
-</head>
-<body>
-
-<h1>
-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/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 a82e148..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>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_antObjects.html">org.eclipse.ant.core.antObjects</a></li>
-
-<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>
-</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_antObjects.html b/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antObjects.html
deleted file mode 100644
index 2bec323..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antObjects.html
+++ /dev/null
@@ -1,49 +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>AntObjects</title>
-</head>
-<body link="#0000FF" vlink="#800080">
-
-<center>
-<h1>
-AntObjects</h1></center>
-<b><i>Identifier: </i></b>org.eclipse.ant.core.antObjects<p><b><i>Description: </i></b>Allows
-plug-ins to define arbitrary classes for use by the Ant infrastructure.&nbsp;
-For example, in the case of a Javac compiler adapter, the compiler adapter
-factory can be supplied, via a property setting, with the name of an adapter
-class to use.&nbsp; Unfortunately, it is unlikely that the Ant Core plug-in
-would have this class 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 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:&nbsp; </i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ELEMENT antObject EMPTY&gt;</tt>
-<br><tt>&nbsp;&nbsp; &lt;!ATTLIST antObject</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; ></tt>
-<ul>
-<li>
-<b>name -</b> name of the class to be defined</li>
-
-<li>
-<b>class</b> - the fully qualified name of a Java class</li>
-</ul>
-<p><i><b>Examples: </b> </i>The following is an example of an object
-declaration:
-<p><tt>&nbsp;&nbsp; &lt;extension point=&quot;org.eclipse.ant.core.antObject&quot;&gt;</tt><br>
-<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antObject name=&quot;com.example.Foo&quot;
-class=&quot;com.example.Foo&quot;/&gt;</tt><br>
-<tt>&nbsp;&nbsp; &lt;/extension&gt;</tt>
-<p><b><i>API Information</i>:</b><i> </i>The objects declared via this
-extension-point are accessible though the following API:<p><tt>&nbsp;&nbsp;
-org.eclipse.core.ant.AntPlugin.getObjectExtensions</tt>
-<p><b><i>Supplied Implementation:</i></b>  The platform itself does not supply
-any object extension.
-<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_antTasks.html b/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTasks.html
deleted file mode 100644
index c7b84e8..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTasks.html
+++ /dev/null
@@ -1,49 +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>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:&nbsp; </i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ELEMENT antTask EMPTY&gt;</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; ></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>
-</ul>
-<p><i><b>Examples: </b> </i>The following is an example of an object
-declaration:
-<p><tt>&nbsp;&nbsp; &lt;extension point=&quot;org.eclipse.ant.core.antTask&quot;&gt;</tt><br>
-<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antTask name=&quot;coolTask&quot;
-class=&quot;com.example.CoolTask&quot;/&gt;</tt><br>
-<tt>&nbsp;&nbsp; &lt;/extension&gt;</tt>
-<p><b><i>API Information</i>:</b><i> </i>The objects declared via this
-extension-point are accessible though the following API:<p><tt>&nbsp;&nbsp;
-org.eclipse.core.ant.AntPlugin.getTaskExtensions</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 143fee1..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTypes.html
+++ /dev/null
@@ -1,48 +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>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:&nbsp; </i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ELEMENT antType EMPTY&gt;</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; ></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>
-</ul>
-<p><i><b>Examples: </b> </i>The following is an example of an object
-declaration:
-<p><tt>&nbsp;&nbsp; &lt;extension point=&quot;org.eclipse.ant.core.antType&quot;&gt;</tt><br>
-<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antTask name=&quot;coolType&quot;
-class=&quot;com.example.CoolType&quot;/&gt;</tt><br>
-<tt>&nbsp;&nbsp; &lt;/extension&gt;</tt>
-<p><b><i>API Information</i>:</b><i> </i>The objects declared via this
-extension-point are accessible though the following API:<p><tt>&nbsp;&nbsp;
-org.eclipse.core.ant.AntPlugin.getTypeExtensions</tt>
-<p><b><i>Supplied Implementation:</i></b>  The platform itself supplies a number
-of datatypes including <tt>commaPatternSet</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/os/linux/libcore_2_0_5.so b/ant/org.eclipse.ant.core/os/linux/libcore_2_0_5.so
deleted file mode 100644
index f28dcf6..0000000
--- a/ant/org.eclipse.ant.core/os/linux/libcore_2_0_5.so
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/os/win32/core_2_0_5.dll b/ant/org.eclipse.ant.core/os/win32/core_2_0_5.dll
deleted file mode 100644
index 8395c07..0000000
--- a/ant/org.eclipse.ant.core/os/win32/core_2_0_5.dll
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/plugin.properties b/ant/org.eclipse.ant.core/plugin.properties
deleted file mode 100644
index c3fe97e..0000000
--- a/ant/org.eclipse.ant.core/plugin.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-pluginName = Ant Build Tool Core
-objectsName = Ant Object 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 1d1bd4b..0000000
--- a/ant/org.eclipse.ant.core/plugin.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.ant.core"
-   name="%pluginName"
-   version="2.2.1"
-   provider-name="Object Technology International, Inc."
-   class="org.eclipse.ant.core.AntPlugin">
-<requires>
-   <import plugin="org.apache.xerces"/>
-   <import plugin="org.eclipse.core.resources"/>
-   <import plugin="org.apache.ant" export="true"/>
-</requires>
-
-<runtime>
-   <library name="antsupport.jar">
-      <export name="*"/>
-   </library>
-</runtime>
-
-<extension-point id="antObjects" name="%objectsName"/>
-<extension-point id="antTasks" name="%tasksName"/>
-<extension-point id="antTypes" name="%typesName"/>
-
-<extension
-      id="antRunner"
-      point="org.eclipse.core.runtime.applications">
-   <application>
-      <run
-            class="org.eclipse.ant.core.AntRunner">
-      </run>
-   </application>
-</extension>
-<extension
-      point="org.eclipse.ant.core.antTypes">
-   <antType
-         name="commapatternset"
-         class="org.eclipse.ant.core.CommaPatternSet">
-   </antType>
-   <antType
-         name="command"
-         class="org.eclipse.ant.core.CommandDataType">
-   </antType>
-</extension>
-<extension
-      point="org.eclipse.ant.core.antTasks">
-   <antTask
-         name="incremental"
-         class="org.eclipse.ant.core.IncrementalBuild">
-   </antTask>
-   <antTask
-         name="eclipse.incremental"
-         class="org.eclipse.ant.core.IncrementalBuild">
-   </antTask>
-   <antTask
-         name="javac"
-         class="org.eclipse.ant.core.EclipseJavac">
-   </antTask>
-   <antTask
-         name="copy"
-         class="org.eclipse.ant.core.EclipseCopy">
-   </antTask>
-   <antTask
-         name="refreshLocal"
-         class="org.eclipse.ant.core.RefreshLocal">
-   </antTask>
-   <antTask
-         name="eclipse.refreshLocal"
-         class="org.eclipse.ant.core.RefreshLocal">
-   </antTask>
-   <antTask
-         name="eclipse.createProject"
-         class="org.eclipse.ant.core.CreateProject">
-   </antTask>
-   <antTask
-         name="eclipse.deleteProject"
-         class="org.eclipse.ant.core.DeleteProject">
-   </antTask>
-   <antTask
-         name="eclipse.moveProject"
-         class="org.eclipse.ant.core.MoveProject">
-   </antTask>
-   <antTask
-         name="eclipse.copyProject"
-         class="org.eclipse.ant.core.CopyProject">
-   </antTask>
-   <antTask
-         name="eclipse.convertPath"
-         class="org.eclipse.ant.core.ConvertPath">
-   </antTask>
-</extension>
-</plugin>
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntNotificationManager.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntNotificationManager.java
deleted file mode 100644
index 89ba5dd..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntNotificationManager.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.ant.core;
-
-import java.util.*;
-
-import org.apache.tools.ant.BuildEvent;
-
-/**
- * Proxy class for providing updates to several ant listeners.
- */
-public class AntNotificationManager implements IAntRunnerListener {
-	protected List listeners = Collections.synchronizedList(new ArrayList());
-
-/**
- * Registers an ant build listener for notification.
- */
-public void addListener(IAntRunnerListener listener) {
-	listeners.add(listener);
-}
-protected IAntRunnerListener[] getListeners() {
-	return (IAntRunnerListener[]) listeners.toArray(new IAntRunnerListener[listeners.size()]);
-}
-/**
- * @see IAntRunnerListener#messageLogged(String, int)
- */
-public void messageLogged(String message, int priority) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].messageLogged(message, priority);
-	}
-}
-/**
- * @see IAntRunnerListener#executeTargetStarted(BuildEvent)
- */
-public void executeTargetStarted(BuildEvent event) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].executeTargetStarted(event);
-	}
-}
-/**
- * @see IAntRunnerListener#executeTargetFinished(BuildEvent)
- */
-public void executeTargetFinished(BuildEvent event) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].executeTargetFinished(event);
-	}
-}
-/**
- * @see BuildListener#buildStarted(BuildEvent)
- */
-public void buildStarted(BuildEvent event) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].buildStarted(event);
-	}
-}
-/**
- * @see BuildListener#buildFinished(BuildEvent)
- */
-public void buildFinished(BuildEvent event) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].buildFinished(event);
-	}
-}
-/**
- * Removes an ant listener from the list.
- */
-public void removeListener(IAntRunnerListener listener) {
-	listeners.remove(listener);
-}
-/**
- * @see BuildListener#targetStarted(BuildEvent)
- */
-public void targetStarted(BuildEvent event) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].targetStarted(event);
-	}
-}
-/**
- * @see BuildListener#targetFinished(BuildEvent)
- */
-public void targetFinished(BuildEvent event) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].targetFinished(event);
-	}
-}
-/**
- * @see BuildListener#taskStarted(BuildEvent)
- */
-public void taskStarted(BuildEvent event) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].taskStarted(event);
-	}
-}
-/**
- * @see BuildListener#taskFinished(BuildEvent)
- */
-public void taskFinished(BuildEvent event) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].taskFinished(event);
-	}
-}
-/**
- * @see BuildListener#messageLogged(BuildEvent)
- */
-public void messageLogged(BuildEvent event) {
-	IAntRunnerListener[] list = getListeners();
-	for (int i = 0; i < list.length; i++) {
-		list[i].messageLogged(event);
-	}
-}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntPlugin.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntPlugin.java
deleted file mode 100644
index ed8daad..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntPlugin.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.runtime.*;
-import java.util.HashMap;
-import java.util.Map;
-import org.apache.tools.ant.Task;
-
-/**
- * The plug-in runtime class for the Ant Core plug-in.
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- */
-
-public final class AntPlugin extends Plugin {
-	/**
-	 * The single instance of this plug-in runtime class.
-	 */
-	private static AntPlugin plugin;
-
-	/**
-	 * Table of Ant tasks added through the antTasks extension point
-	 */
-	private Map taskExtensions;
-
-	/**
-	 * Table of Ant objects added through the antObjects extension point
-	 */
-	private Map objectExtensions;
-
-	/**
-	 * Table of Ant types added through the antTypes extension point
-	 */
-	private Map typeExtensions;
-	
-	/**
-	 * The notification manager for registering build listeners.
-	 */
-	private AntNotificationManager notificationManager = new AntNotificationManager();
-
-	/**
-	 * Unique identifier constant (value <code>"org.eclipse.ant.core"</code>)
-	 * for the Ant plug-in.
-	 */
-	public static final String PI_ANT= "org.eclipse.ant.core";
-
-	/**
-	 * Simple identifier constant (value <code>"antTasks"</code>)
-	 * for the Ant tasks extension point.
-	 */
-	public static final String PT_ANTTASKS = "antTasks";
-
-	/**
-	 * Simple identifier constant (value <code>"antTypes"</code>)
-	 * for the Ant types extension point.
-	 */
-	public static final String PT_ANTTYPES = "antTypes";
-
-	/**
-	 * Simple identifier constant (value <code>"antObjects"</code>)
-	 * for the Ant objects extension point.
-	 */
-	public static final String PT_ANTOBJECTS = "antObjects";
-
-	/**
-	 * Simple identifier constant (value <code>"class"</code>)
-	 * of a tag that appears in Ant extensions.
-	 */
-	public static final String CLASS = "class";
-
-	/**
-	 * Simple identifier constant (value <code>"class"</code>)
-	 * of a tag that appears in Ant extensions.
-	 */
-	public static final String NAME = "name";
-
-/** 
- * Constructs an instance of this plug-in runtime class.
- * <p>
- * Instances of plug-in runtime classes are automatically created 
- * by the platform in the course of plug-in activation.
- * <b>No client or plug-in should ever explicitly instantiate
- * a plug-in runtime class</b>.
- * </p>
- * 
- * @param pluginDescriptor the plug-in descriptor for the
- *   Resources plug-in
- */
-public AntPlugin(IPluginDescriptor pluginDescriptor) {
-	super(pluginDescriptor);
-	plugin = this;
-}
-/**
- * Gets the notificationManager.
- * @return Returns the AntNotificationManager
- */
-public AntNotificationManager getNotificationManager() {
-	return notificationManager;
-}
-/**
- * Returns the internal collection of object extensions.
- * 
- * @return the internal collection of object extensions
- */	
-public Map getObjectExtensions() {
-	return objectExtensions;
-}
-
-/**
- * Returns this plug-in.
- *
- * @return the single instance of this plug-in runtime class
- */
-public static AntPlugin getPlugin() {
-	return plugin;
-}
-
-/**
- * Returns the internal collection of task extensions.
- * 
- * @return the internal collection of task extensions
- */	
-public Map getTaskExtensions() {
-	return taskExtensions;
-}
-
-/**
- * Returns the internal collection of type extensions.
- * 
- * @return the internal collection of type extensions
- */	
-public Map getTypeExtensions() {
-	return typeExtensions;
-}
-
-/**
- * This implementation of the corresponding <code>Plugin</code> method
- * 
- * @exception CoreException if this method fails to shut down this plug-in
- */
-public void shutdown() throws CoreException {
-}
-
-/**
- * This implementation of the corresponding <code>Plugin</code> method
- * 
- * @exception CoreException if this plug-in did not start up properly
- */
-public void startup() throws CoreException {
-	IExtensionPoint extensionPoint = getDescriptor().getExtensionPoint(PT_ANTTASKS);
-	if (extensionPoint != null) {
-		IConfigurationElement[] extensions = extensionPoint.getConfigurationElements();
-		taskExtensions = new HashMap(extensions.length);
-		for (int i = 0; i < extensions.length; i++) {
-			String name = extensions[i].getAttribute(NAME);
-			taskExtensions.put(name, extensions[i]);
-		}
-	}
-	extensionPoint = getDescriptor().getExtensionPoint(PT_ANTTYPES);
-	if (extensionPoint != null) {
-		IConfigurationElement[] extensions = extensionPoint.getConfigurationElements();
-		typeExtensions = new HashMap(extensions.length);
-		for (int i = 0; i < extensions.length; i++) {
-			String name = extensions[i].getAttribute(NAME);
-			typeExtensions.put(name, extensions[i]);
-		}
-	}
-	extensionPoint = getDescriptor().getExtensionPoint(PT_ANTOBJECTS);
-	if (extensionPoint != null) {
-		IConfigurationElement[] extensions = extensionPoint.getConfigurationElements();
-		objectExtensions = new HashMap(extensions.length);
-		for (int i = 0; i < extensions.length; i++) {
-			String name = extensions[i].getAttribute(NAME);
-			objectExtensions.put(name, extensions[i]);
-		}
-	}
-}
-}
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 8ac9cdd..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
+++ /dev/null
@@ -1,720 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "The Jakarta Project", "Ant", and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-import org.eclipse.core.boot.IPlatformRunnable;
-import java.io.*;
-import java.util.*;
-import org.apache.tools.ant.*;
-
-/**
- * Eclipse application entry point into Ant. Derived from the original Ant Main class
- * to ensure that the functionality was equivalent when running in the platform.
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- */
-
-public class AntRunner implements IPlatformRunnable {
-
-	/** The default build file name */
-	public static final String DEFAULT_BUILD_FILENAME = "build.xml";
-
-	/** Our current message output status. Follows Project.MSG_XXX */
-	private int msgOutputLevel = Project.MSG_INFO;
-
-	/** File that we are using for configuration */
-	private File buildFile; /** null */
-
-	/** Stream that we are using for logging */
-	private PrintStream out = System.out;
-
-	/** Stream that we are using for logging error messages */
-	private PrintStream err = System.err;
-
-	/** The build targets */
-	private Vector targets = new Vector(5);
-
-	/** Set of properties that can be used by tasks */
-	private Properties definedProps = new Properties();
-
-	/** Names of classes to add as listeners to project */
-	private Vector listeners = new Vector(5);
-
-	/** Names of classes to add as listeners to project */
-	private IAntRunnerListener clientListener;
-
-	/**
-	 * The Ant logger class. There may be only one logger. It will have the
-	 * right to use the 'out' PrintStream. The class must implements the BuildLogger
-	 * interface
-	 */
-	private String loggerClassname = null;
-
-	/**
-	 * Indicates whether output to the log is to be unadorned.
-	 */
-	private boolean emacsMode = false;
-
-	/**
-	 * Indicates if this ant should be run.
-	 */
-	private boolean readyToRun = false;
-
-	/**
-	 * Indicates we should only parse and display the project help information
-	 */
-	private boolean projectHelp = false;
-	
-    private static String antVersion = null;
-    
-    /**
-	 * Adds a logger and all registered build listeners to an ant project.
-	 * 
-	 * @param project the project to add listeners to
-	 */
-protected void addBuildListeners(Project project) {
-	// If we have a client listener then use that.  Otherwise add the default listener
-	if (clientListener != null)
-		project.addBuildListener(clientListener);
-	else
-		project.addBuildListener(createLogger());
-	for (int i= 0; i < listeners.size(); i++) {
-		String className = (String) listeners.elementAt(i);
-		try {
-			BuildListener listener = (BuildListener) Class.forName(className).newInstance();
-			project.addBuildListener(listener);
-		} catch (Exception exc) {
-			throw new BuildException(Policy.bind("exception.cannotCreateListener",className), exc);
-		}
-	}
-}
-
-/**
- * Creates and returns the default build logger for logging build events to the ant log.
- * 
- * @return the default build logger for logging build events to the ant log
- */
-private BuildLogger createLogger() {
-	BuildLogger logger = null;
-	if (loggerClassname != null) {
-		try {
-			logger = (BuildLogger) (Class.forName(loggerClassname).newInstance());
-		} catch (ClassCastException e) {
-			System.err.println(Policy.bind("exception.loggerDoesNotImplementInterface",loggerClassname));
-			throw new RuntimeException();
-		} catch (Exception e) {
-			System.err.println(Policy.bind("exception.cannotCreateLogger",loggerClassname));
-			throw new RuntimeException();
-		}
-	} else {
-		logger = new DefaultLogger();
-	}
-	logger.setMessageOutputLevel(msgOutputLevel);
-	logger.setOutputPrintStream(out);
-	logger.setErrorPrintStream(err);
-	logger.setEmacsMode(emacsMode);
-	return logger;
-}
-
-/**
- * Search parent directories for the build file.
- *
- * <p>Takes the given target as a suffix to append to each
- * parent directory in seach of a build file.  Once the
- * root of the file-system has been reached an exception
- * is thrown.
- * </p>
- * @param suffix Suffix filename to look for in parents.
- * @return A handle to the build file
- * @exception BuildException Failed to locate a build file
- */
-private File findBuildFile(String start, String suffix) throws BuildException {
-	logMessage(Policy.bind("info.searchingFor",suffix), Project.MSG_INFO);
-	File parent = new File(new File(start).getAbsolutePath());
-	File file = new File(parent, suffix);
-	// check if the target file exists in the current directory
-	while (!file.exists()) {
-		// change to parent directory
-		parent = getParentFile(parent);
-		// if parent is null, then we are at the root of the fs,
-		// complain that we can't find the build file.
-		if (parent == null)
-			throw new BuildException(Policy.bind("exception.noBuildFile"));
-		// refresh our file handle
-		file = new File(parent, suffix);
-	}
-	return file;
-}
-
-/**
- * Returns the appropriate insertion index for a given string into a sorted collection.
- * 
- * @return the insertion index
- * @param names the initial collection of sorted strings
- * @param name the string whose insertion index into <code>names</code> is to be determined
- */
-private int findTargetPosition(Vector names, String name) {
-	int result = names.size();
-	for (int i = 0; i < names.size() && result == names.size(); i++) {
-		if (name.compareTo((String) names.elementAt(i)) < 0)
-			result = i;
-	}
-	return result;
-}
-
-/**
- * Helper to get the parent file for a given file.
- * <p>Added to simulate File.getParentFile() from JDK 1.2.</p>
- *
- * @param file File
- * @return Parent file or null if none
- */
-private File getParentFile(File file) {
-	String filename = file.getAbsolutePath();
-	file = new File(filename);
-	filename = file.getParent();
-	logMessage(Policy.bind("info.searchingIn",filename), Project.MSG_VERBOSE);
-	return (filename == null) ? null : new File(filename);
-}
-private void logMessage(String message, int severity) {
-	if (clientListener != null)
-		clientListener.messageLogged(message, severity);
-}
-/**
- * Command-line invocation method.
- * 
- * @param args the string arguments present on the command line
- */
-public static void main(String[] args) throws Exception {
-	new AntRunner().run(args);
-}
-
-/**
- * Equivalent to the standard command-line invocation method except
- * that command-line arguments are provided in the form of a string
- * instead of an array.
- * 
- * @param argString the string arguments present on the command line
- */
-public static void main(String argString) throws Exception {
-	main(tokenizeArgs(argString));
-}
-
-/**
- * Returns the output message level that has been requested by the
- * client.  This value will be one of <code>Project.MSG_ERR</code>,
- * <code>Project.MSG_WARN</code>, <code>Project.MSG_INFO</code>,
- * <code>Project.MSG_VERBOSE</code> or <code>Project.MSG_DEBUG</code>.
- * 
- * @see org.apache.tools.ant.Project
- * @return the output message level that has been requested by the client
- */
-public int getOutputMessageLevel() {
-	return msgOutputLevel;
-}
-
-/**
- * Prints the message of the Throwable if it is not null.
- * 
- * @param t the throwable whose message is to be displayed
- */
-private void printMessage(Throwable t) {
-	String message= t.getMessage();
-	if (message != null)
-		System.err.println(message);
-}
-
-/**
- * Logs a message with the client that lists the target names and optional descriptions
- * 
- * @param names the targets names
- * @param descriptions the corresponding descriptions
- * @param heading the message heading
- * @param maxlen maximum length that can be allocated for a name
- */
-private void printTargets(Vector names, Vector descriptions, String heading, int maxlen) {
-	// now, start printing the targets and their descriptions
-	String lSep = System.getProperty("line.separator");
-	// got a bit annoyed that I couldn't find a pad function
-	String spaces = "    ";
-	while (spaces.length() < maxlen) {
-		spaces += spaces;
-	}
-	StringBuffer msg = new StringBuffer();
-	msg.append(heading + lSep + lSep);
-	for (int i= 0; i < names.size(); i++) {
-		msg.append(" ");
-		msg.append(names.elementAt(i));
-		if (descriptions != null) {
-			msg.append(spaces.substring(0, maxlen - ((String) names.elementAt(i)).length() + 2));
-			msg.append(descriptions.elementAt(i));
-		}
-		msg.append(lSep);
-	}
-	logMessage(msg.toString(), Project.MSG_INFO);
-}
-
-/**
- * Logs a message with the client that lists the targets
- * in a project
- * 
- * @param project the project to list targets from
- */
-private void printTargets(Project project) {
-    // find the target with the longest name
-    int maxLength = 0;
-    Enumeration ptargets = project.getTargets().elements();
-    String targetName;
-    String targetDescription;
-    Target currentTarget;
-    // split the targets in top-level and sub-targets depending
-    // on the presence of a description
-    Vector topNames = new Vector();
-    Vector topDescriptions = new Vector();
-    Vector subNames = new Vector();
-
-    while (ptargets.hasMoreElements()) {
-        currentTarget = (Target)ptargets.nextElement();
-        targetName = currentTarget.getName();
-        targetDescription = currentTarget.getDescription();
-        // maintain a sorted list of targets
-        if (targetDescription == null) {
-            int pos = findTargetPosition(subNames, targetName);
-            subNames.insertElementAt(targetName, pos);
-        } else {
-            int pos = findTargetPosition(topNames, targetName);
-            topNames.insertElementAt(targetName, pos);
-            topDescriptions.insertElementAt(targetDescription, pos);
-            if (targetName.length() > maxLength) {
-                maxLength = targetName.length();
-            }
-        }
-    }
-
-    String defaultTarget = project.getDefaultTarget();
-    if (defaultTarget != null && !"".equals(defaultTarget)) { // shouldn't need to check but...
-        Vector defaultName = new Vector();
-        Vector defaultDesc = null;
-        defaultName.addElement(defaultTarget);
-
-        int indexOfDefDesc = topNames.indexOf(defaultTarget);
-        if (indexOfDefDesc >= 0) {
-            defaultDesc = new Vector();
-            defaultDesc.addElement(topDescriptions.elementAt(indexOfDefDesc));
-        }
-        printTargets(defaultName, defaultDesc, Policy.bind("label.defaultTarget"), maxLength);
-
-    }
-
-    printTargets(topNames, topDescriptions, Policy.bind("label.mainTargets"), maxLength);
-    printTargets(subNames, null, Policy.bind("label.subTargets"), 0);
-}
-
-/**
- * Logs a message with the client outlining the usage of <b>Ant</b>.
- */
-private void printUsage() {
-	String lSep = System.getProperty("line.separator");
-	StringBuffer msg = new StringBuffer();
-	msg.append("ant [" + Policy.bind("usage.options") + "] [" 
-				+ Policy.bind("usage.target") + " ["
-				+ Policy.bind("usage.target") + "2 ["
-				+ Policy.bind("usage.target") + "3] ...]]" + lSep);
-	msg.append(Policy.bind("usage.Options") + ": " + lSep);
-	msg.append("  -help                  " + Policy.bind("usage.printMessage") + lSep);
-	msg.append("  -projecthelp           " + Policy.bind("usage.projectHelp") + lSep);
-	msg.append("  -version               " + Policy.bind("usage.versionInfo") + lSep);
-	msg.append("  -quiet                 " + Policy.bind("usage.beQuiet") + lSep);
-	msg.append("  -verbose               " + Policy.bind("usage.beVerbose") + lSep);
-	msg.append("  -debug                 " + Policy.bind("usage.printDebugInfo") + lSep);
-	msg.append("  -emacs                 " + Policy.bind("usage.emacsLog") + lSep);
-	msg.append("  -logfile <file>        " + Policy.bind("usage.useFile") + lSep);
-	msg.append("  -logger <classname>    " + Policy.bind("usage.logClass") + lSep);
-	msg.append("  -listener <classname>  " + Policy.bind("usage.listenerClass") + lSep);
-	msg.append("  -buildfile <file>      " + Policy.bind("usage.fileToBuild") + lSep);
-	msg.append("  -D<property>=<value>   " + Policy.bind("usage.propertiesValues") + lSep);
-	msg.append("  -find <file>           " + Policy.bind("usage.findFileToBuild") + lSep);
-	
-	logMessage(msg.toString(), Project.MSG_INFO);
-}
-
-/**
- * Logs a message with the client indicating the version of <b>Ant</b> that this class
- * fronts.
- */
-private void printVersion() {
- 	logMessage(getAntVersion(), Project.MSG_INFO);
-}
-
-public synchronized static String getAntVersion() throws BuildException {
-    if (antVersion == null) {
-        try {
-            Properties props = new Properties();
-            InputStream in =
-                Main.class.getResourceAsStream("/org/apache/tools/ant/version.txt");
-            props.load(in);
-            in.close();
-            
-            String lSep = System.getProperty("line.separator");
-            StringBuffer msg = new StringBuffer();
-            msg.append(Policy.bind("usage.antVersion"));
-            msg.append(props.getProperty("VERSION") + " ");
-            msg.append(Policy.bind("usage.compiledOn"));
-            msg.append(props.getProperty("DATE"));
-            antVersion = msg.toString();
-        } catch (IOException ioe) {
-            throw new BuildException(Policy.bind("exception.cannotLoadVersionInfo", ioe.getMessage()));
-        } catch (NullPointerException npe) {
-            throw new BuildException(Policy.bind("exception.cannotLoadVersionInfo", ""));
-        }
-    }
-    return antVersion;
-}
-
-/**
- * Processes the command line passed in by the client.
- * 
- * @execption BuildException occurs if the build file is not properly specified
- * @param args the collection of arguments
- */
-protected void processCommandLine(String[] args) throws BuildException {
-	String searchForThis = null;
-	// cycle through given args
-	boolean canBeTarget = false;
-	for (int i= 0; i < args.length; i++) {
-		String arg = args[i];
-		if (arg.equals("-help")) {
-			printUsage();
-			return;
-		} 
-		if (arg.equals("-version")) {
-			printVersion();
-			return;
-		}
-		if (arg.equals("-quiet") || arg.equals("-q")) {
-			msgOutputLevel = Project.MSG_WARN;
-			canBeTarget = false;
-		} else if (arg.equals("-verbose") || arg.equals("-v")) {
-			printVersion();
-			msgOutputLevel = Project.MSG_VERBOSE;
-			canBeTarget = false;
-		} else if (arg.equals("-debug")) {
-			printVersion();
-			msgOutputLevel = Project.MSG_DEBUG;
-			canBeTarget = false;
-		} else if (arg.equals("-logfile") || arg.equals("-l")) {
-			try {
-				File logFile = new File(args[i + 1]);
-				i++;
-				out= new PrintStream(new FileOutputStream(logFile));
-				err = out;
-				System.setOut(out);
-				System.setErr(out);
-				canBeTarget = false;
-			} catch (IOException ioe) {
-				logMessage(Policy.bind("exception.cannotWriteToLog"), Project.MSG_INFO);
-				return;
-			} catch (ArrayIndexOutOfBoundsException aioobe) {
-				logMessage(Policy.bind("exception.missingLogFile"), Project.MSG_INFO);
-				return;
-			}
-		} else if (arg.equals("-buildfile") || arg.equals("-file") || arg.equals("-f")) {
-			try {
-				buildFile = new File(args[i + 1]);
-				i++;
-				canBeTarget = true;
-			} catch (ArrayIndexOutOfBoundsException aioobe) {
-				logMessage(Policy.bind("exception.missingBuildFile"), Project.MSG_INFO);
-				return;
-			}
-		} else if (arg.equals("-listener")) {
-			try {
-				listeners.addElement(args[i + 1]);
-				i++;
-				canBeTarget = false;
-			} catch (ArrayIndexOutOfBoundsException aioobe) {
-				logMessage(Policy.bind("exception.missingClassName"), Project.MSG_INFO);
-				return;
-			}
-		} else if (arg.startsWith("-D")) {
-
-			/* Interestingly enough, we get to here when a user
-			 * uses -Dname=value. However, in some cases, the JDK
-			 * goes ahead * and parses this out to args
-			 *   {"-Dname", "value"}
-			 * so instead of parsing on "=", we just make the "-D"
-			 * characters go away and skip one argument forward.
-			 *
-			 * I don't know how to predict when the JDK is going
-			 * to help or not, so we simply look for the equals sign.
-			 */
-
-			String name = arg.substring(2, arg.length());
-			String value = null;
-			int posEq = name.indexOf("=");
-			if (posEq > 0) {
-				value = name.substring(posEq + 1);
-				name = name.substring(0, posEq);
-			} else if (i < args.length - 1)
-				value = args[++i];
-
-			definedProps.put(name, value);
-			canBeTarget = false;
-		} else if (arg.equals("-logger")) {
-			if (loggerClassname != null) {
-				logMessage(Policy.bind("exception.multipleLoggers"), Project.MSG_INFO);
-				return;
-			}
-			loggerClassname = args[++i];
-			canBeTarget = false;
-		} else if (arg.equals("-emacs")) {
-			emacsMode = true;
-			canBeTarget = false;
-		} else if (arg.equals("-projecthelp")) {
-			projectHelp = true; // set the flag to display the targets and quit
-			canBeTarget = false;
-		} else if (arg.equals("-find")) {
-			// eat up next arg if present, default to build.xml
-			if (i < args.length - 1)
-				searchForThis = args[++i];
-			else
-				searchForThis = DEFAULT_BUILD_FILENAME;
-			canBeTarget = false;
-		} else if (arg.startsWith("-")) {
-			// we don't have any more args to recognize!
-			logMessage(Policy.bind("exception.unknownArgument",arg), Project.MSG_INFO);
-//			printUsage();
-//			return;
-			canBeTarget = false;
-		} else {
-			if (canBeTarget)
-				targets.addElement(arg);
-		}
-	}
-	// if buildFile was not specified on the command line,
-	if (buildFile == null) {
-		// but -find then search for it
-		if (searchForThis != null)
-			buildFile = findBuildFile(".", searchForThis);
-		else
-			buildFile = new File(DEFAULT_BUILD_FILENAME);
-	}
-	// make sure buildfile exists
-	if (!buildFile.getAbsoluteFile().exists()) {
-		logMessage(Policy.bind("exception.buildFileNotFound",buildFile.toString()), Project.MSG_INFO);
-		throw new BuildException(Policy.bind("error.buildFailed"));
-	}
-	// make sure it's not a directory (this falls into the ultra
-	// paranoid lets check everything catagory
-	if (buildFile.isDirectory()) {
-		logMessage(Policy.bind("exception.buildFileIsDirectory",buildFile.toString()), Project.MSG_INFO);
-		throw new BuildException(Policy.bind("error.buildFailed"));
-	}
-	readyToRun= true;
-}
-
-/**
- * Invokes the building of a project object and executes a build using either a given
- * target or the default target.
- *
- * @param argArray the command line arguments
- * @exception execution exceptions
- */
-public Object run(Object argArray) throws Exception {
-	String[] args = (String[]) argArray;
-	processCommandLine(args);
-	try {
-		runBuild(null);
-	} catch (BuildException e) {
-		if (err != System.err)
-			printMessage(e);
-		throw e;
-	} catch (ThreadDeath e) {
-		throw e;
-	} catch (Throwable e) {
-		printMessage(e);
-	}
-	return null;
-}
-
-/**
- * Invokes the building of a project object and executes a build using either a given
- * target or the default target.
- *
- * @param argArray the command line arguments
- * @param listener the client listener
- * @exception execution exceptions
- */
-public Object run(Object argArray, IAntRunnerListener listener) throws Exception {
-	clientListener = listener;
-	return run(argArray);
-}
-
-/**
- * Executes the build.
- * 
- * @exception BuildException thrown if there is a problem during building.
- */
-private void runBuild(ClassLoader coreLoader) throws BuildException {
-
-    if (!readyToRun) {
-        return;
-    }
-
-	logMessage(Policy.bind("label.buildFile",buildFile.toString()),Project.MSG_INFO);
-
-    final EclipseProject project = new EclipseProject();
-    project.setCoreLoader(coreLoader);
-    
-    Throwable error = null;
-
-    try {
-        addBuildListeners(project);
-
-        PrintStream err = System.err;
-        PrintStream out = System.out;
-        SecurityManager oldsm = System.getSecurityManager();
-
-        try {
-            System.setOut(new PrintStream(new DemuxOutputStream(project, false)));
-            System.setErr(new PrintStream(new DemuxOutputStream(project, true)));
-            project.fireBuildStarted();
-            project.init();
-            project.setUserProperty("ant.version", getAntVersion());
-
-            // set user-define properties
-            Enumeration e = definedProps.keys();
-            while (e.hasMoreElements()) {
-                String arg = (String)e.nextElement();
-                String value = (String)definedProps.get(arg);
-                project.setUserProperty(arg, value);
-            }
-            
-            project.setUserProperty("ant.file" , buildFile.getAbsolutePath() );
-            
-            // first use the ProjectHelper to create the project object
-            // from the given build file.
-            try {
-                Class.forName("javax.xml.parsers.SAXParserFactory");
-                ProjectHelper.configureProject(project, buildFile);
-            } catch (NoClassDefFoundError ncdfe) {
-                throw new BuildException(Policy.bind("exception.noParser"), ncdfe);
-            } catch (ClassNotFoundException cnfe) {
-                throw new BuildException(Policy.bind("exception.noParser"), cnfe);
-            } catch (NullPointerException npe) {
-                throw new BuildException(Policy.bind("exception.noParser"), npe);
-            }
-            
-            // make sure that we have a target to execute
-            if (targets.size() == 0) {
-                targets.addElement(project.getDefaultTarget());
-            }
-            
-            if (!projectHelp) {
-                project.executeTargets(targets);
-            }
-        }
-        finally {
-            System.setOut(out);
-            System.setErr(err);
-        }
-        if (projectHelp) {
-            printDescription(project);
-            printTargets(project);
-        }
-    }
-    catch(RuntimeException exc) {
-        error = exc;
-        throw exc;
-    }
-    catch(Error err) {
-        error = err;
-        throw err;
-    }
-    finally {
-        project.fireBuildFinished(error);
-    }
-}
-/**
- * Print the project description, if any
- */
-private static void printDescription(Project project) {
-   if (project.getDescription() != null) {
-      System.out.println(project.getDescription());
-   }
-}
-
-/**
- * Returns a tokenized version of a string.
- * 
- * @return a tokenized version of a string
- * @param argString the original argument string
- */
-public static String[] tokenizeArgs(String argString) throws Exception {
-	Vector list = new Vector(5);
-	for (StringTokenizer tokens = new StringTokenizer(argString, " "); tokens.hasMoreElements();)
-		list.addElement((String) tokens.nextElement());
-	return (String[]) list.toArray(new String[list.size()]);
-}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CommaPatternSet.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CommaPatternSet.java
deleted file mode 100644
index 87d08cc..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CommaPatternSet.java
+++ /dev/null
@@ -1,429 +0,0 @@
-package org.eclipse.ant.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 2000 The Apache Software Foundation.  All rights 
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:  
- *       "This product includes software developed by the 
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "The Jakarta Project", "Ant", and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written 
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.ProjectHelper;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.types.PatternSet;
-import org.apache.tools.ant.types.Reference;
-
-import java.io.*;
-import java.util.Enumeration;
-import java.util.Stack;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-/**
- * Named collection of include/exclude tags.  This is largely a copy of the original
- * Ant PatternSet data type.  Unfortunately, that datatype used both the comma and
- * the space character as a token to delimit pattern entries.  This makes it virtually
- * impossible to use for files which have spaces in their names.  The <code>CommaPatternSet</code>
- * is not particularly usable but it is easier than trying to deal with the original.
- * <p>
- * A complete copy was done to ensure that the behavior is correct.  Otherwise there is a
- * risk of getting some values from the private slots of the superclass and some from this
- * class.  Unfortunately, there is no way to link this support into <code>FileSet</code>.
- * </p>
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- * @see PatternSet
- */
-
-public class CommaPatternSet extends PatternSet {
-    private Vector includeList = new Vector();
-    private Vector excludeList = new Vector();
-    private Vector includesFileList = new Vector();
-    private Vector excludesFileList = new Vector();
-
-    public CommaPatternSet() {
-        super();
-    }
-
-	/**
-	 * Makes the receiver effectively a reference to another <code>PatternSet</code>
-	 * instance.
-	 *
-	 * <p>Once this element becomes a reference its internal attributes and nested elements
-	 * must not be modified.</p>
-	 * 
-	 * @param r the other <code>PatternSet</code>
-	 * @exception BuildException
-	 */
-    public void setRefid(Reference r) throws BuildException {
-        if (!includeList.isEmpty() || !excludeList.isEmpty()) {
-            throw tooManyAttributes();
-        }
-        super.setRefid(r);
-    }
-
-	/**
-	 * Adds a name entry to the receiver's include list.
-	 * 
-	 * @return the new name entry
-	 */
-    public NameEntry createInclude() {
-        if (isReference()) {
-            throw noChildrenAllowed();
-        }
-        return addPatternToList(includeList);
-    }
-
-    /**
-     * add a name entry on the include files list
-     */
-    public NameEntry createIncludesFile() {
-        if (isReference()) {
-            throw noChildrenAllowed();
-        }
-        return addPatternToList(includesFileList);
-    }
-    
-	/**
-	 * Adds a name entry to the receiver's exclude list.
-	 * 
-	 * @return the new name entry
-	 */
-    public NameEntry createExclude() {
-        if (isReference()) {
-            throw noChildrenAllowed();
-        }
-        return addPatternToList(excludeList);
-    }
-    
-    /**
-     * add a name entry on the exclude files list
-     */
-    public NameEntry createExcludesFile() {
-        if (isReference()) {
-            throw noChildrenAllowed();
-        }
-        return addPatternToList(excludesFileList);
-    }
-
-	/**
-	 * Sets the receiver's set of include patterns. Patterns can only be separated
-	 * by a comma and by not a space (unlike PatternSet).
-	 *
-	 * @param includes the include patterns
-	 */
-    public void setIncludes(String includes) {
-        if (isReference()) {
-            throw tooManyAttributes();
-        }
-        if (includes != null && includes.length() > 0) {
-            StringTokenizer tok = new StringTokenizer(includes, ",", false);
-            while (tok.hasMoreTokens()) {
-                createInclude().setName(tok.nextToken());
-            }
-        }
-    }
-
-	/**
-	 * Sets the receiver's set of exclude patterns. Patterns can only be separated
-	 * by a comma and by not a space (unlike PatternSet).
-	 *
-	 * @param excludes the exclude patterns
-	 */
-    public void setExcludes(String excludes) {
-        if (isReference()) {
-            throw tooManyAttributes();
-        }
-        if (excludes != null && excludes.length() > 0) {
-            StringTokenizer tok = new StringTokenizer(excludes, ",", false);
-            while (tok.hasMoreTokens()) {
-                createExclude().setName(tok.nextToken());
-            }
-        }
-    }
-
-	/**
-	 * Adds a name entry to the given list.
-	 * 
-	 * @return the new name entry
-	 * @param list the target list
-	 */
-    private NameEntry addPatternToList(Vector list) {
-        NameEntry result = new NameEntry();
-        list.addElement(result);
-        return result;
-    }
-
-	/**
-	 * Sets the name of the file containing the includes patterns.
-	 *
-	 * @param incl the file to retrieve the include patterns from
-	 */
-     public void setIncludesfile(File includesFile) throws BuildException {
-         if (isReference()) {
-             throw tooManyAttributes();
-         }
-         createIncludesFile().setName(includesFile.getAbsolutePath());
-     }
-
-	/**
-	 * Sets the name of the file containing the excludes patterns.
-	 *
-	 * @param excl the file to retrieve the exclude patterns from
-	 */
-     public void setExcludesfile(File excludesFile) throws BuildException {
-         if (isReference()) {
-             throw tooManyAttributes();
-         }
-         createExcludesFile().setName(excludesFile.getAbsolutePath());
-     }
-    
-	/**
-	 * Reads path matching patterns from a file and adds them to the
-	 * includes or excludes list as appropriate.
-	 * 
-	 * @param patternfile the source file
-	 * @param patternlist the list of patterns
-	 * @param p the target project
-	 * @exception BuildException thrown if the file cannot be read
-	 */
-    private void readPatterns(File patternfile, Vector patternlist, Project p)
-        throws BuildException {
-        
-        try {
-            // Get a FileReader
-            BufferedReader patternReader = 
-                new BufferedReader(new FileReader(patternfile)); 
-        
-            // Create one NameEntry in the appropriate pattern list for each 
-            // line in the file.
-            String line = patternReader.readLine();
-            while (line != null) {
-                if (line.length() > 0) {
-                    line = ProjectHelper.replaceProperties(p, line,
-                                                           p.getProperties());
-                    addPatternToList(patternlist).setName(line);
-                }
-                line = patternReader.readLine();
-            }
-        } catch(IOException ioe)  {
-			throw new BuildException(Policy.bind("exception.patternFile",patternfile.toString()),ioe);
-        }
-    }
-
-	/**
-	 * Adds the patterns of another <code>PatternSet</code> to the receiver.
-	 * 
-	 * @param other the other <code>PatternSet</code>
-	 * @param p the target project
-	 */
-    public void append(PatternSet other, Project p) {
-        if (isReference()) {
-            throw new BuildException(Policy.bind("exception.cannotAppendToReference"));
-        }
-
-        String[] incl = other.getIncludePatterns(p);
-        if (incl != null) {
-            for (int i=0; i<incl.length; i++) {
-                createInclude().setName(incl[i]);
-            }
-        }
-        
-        String[] excl = other.getExcludePatterns(p);
-        if (excl != null) {
-            for (int i=0; i<excl.length; i++) {
-                createExclude().setName(excl[i]);
-            }
-        }
-    }
-
-	/**
-	 * Returns the receiver's filtered include patterns.
-	 * 
-	 * @return the receiver's filtered include patterns.
-	 * @param the target project
-	 */
-    public String[] getIncludePatterns(Project p) {
-        if (isReference()) {
-            return getRef(p).getIncludePatterns(p);
-        } else {
-            readFiles(p);
-            return makeArray(includeList, p);
-        }
-    }
-
-	/**
-	 * Returns the receiver's filtered exclude patterns.
-	 * 
-	 * @return the receiver's filtered exclude patterns.
-	 * @param the target project
-	 */
-    public String[] getExcludePatterns(Project p) {
-        if (isReference()) {
-            return getRef(p).getExcludePatterns(p);
-        } else {
-            readFiles(p);
-            return makeArray(excludeList, p);
-        }
-    }
-
-	/**
-	 * Returns a boolean indicating whether this instance has any patterns.
-	 * 
-	 * @return a boolean indicating whether this instance has any patterns
-	 */
-    boolean hasPatterns() {
-        return includesFileList.size() > 0 || excludesFileList.size() > 0 
-            || includeList.size() > 0 || excludeList.size() > 0;
-    }
-
-	/**
-	 * Performs a check for circular references and returns the
-	 * referenced <code>PatternSet</code>.
-	 * 
-	 * @return the referenced <code>PatternSet</code>
-	 * @param the target project
-	 */
-    private PatternSet getRef(Project p) {
-        if (!checked) {
-            Stack stk = new Stack();
-            stk.push(this);
-            dieOnCircularReference(stk, p);
-        }
-        
-        Object o = ref.getReferencedObject(p);
-        if (!(o instanceof PatternSet)) {
-			throw new BuildException(Policy.bind("exception.notAPatternSet",ref.getRefId()));
-    	} else {
-            return (PatternSet) o;
-        }
-    }
-
-	/**
-	 * Returns a given vector of name entries as an array of strings.
-	 * 
-	 * @return a string array of name entries
-	 * @param list the original vector of name entries
-	 * @param p the target project
-	 */
-    private String[] makeArray(Vector list, Project p) {
-        if (list.size() == 0) return null;
-
-        Vector tmpNames = new Vector();
-        for (Enumeration e = list.elements() ; e.hasMoreElements() ;) {
-            NameEntry ne = (NameEntry)e.nextElement();
-            String pattern = ne.evalName(p);
-            if (pattern != null && pattern.length() > 0) {
-                tmpNames.addElement(pattern);
-            }
-        }
-
-        String result[] = new String[tmpNames.size()];
-        tmpNames.copyInto(result);
-        return result;
-    }
-        
-	/**
-	 * Reads includefile and excludefile if not already done.
-	 * 
-	 * @param p the target project
-	 */
-    private void readFiles(Project p) {
-        if (includesFileList.size() > 0) {
-            Enumeration e = includesFileList.elements();
-            while (e.hasMoreElements()) {
-                NameEntry ne = (NameEntry)e.nextElement();
-                String fileName = ne.evalName(p);
-                if (fileName != null) {
-                    File inclFile = p.resolveFile(fileName);
-                    if (!inclFile.exists())
-                        throw new BuildException("Includesfile "
-                                                 + inclFile.getAbsolutePath()
-                                                 + " not found.");
-                    readPatterns(inclFile, includeList, p);
-                }
-            }
-            includesFileList.removeAllElements();
-        }
-
-        if (excludesFileList.size() > 0) {
-            Enumeration e = excludesFileList.elements();
-            while (e.hasMoreElements()) {
-                NameEntry ne = (NameEntry)e.nextElement();
-                String fileName = ne.evalName(p);
-                if (fileName != null) {
-                    File exclFile = p.resolveFile(fileName);
-                    if (!exclFile.exists())
-                        throw new BuildException("Excludesfile "
-                                                 + exclFile.getAbsolutePath()
-                                                 + " not found.");
-                    readPatterns(exclFile, excludeList, p);
-                }
-            }
-            excludesFileList.removeAllElements();
-        }
-    }
-
-    public String toString()
-    {
-        return "patternSet{ includes: " + includeList + 
-            " excludes: " + excludeList + " }";
-    }
-}
-
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CommandDataType.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CommandDataType.java
deleted file mode 100644
index 76542fc..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CommandDataType.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.util.*;
-import org.apache.tools.ant.*;
-import org.apache.tools.ant.types.*;
-
-/**
- * An Ant data type used to specify commands (builder name and arguments for this builder)
- * while working on projects.
- * <p>
- * The name of the builder must be specified.<br>
- * It is posible to specify arguments with nested elements. It is also 
- * possible to reference this command using a reference id.
- * <p><p>
- * Example:<p>
- *	&lt;command name="Main Builder" id="mainBuilder"&gt;
- * 		&lt;eclipse.argument name="arg1" value="value1"/&gt;
- *  &lt;/command&gt;
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- * @see CreateProject, MoveProject, CopyProject
- */
-public class CommandDataType extends DataType {
-	
-	/**
-	 * The name of the builder. It is an identifier defined in the extension points of Eclipse.
-	 */
-	private String name = null;
-	
-	/**
-	 * A vector of Argument objects.
-	 */
-	private HashMap args = null;
-
-	/**
-	 * Inner class that represents a name-value pair.
-	 */
-	public class Argument {
-		private String name;
-
-		/**
-		 * Sets the name of this argument. 
-		 * @param name the name of this argument
-		 */
-		public void setName(String value) {
-			name= value;
-		}
-
-		/**
-		 * Sets the value of this argument. 
-		 * @param value the value of this argument
-		 */
-		public void setValue(String value) {
-			if (value == null)
-				args.remove(name);
-			else
-				args.put(name, value);
-		}
-	}
-	
-	
-/**
- * Constructs a new <code>CommandDataType</code> instance.
- */	
-public CommandDataType() {
-	super();
-	args= new HashMap(5);
-}
-
-public Argument createArgument() {
-	if (isReference())
-		throw new BuildException(Policy.bind("exception.noNestedElements"));
-    return new Argument();
-}
-
-/**
- * Makes this instance in effect a reference to another CommandDataType
- * instance.
- *
- * <p>You must not set attributes, just the reference ID.</p> 
- */
-public void setRefid(Reference r) throws BuildException {
-    if (name != null || !args.isEmpty())
-        throw new BuildException(Policy.bind("exception.noAttributes"));
-    super.setRefid(r);
-}
-
-/**
- * Sets the name of the builder.
- * 
- * @param the name of the builder		
- */
-public void setName(String name) {
-	if (isReference())
-		throw new BuildException(Policy.bind("exception.tooManyAttributes"));
-	this.name = name;
-}
-
-/**
- * Returns the name of the command builer, or the one of the command that is refered to 
- * via the "refid" attribute.
- * 
- * @param the project to which the CommandDataType belongs
- * @return the name of the builder	
- */
-public String getName(Project p) {
-	if (isReference())
-		return getRef(p).getName(p);
-	if (name == null)
-		throw new BuildException(Policy.bind("exception.commandMustHaveName"));
-	return name;
-}
-
-/**
- * Returns the arguments of the command, or the one of the command that is refered to 
- * via the "refid" attribute.<br>
- * The arguments are returned in a <code>HashMap</code> where the names of the arguments
- * are the keys and the values are the actual values in the hashMap.
- * 
- * @param the project to which the CommandDataType belongs
- * @return the hashMap containing the arguments
- */
-public HashMap getArguments(Project p) {
-	if (isReference())
-		return getRef(p).getArguments(p);
-	return args;
-}
-
-/**
- * Performs the check for circular references and returns the
- * referenced PatternSet.
- * 
- * @param the project to which the CommandDataType belongs
- */
-private CommandDataType getRef(Project p) {
-    if (!checked) {
-        Stack stk = new Stack();
-        stk.push(this);
-        dieOnCircularReference(stk, p);
-    }
-    
-    Object o = ref.getReferencedObject(p);
-    if (!(o instanceof CommandDataType)) {
-        throw new BuildException(Policy.bind("exception.doesntDenoteACommand", ref.getRefId()));
-    } else {
-        return (CommandDataType) o;
-    }
-}
-
-}
-
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/ConvertPath.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/ConvertPath.java
deleted file mode 100644
index 9663275..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/ConvertPath.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import java.io.File;
-import org.apache.tools.ant.*;
-import org.apache.tools.ant.types.Path;
-
-/**
- * An Ant task which allows to switch from a file system path to a resource path, 
- * and vice versa, and store the result in a user property which name is set by the user. If the 
- * resource does not exist, the property is set to "false".
- * <p>
- * The attribute "property" must be specified, as well as only one of "fileSystemPath" or "resourcePath".
- * <p><p>
- * Example:<p>
- *	&lt;eclipse.convertPath fileSystemPath="D:\MyWork\MyProject" property="myProject.resourcePath"/&gt;
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- */
-public class ConvertPath extends Task {
-	
-	/**
-	 * The file system path.
-	 */
-	private IPath fileSystemPath = null;
-	
-	/**
-	 * The resource path.
-	 */
-	private IPath resourcePath = null;
-	
-	/**
-	 * The name of the property where the result may be stored.
-	 */
-	private String property = null;
-	
-	/**
-	 * The id of the new Path object that may be created.
-	 */
-	private String pathID = null;
-
-
-/**
- * Constructs a new <code>ConvertPath</code> instance.
- */
-public ConvertPath() {
-	super();
-}
-
-/**
- * Performs the project copy operation.
- * 
- * @exception BuildException thrown if a problem occurs during execution.
- */
-public void execute() throws BuildException {
-	
-	validateAttributes();
-	
-	if (fileSystemPath == null) 
-		// here, resourcePath is not null
-		convertResourcePathToFileSystemPath(resourcePath);
-	else
-		convertFileSystemPathToResourcePath(fileSystemPath);
-}
-
-protected void convertFileSystemPathToResourcePath(IPath path) {
-	IResource resource = ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(path);
-	if (resource == null)
-		throw new BuildException(Policy.bind("exception.noProjectMatchThePath", fileSystemPath.toOSString()));
-	
-	if (property != null)
-		project.setUserProperty(property, resource.getFullPath().toString());
-	if (pathID != null) {
-		Path newPath = new Path(project, resource.getFullPath().toString());
-		project.addReference(pathID, newPath);
-	}
-}
-
-protected void convertResourcePathToFileSystemPath(IPath path) {
-	IResource resource = null;
-	if (path.segmentCount() == 1)
-		resource = ResourcesPlugin.getWorkspace().getRoot().getProject(path.lastSegment());
-	else
-		resource = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-		
-	if (resource.getLocation() == null)
-		// can occur if the first segment is not a project
-		throw new BuildException(Policy.bind("exception.pathNotValid", path.toString()));
-	
-	if (property != null)
-		project.setUserProperty(property, resource.getLocation().toOSString());
-	if (pathID != null) {
-		Path newPath = new Path(project, resource.getLocation().toOSString());
-		project.addReference(pathID, newPath);
-	}
-}
-
-/**
- * Sets the file system path.
- * 
- * @param the file corresponding to the path supplied by the user
- */
-public void setFileSystemPath(File value) {
-	if (resourcePath != null)
-		throw new BuildException(Policy.bind("exception.cantUseBoth"));
-	fileSystemPath = new org.eclipse.core.runtime.Path(value.toString());
-}
-
-/**
- * Sets the resource path.
- * 
- * @param the path	
- */
-public void setResourcePath(String value) {
-	if (fileSystemPath != null)
-		throw new BuildException(Policy.bind("exception.cantUseBoth"));
-	resourcePath = new org.eclipse.core.runtime.Path(value);
-}
-
-/**
- * Sets the name of the property where the result may stored.
- * 
- * @param the name of the property		
- */
-public void setProperty(String value) {
-	property = value;
-
-}
-
-/**
- * Sets the id for the path where the result may be stored
- * 
- * @param the id of the path
- */
-public void setPathId(String value) {
-	pathID = value;
-}
-
-/**
- * Performs a validation of the receiver.
- * 
- * @exception BuildException thrown if a problem occurs during validation.
- */
-protected void validateAttributes() throws BuildException {
-	if (property == null && pathID == null) 
-		throw new BuildException(Policy.bind("exception.propertyAndPathIdNotSpecified"));
-
-	if (resourcePath != null && (!resourcePath.isValidPath(resourcePath.toString()) || resourcePath.isEmpty())) 
-		throw new BuildException(Policy.bind("exception.invalidPath", resourcePath.toOSString()));
-	else if (fileSystemPath != null && !fileSystemPath.isValidPath(fileSystemPath.toOSString())) 
-		throw new BuildException(Policy.bind("exception.invalidPath", fileSystemPath.toOSString()));
-		
-	if (resourcePath == null && fileSystemPath == null)
-		throw new BuildException(Policy.bind("exception.mustHaveOneAttribute"));
-}
-
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CopyProject.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CopyProject.java
deleted file mode 100644
index aedbcb5..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CopyProject.java
+++ /dev/null
@@ -1,286 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.File;
-import java.util.*;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.apache.tools.ant.*;
-
-/**
- * An Ant task which copies an existing Eclipse project.
- * <p>
- * The name of the project to copy (source), its new name (destination) and the "force" attribute 
- * must be specified.<br>
- * The comment, the nature(s) and the referenced projects are optional.<br>
- * Concerning the location attribute (the directory where the project will be copied on the file system),
- * there are several cases:<br>
- * <ul>
- * 	<li>If "location" is specified, the project will be copied to the given directory. 
- * 		To specify the default workspace directory, location should be set to "null".
- * 		However, it is not possible to copy the project in the same directory.</li>
- * 	<li>If "location" is not specified, the copy of the project will be located in the
- * 		default worksapce directory.</li>
- * </ul>
- * <br>
- * It is also possible to define commands with nested elements.
- * <p><p>
- * Example:<p>
- *	&lt;eclipse.copyProject source="Foo" destination="Bar" location="D:\MyWork\My Project"/&gt;
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- * @see IProject#copy
- * @see CommandDataType
- */
-public class CopyProject extends Task {
-	
-	/**
-	 * The name of the source project.
-	 */
-	private String source = null;
-	
-	/**
-	 * The name of the project after it has been copied.
-	 */
-	private String destination = null;
-
-	/**
-	 * The force attribute.
-	 */
-	private boolean force;
-	// variable used to know if the user has actually set the "force" attribute
-	private boolean isForceSet = false;
-	
-	/**
-	 * The folder where the user wants to move the project.
-	 */
-	private IPath location = null;
-	// variable used to know if the user has specified "null" or not
-	private boolean isLocationSet = false;
-	
-	/**
-	 * The natures, if the user wants to modify them.
-	 */
-	private String[] natures = null;
-	
-	/**
-	 * The comment, if the user wants to modify it
-	 */
-	private String comment = null;
-	
-	/**
-	 * The projects that the project references, if the user wants to modify them
-	 */
-	private IProject[] referencedProjects = null;
-
-	/**
-	 * The builders and their arguments (commands), if the user wants to modify them
-	 */
-	private Vector commands;
-	
-
-/**
- * Constructs a new <code>CopyProject</code> instance.
- */
-public CopyProject() {
-	super();
-	commands = new Vector();
-}
-
-/**
- * Performs the project copy operation.
- * 
- * @exception BuildException thrown if a problem occurs during execution.
- */
-public void execute() throws BuildException {
-	
-	validateAttributes();
-	
-	IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(source);
-	
-	try {
-		if (!newProject.exists()) 
-			throw new BuildException(Policy.bind("exception.projectDoesntExist", source));
-			
-		IProject temp = ResourcesPlugin.getWorkspace().getRoot().getProject(destination);
-		if (temp.exists())
-			throw new BuildException(Policy.bind("exception.nameAlreadyUsed", destination));
-			
-		if (!newProject.isOpen())
-			newProject.open(null);
-		
-		IProjectDescription desc = newProject.getDescription();
-		desc.setName(destination);
-		setLocationToDescription(newProject, desc);
-		
-		if (natures != null)
-			desc.setNatureIds(natures);
-		if (comment != null)
-			desc.setComment(comment);
-		if (referencedProjects != null)
-			desc.setReferencedProjects(referencedProjects);
-		if (!commands.isEmpty())
-			desc.setBuildSpec(createCommands(desc));
-			
-		newProject.copy(desc, force, null);
-		
-	} catch (CoreException e) {
-		throw new BuildException(e);
-	}
-}
-
-protected void setLocationToDescription(IProject newProject, IProjectDescription desc) {
-	if (isLocationSet) {
-		// the user wants to change the location.
-		// location can be null if the user set the attribute to "null" in order to copy the folder in the default workspace directory
-		if (location!= null && !ResourcesPlugin.getWorkspace().validateProjectLocation(newProject, location).isOK())
-			throw new BuildException(Policy.bind("exception.folderAlreadyUsedForAnotherProject"));
-	}
-	desc.setLocation(location);
-}
-
-protected ICommand[] createCommands(IProjectDescription description) {
-	ICommand[] commandArray = new ICommand[commands.size()];
-	int index = 0;
-	for (Iterator i = commands.iterator(); i.hasNext();) {
-		CommandDataType b = (CommandDataType) i.next();
-		commandArray[index] = description.newCommand();
-		// needs the project of this target to be able to get the name and the arguments
-		commandArray[index].setBuilderName(b.getName(project));
-		commandArray[index].setArguments(b.getArguments(project));
-		index++;
-	}
-	return commandArray;
-}
-
-/**
- * Sets the name of the source project that the user wants to copy.
- * 
- * @param the name of the project		
- */
-public void setSource(String value) {
-	source = value;
-}
-
-/**
- * Sets the new name for the project.
- * 
- * @param the new name	
- */
-public void setDestination(String value) {
-	destination = value;
-}
-
-/**
- * Sets the force attribute.
- * 
- * @param true/false		
- */
-public void setForce(boolean value) {
-	force = value;
-	isForceSet = true;
-}
-
-/**
- * Sets the directory where the project will be copied. The parameter is a String
- * and not a File because the user can specify "null" if he wants to refer to the
- * default workspace directory.
- * 
- * @param the name of the folder or "null" for the default workspace directory
- */
-public void setLocation(String value) {
-	isLocationSet = true;
-	if (value.equals("null"))
-		// we leave the location as it currently is (i.e. null)
-		return;
-	location = new Path(value);
-	if (!location.isAbsolute()) {
-		// the location can be relative if the user used a period in the path
-		org.eclipse.core.runtime.Path defaultPath = new org.eclipse.core.runtime.Path(project.getBaseDir().toString());
-		location = defaultPath.append(location);
-	}
-}
-
-/**
- * Sets the natures for the project. They are given as a list of nature identifers
- * separated by a coma.
- * 
- * @param the natures specified by the user
- */
-public void setNatures(String value) {
-	StringTokenizer tokenizer = new StringTokenizer(value, ",");
-	Vector vect = new Vector(1);
-	while (tokenizer.hasMoreTokens())
-		vect.add(((String)tokenizer.nextToken()).trim());
-	natures = new String[vect.size()];
-	vect.toArray(natures);
-}
-
-/**
- * Sets the comment for the project.
- * 
- * @param the comment
- */
-public void setComment(String value) {
-	comment = value;
-}
-
-/**
- * Sets the projects that the project references. They are given as a list of project names
- * separated by a coma.
- * 
- * @param the natures specified by the user
- */
-public void setReferencedProjects(String value) {
-	StringTokenizer tokenizer = new StringTokenizer(value, ",");
-	Vector vect = new Vector(1);
-	while (tokenizer.hasMoreTokens()) {
-		IProject currentProject = ResourcesPlugin.getWorkspace().getRoot().getProject(((String) tokenizer.nextToken()).trim());
-		if (currentProject.exists())
-			vect.add(currentProject);
-		else
-			throw new BuildException(Policy.bind("exception.unknownProject", currentProject.getName()));
-	}
-		
-	referencedProjects = new IProject[vect.size()];
-	vect.toArray(referencedProjects);
-}
-
-/**
- * Adds a CommandDataType object to the set of commands specified for this project.
- * 
- * @param the command
- */
-public void addCommand(CommandDataType command) {
-	commands.add(command);
-}
-
-/**
- * Performs a validation of the receiver.
- * 
- * @exception BuildException thrown if a problem occurs during validation.
- */
-protected void validateAttributes() throws BuildException {
-	if (source == null) 
-		throw new BuildException(Policy.bind("exception.sourceNotSpecified"));
-
-	if (destination == null) 
-		throw new BuildException(Policy.bind("exception.destinationNotSpecified"));
-
-	if (location!= null && !location.isValidPath(location.toOSString()))
-		throw new BuildException(Policy.bind("exception.invalidPath", location.toOSString()));
-	
-	if (!isForceSet)
-		throw new BuildException(Policy.bind("exception.forceNotSpecified"));
-}
-
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CreateProject.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CreateProject.java
deleted file mode 100644
index 089d5b9..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/CreateProject.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import java.io.File;
-import java.util.*;
-import org.apache.tools.ant.*;
-
-/**
- * An Ant task which creates an Eclipse project.
- * <p>
- * The name of the project to create must be specified.<br>
- * The directory where the project is located on the file system, the comment, the nature(s)
- * and the referenced projects are optional. If the directory is not specified, the project will be
- * located in the default workspace folder.<br>
- * It is also possible to define commands with nested elements.
- * <p><p>
- * Example:<p>
- *	&lt;eclipse.createProject name="My Project" location="D:\MyWork\FirstProject" 
- *  natures="org.eclipse.jdt.core.javanature"/&gt;
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- * @see IProject#create
- * @see CommandDataType
- */
-public class CreateProject extends Task {
-	
-	/**
-	 * The name of the project.
-	 */
-	private String name = null;
-	
-	/**
-	 * The location of the project.
-	 */
-	private IPath location = null;
-	
-	/**
-	 * The nature of the project.
-	 */
-	private String[] natures = null;
-	
-	/**
-	 * The comment for this project
-	 */
-	private String comment = null;
-	
-	/**
-	 * The projects that the project references
-	 */
-	private IProject[] referencedProjects = null;
-
-	/**
-	 * The builders and their arguments (commands)
-	 */
-	private Vector commands;
-
-
-/**
- * Constructs a new <code>CreateProject</code> instance.
- */
-public CreateProject() {
-	super();
-	commands = new Vector();
-}
-
-/**
- * Performs the project creation operation.
- * 
- * @exception BuildException thrown if a problem occurs during execution.
- */
-public void execute() throws BuildException {
-	
-	validateAttributes();
-	
-	IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
-	
-	try {
-		if (newProject.exists())
-			throw new BuildException(Policy.bind("exception.nameAlreadyUsed", name));
-			
-		IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(project.getName());
-		description.setName(name);
-		description.setLocation(location);
-		if (comment != null)
-			description.setComment(comment);
-		if (referencedProjects != null)
-			description.setReferencedProjects(referencedProjects);
-		if (!commands.isEmpty())
-			description.setBuildSpec(createCommands(description));
-		
-		newProject.create(description, null);
-		newProject.open(null);
-		
-		if (natures!=null) {
-			// should be able to do that while creating the project, but it doesn't seem to work until the project is opened.
-			// see Project#checkAccessible while JavaNature tries to configure the project.
-			IProjectDescription desc = newProject.getDescription();
-			description.setNatureIds(natures);
-			newProject.setDescription(desc, null);
-		}
-		
-	} catch (CoreException e) {
-		if (newProject.exists())
-			try {
-				newProject.delete(true, true, null);
-			} catch (CoreException ce) {
-			}
-		throw new BuildException(e);
-	}
-}
-
-protected ICommand[] createCommands(IProjectDescription description) {
-	ICommand[] commandArray = new ICommand[commands.size()];
-	int index = 0;
-	for (Iterator i = commands.iterator(); i.hasNext();) {
-		CommandDataType b = (CommandDataType) i.next();
-		commandArray[index] = description.newCommand();
-		// needs the project of this target to be able to get the name and the arguments
-		commandArray[index].setBuilderName(b.getName(project));
-		commandArray[index].setArguments(b.getArguments(project));
-		index++;
-	}
-	return commandArray;
-}
-
-/**
- * Sets the name of the project that the user wants to create.
- * 
- * @param the name of the project		
- */
-public void setName(String value) {
-	name = value;
-}
-
-/**
- * Sets the folder where the project should be created.
- * 
- * @param the file corresponding to the folder specified by the user
- */
-public void setLocation(File value) {
-	 location = new Path(value.toString());
-}
-
-/**
- * Sets the natures for the project. They are given as a list of nature identifers
- * separated by a coma.
- * 
- * @param the natures specified by the user
- */
-public void setNatures(String value) {
-	StringTokenizer tokenizer = new StringTokenizer(value, ",");
-	Vector vect = new Vector(1);
-	while (tokenizer.hasMoreTokens())
-		vect.add(((String)tokenizer.nextToken()).trim());
-	natures = new String[vect.size()];
-	vect.toArray(natures);
-}
-
-/**
- * Sets the comment for the project.
- * 
- * @param the comment
- */
-public void setComment(String value) {
-	comment = value;
-}
-
-/**
- * Sets the projects that the project references. They are given as a list of project names
- * separated by a coma.
- * 
- * @param the natures specified by the user
- */
-public void setReferencedProjects(String value) {
-	StringTokenizer tokenizer = new StringTokenizer(value, ",");
-	Vector vect = new Vector(1);
-	IWorkspaceRoot root =  ResourcesPlugin.getWorkspace().getRoot();
-	while (tokenizer.hasMoreTokens()) {
-		IProject currentProject = root.getProject(((String) tokenizer.nextToken()).trim());
-		vect.add(currentProject);
-	}
-		
-	referencedProjects = new IProject[vect.size()];
-	vect.toArray(referencedProjects);
-}
-
-/**
- * Adds a CommandDataType object to the set of commands specified for this project.
- * 
- * @param the command
- */
-public void addCommand(CommandDataType command) {
-	commands.add(command);
-}
-
-/**
- * Performs a validation of the receiver.
- * 
- * @exception BuildException thrown if a problem occurs during validation.
- */
-protected void validateAttributes() throws BuildException {
-	if (name == null) 
-		throw new BuildException(Policy.bind("exception.nameNotSpecified"));
-	
-	if (location!=null && !location.isValidPath(location.toOSString()))
-		throw new BuildException(Policy.bind("exception.invalidPath", location.toOSString()));
-}
-
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/DeleteProject.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/DeleteProject.java
deleted file mode 100644
index 8d87cdc..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/DeleteProject.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.apache.tools.ant.*;
-
-/**
- * An Ant task which deletes an existing Eclipse project.
- * <p>
- * The name of the project to delete, as well as the force and 
- * the deleteContent attributes, must be specified.
- * <p><p>
- * Example:<p>
- *	&lt;eclipse.deleteProject name="My Project" force="true" deleteContent="true"/&gt;
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- * @see IProject#delete
- */
-public class DeleteProject extends Task {
-	
-	/**
-	 * The name of the project.
-	 */
-	private String name = null;
-	
-	/**
-	 * The force attribute for the deletion.
-	 */
-	private boolean force;
-	// isForceSet is used to know if the user has actually set this attribute
-	private boolean isForceSet = false;
-	
-	/**
-	 * The deleteContent attribute for the deletion.
-	 */
-	private boolean deleteContent;
-	// same as for Force
-	private boolean isDeleteContentSet = false;
-	
-
-/**
- * Constructs a new <code>DeleteProject</code> instance.
- */
-public DeleteProject() {
-	super();
-}
-
-/**
- * Performs the project deletion operation.
- * 
- * @exception BuildException thrown if a problem occurs during execution.
- */
-public void execute() throws BuildException {
-	
-	validateAttributes();
-	
-	IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
-	
-	try {
-		if (!project.exists())
-			throw new BuildException(Policy.bind("exception.projectDoesntExist", name));
-			
-		if (!project.isOpen())
-			project.open(null);
-		
-		project.delete(deleteContent, force, null);
-			
-	} catch (CoreException e) {
-		throw new BuildException(e);
-	}
-}
-
-/**
- * Sets the name of the project that the user wants to delete.
- * 
- * @param the name of the project		
- */
-public void setName(String value) {
-	name = value;
-}
-
-/**
- * Sets the force attribute.
- * 
- * @param true/false		
- */
-public void setForce(boolean value) {
-	force = value;
-	isForceSet = true;
-}
-
-/**
- * Sets the deleteContent attribute.
- * 
- * @param true/false		
- */
-public void setDeleteContent(boolean value) {
-	deleteContent = value;
-	isDeleteContentSet = true;
-}
-
-/**
- * Performs a validation of the receiver.
- * 
- * @exception BuildException thrown if a problem occurs during validation.
- */
-protected void validateAttributes() throws BuildException {
-	if (name == null) 
-		throw new BuildException(Policy.bind("exception.nameNotSpecified"));
-		
-	if (!isForceSet)
-		throw new BuildException(Policy.bind("exception.forceNotSpecified"));
-		
-	if (!isDeleteContentSet)
-		throw new BuildException(Policy.bind("exception.deleteContentNotSpecified"));
-}
-
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseAnt.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseAnt.java
deleted file mode 100644
index abc4694..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseAnt.java
+++ /dev/null
@@ -1,346 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "The Jakarta Project", "Ant", and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-import org.apache.tools.ant.*;
-import org.apache.tools.ant.taskdefs.Property;
-import org.apache.tools.ant.taskdefs.Ant;
-import org.apache.tools.ant.util.FileUtils;
-import java.io.*;
-import java.util.*;
-
-/**
- * Call Ant in a sub-project.
- * This is a bulk copy of the original Ant task.  Unfortunately the original
- * created a new Project in which to run Ant.  This prevents people from
- * providing their own kind of Project and having that propogate into
- * the subprojects.
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- */
-public class EclipseAnt extends Ant {
-
-    /** the basedir where is executed the build file */
-    private File dir = null;
-    
-    /** the build.xml file (can be absolute) in this case dir will be ignored */
-    private String antFile = null;
-    
-    /** the target to call if any */
-    private String target = null;
-    
-    /** the output */
-    private String output = null;
-    
-    /** should we inherit properties from the parent ? */
-    private boolean inheritAll = true;
-    
-    /** the properties to pass to the new project */
-    private Vector properties = new Vector();
-    
-    /** the temporary project created to run the build file */
-    private Project newProject;
-
-	private final static String DEFAULT_ANTFILE = "build.xml";
-
-/**
- * Creates and returns a new <code>Property</code> for the receiver's
- * target project.
- * 
- * @return the new property
- */
-public Property createProperty() {
-    if (newProject == null) {
-        reinit();
-    }
-    Property p=(Property)newProject.createTask("property");
-    p.setUserProperty(true);
-    properties.addElement( p );
-    return p;
-}
-
-/**
- * Performs the execution.
- * 
- * @exception BuildException thrown if an execution problem occurs
- */
-public void execute() throws BuildException {
-    try {
-        if (newProject == null) {
-            reinit();
-        }
-    
-        if (dir == null) {
-            dir = project.getBaseDir();
-        }
-
-        initializeProject();
-
-        newProject.setBaseDir(dir);
-        newProject.setUserProperty("basedir" , dir.getAbsolutePath());
-        
-        // Override with local-defined properties
-        Enumeration e = properties.elements();
-        while (e.hasMoreElements()) {
-            Property p=(Property) e.nextElement();
-            p.execute();
-        }
-        
-        if (antFile == null){
-            antFile = DEFAULT_ANTFILE;
-        }
-
-        File file = FileUtils.newFileUtils().resolveFile(dir, antFile);
-        antFile = file.getAbsolutePath();
-
-        newProject.setUserProperty( "ant.file" , antFile );
-        ProjectHelper.configureProject(newProject, new File(antFile));
-        
-        if (target == null) {
-            target = newProject.getDefaultTarget();
-        }
-
-        // Are we trying to call the target in which we are defined?
-        if (newProject.getBaseDir().equals(project.getBaseDir()) &&
-            newProject.getProperty("ant.file").equals(project.getProperty("ant.file")) &&
-            getOwningTarget() != null &&
-            target.equals(this.getOwningTarget().getName())) { 
-
-            throw new BuildException(Policy.bind("exception.antTaskCallingParentTarget"));
-        }
-
-        newProject.executeTarget(target);
-    } finally {
-        // help the gc
-        newProject = null;
-    }
-}
-
-/**
- * Initializes the receiver.
- */
-public void init() {
-	// This method used to create a Project, not an EclipseProject.
-	// It has been changed so that it is possible to use Eclipse Ant tasks (such as eclipse.refreshLocal)
-	// in Ant scripts called by through an "ant" task. Indeed, only an EclipseProject knows how to find them.
-	// We need to check that it doesn't introduce new bugs.
-	newProject = new EclipseProject();
-	newProject.setJavaVersionProperty();
-	newProject.addTaskDefinition("property", 
-                         (Class)project.getTaskDefinitions().get("property"));
-}
-
-/**
- * Initializes the target project.
- */
-private void initializeProject() {
-    Vector listeners = project.getBuildListeners();
-    for (int i = 0; i < listeners.size(); i++) {
-        newProject.addBuildListener((BuildListener)listeners.elementAt(i));
-    }
-
-    if (output != null) {
-        try {
-            PrintStream out = new PrintStream(new FileOutputStream(output));
-            DefaultLogger logger = new DefaultLogger();
-            logger.setMessageOutputLevel(Project.MSG_INFO);
-            logger.setOutputPrintStream(out);
-            logger.setErrorPrintStream(out);
-            newProject.addBuildListener(logger);
-        }
-        catch( IOException ex ) {
-            log(Policy.bind("exception.cannotSetOutput",output));
-        }
-    }
-
-    Hashtable taskdefs = project.getTaskDefinitions();
-    Enumeration et = taskdefs.keys();
-    while (et.hasMoreElements()) {
-        String taskName = (String) et.nextElement();
-        Class taskClass = (Class) taskdefs.get(taskName);
-        newProject.addTaskDefinition(taskName, taskClass);
-    }
-
-    Hashtable typedefs = project.getDataTypeDefinitions();
-    Enumeration e = typedefs.keys();
-    while (e.hasMoreElements()) {
-        String typeName = (String) e.nextElement();
-        Class typeClass = (Class) typedefs.get(typeName);
-        newProject.addDataTypeDefinition(typeName, typeClass);
-    }
-
-    // set user-defined or all properties from calling project
-    Hashtable prop1;
-    if (inheritAll == true) {
-       prop1 = project.getProperties();
-    }
-    else {
-       prop1 = project.getUserProperties();
-
-       // set Java built-in properties separately,
-       // b/c we won't inherit them.
-       newProject.setSystemProperties();
-    }
-    
-    e = prop1.keys();
-    while (e.hasMoreElements()) {
-        String arg = (String) e.nextElement();
-        String value = (String) prop1.get(arg);
-        if (inheritAll == true){
-           newProject.setProperty(arg, value);
-        } else {
-           newProject.setUserProperty(arg, value);
-        }
-    }
-}
-
-/**
- * Reinitializes the receiver.
- */
-private void reinit() {
-    init();
-    for (int i=0; i<properties.size(); i++) {
-        Property p = (Property) properties.elementAt(i);
-        Property newP = (Property) newProject.createTask("property");
-        newP.setName(p.getName());
-        if (p.getValue() != null) {
-            newP.setValue(p.getValue());
-        }
-        if (p.getFile() != null) {
-            newP.setFile(p.getFile());
-        } 
-        if (p.getResource() != null) {
-            newP.setResource(p.getResource());
-        }
-        properties.setElementAt(newP, i);
-    }
-}
-
-/**
- * set the build file, it can be either absolute or relative.
- * If it is absolute, <tt>dir</tt> will be ignored, if it is
- * relative it will be resolved relative to <tt>dir</tt>.
- * 
- * @param s the <b>Ant</b> file location
- */
-public void setAntfile(String s) {
-    // @note: it is a string and not a file to handle relative/absolute
-    // otherwise a relative file will be resolved based on the current
-    // basedir.
-    this.antFile = s;
-}
-
-/**
- * Sets the receiver's target directory.
- * 
- * @param s the target directory
- */
-public void setDir(File d) {
-	this.dir = d;
-}
-
-/**
- * Sets the receiver's output destination.
- * 
- * @param s the output destination
- */
-public void setOutput(String s) {
-	this.output = s;
-}
-
-/**
- * set the target to execute. If none is defined it will
- * execute the default target of the build file
- * 
- * @param s the <b>Ant</b> target to execute
- */
-public void setTarget(String s) {
-	this.target = s;
-}
-protected void handleErrorOutput(String line) {
-    if (newProject != null) {
-        newProject.demuxOutput(line, true);
-    }
-    else {
-        super.handleErrorOutput(line);
-    }
-}
-protected void handleOutput(String line) {
-    if (newProject != null) {
-        newProject.demuxOutput(line, false);
-    }
-    else {
-        super.handleOutput(line);
-    }
-}
-/**
- * If true, inherit all properties from parent Project
- * If false, inherit only userProperties and those defined
- * inside the ant call itself
- */
-public void setInheritAll(boolean value) {
-   inheritAll = value;
-}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseCompilerAdapterFactory.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseCompilerAdapterFactory.java
deleted file mode 100644
index bef6722..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseCompilerAdapterFactory.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.runtime.IConfigurationElement;
-
-import org.apache.tools.ant.*;
-import org.apache.tools.ant.taskdefs.compilers.CompilerAdapterFactory;
-import org.apache.tools.ant.taskdefs.compilers.CompilerAdapter;
-import java.util.Map;
-
-/**
- * Static helper functionality for finding the correct compiler adapter to use for the current
- * Javac task.  This class logically wrappers the standard Ant 
- * <code>CompilerAdapterFactory</code>.  It changes the behavior to use the
- * Ant plug-ins object class registry to find the compiler adapter class.  This is needed
- * because of the platform's class loading strategy (otherwise the Ant plug-in would likely not
- * be able to see the other classes).
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- */
-
-public class EclipseCompilerAdapterFactory {
-
-private EclipseCompilerAdapterFactory() {
-}
-/**
- * Returns the <code>CompilerAdapter</code> to use given a compiler type and task.
- * 
- * @return the compiler adapter to use
- * @param compilerType the type of compiler
- * @param task the task
- * @exception BuildException thrown if a problem occurs while returning the adapter
- */
-public static CompilerAdapter getCompiler(String compilerType, Task task) throws BuildException {
-	try {
-		return CompilerAdapterFactory.getCompiler(compilerType, task);
-	} catch (BuildException be) {
-		if (AntPlugin.getPlugin() == null)
-			throw be;
-		Map objects = AntPlugin.getPlugin().getObjectExtensions();
-		if (objects == null)
-			throw be;
-		IConfigurationElement declaration = (IConfigurationElement) objects.get(compilerType);
-		if (declaration == null)
-			throw be;
-		String className = declaration.getAttribute(AntPlugin.CLASS);
-		try {
-			Class clazz = declaration.getDeclaringExtension().getDeclaringPluginDescriptor().getPluginClassLoader().loadClass(className);
-			return (CompilerAdapter) clazz.newInstance();
-		} catch (ClassNotFoundException e) {
-			throw new BuildException(Policy.bind("exception.classNotFound",className), e);
-		} catch (ClassCastException e) {
-			throw new BuildException(Policy.bind("exception.classNotCompiler",className), e);
-		} catch (Exception e) {
-			throw new BuildException(Policy.bind("exception.creationProblem",className), e);
-		}
-	}
-}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseCopy.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseCopy.java
deleted file mode 100644
index 0990d25..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseCopy.java
+++ /dev/null
@@ -1,413 +0,0 @@
-package org.eclipse.ant.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "The Jakarta Project", "Ant", and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-import org.apache.tools.ant.*;
-import org.apache.tools.ant.taskdefs.Copy;
-import org.apache.tools.ant.types.*;
-import org.apache.tools.ant.util.*;
-
-import java.io.*;
-import java.util.*;
-/**
- * Ant task which replaces the standard Ant Copy task.  This version of the task
- * is necessary in order to copy permissions of files as well.
- * <p>
- * This task can be used as a direct replacement for the original Copy task
- * </p>
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- */
-public class EclipseCopy extends Copy {
-    protected File file = null;     // the source file 
-    protected File destFile = null; // the destination file 
-    protected File destDir = null;  // the destination directory
-    protected Vector filesets = new Vector();
-
-    protected boolean filtering = false;
-    protected boolean preserveLastModified = false;
-    protected boolean forceOverwrite = false;
-    protected boolean flatten = false;
-    protected int verbosity = Project.MSG_VERBOSE;
-    protected boolean includeEmpty = true;
-
-    protected Hashtable fileCopyMap = new Hashtable();
-    protected Hashtable dirCopyMap = new Hashtable();
-
-    protected Mapper mapperElement = null;
-    private Vector filterSets = new Vector();
-    private FileUtils fileUtils;
-    
-    public EclipseCopy() {
-    	super();
-        fileUtils = new EclipseFileUtils();
-    }
-
-    protected FileUtils getFileUtils() {return fileUtils;}
-
-    /**
-     * Sets a single source file to copy.
-     */
-    public void setFile(File file) {
-        this.file = file;
-    }
-
-    /**
-     * Sets the destination file.
-     */
-    public void setTofile(File destFile) {
-        this.destFile = destFile;
-    }
-
-    /**
-     * Sets the destination directory.
-     */
-    public void setTodir(File destDir) {
-        this.destDir = destDir;
-    }
-
-    /**
-     * Create a nested filterset
-     */
-    public FilterSet createFilterSet() {
-        FilterSet filterSet = new FilterSet();
-        filterSets.addElement(filterSet);
-        return filterSet;
-    }
-    
-    /**
-     * Give the copied files the same last modified time as the original files.
-     */
-    public void setPreserveLastModified(String preserve) {
-        preserveLastModified = Project.toBoolean(preserve);
-    }
-
-    /**
-     * Get the filtersets being applied to this operation.
-     *
-     * @return a vector of FilterSet objects
-     */
-    protected Vector getFilterSets() {
-        return filterSets;
-    }
-    
-    /**
-     * Sets filtering.
-     */
-    public void setFiltering(boolean filtering) {
-        this.filtering = filtering;
-    }
-
-    /**
-     * Overwrite any existing destination file(s).
-     */
-    public void setOverwrite(boolean overwrite) {
-        this.forceOverwrite = overwrite;
-    }
-
-    /**
-     * When copying directory trees, the files can be "flattened"
-     * into a single directory.  If there are multiple files with
-     * the same name in the source directory tree, only the first
-     * file will be copied into the "flattened" directory, unless
-     * the forceoverwrite attribute is true.
-     */
-    public void setFlatten(boolean flatten) {
-        this.flatten = flatten;
-    }
-
-    /**
-     * Used to force listing of all names of copied files.
-     */
-    public void setVerbose(boolean verbose) {
-        if (verbose) {
-            this.verbosity = Project.MSG_INFO;
-        } else {
-            this.verbosity = Project.MSG_VERBOSE;
-        } 
-    } 
-
-    /**
-     * Used to copy empty directories.
-     */
-    public void setIncludeEmptyDirs(boolean includeEmpty) {
-        this.includeEmpty = includeEmpty;
-    }
-
-    /**
-     * Adds a set of files (nested fileset attribute).
-     */
-    public void addFileset(FileSet set) {
-        filesets.addElement(set);
-    }
-
-    /**
-     * Defines the FileNameMapper to use (nested mapper element).
-     */
-    public Mapper createMapper() throws BuildException {
-        if (mapperElement != null) {
-            throw new BuildException("Cannot define more than one mapper",
-                                     location);
-        }
-        mapperElement = new Mapper(project);
-        return mapperElement;
-    }
-
-    /**
-     * Performs the copy operation.
-     */
-    public void execute() throws BuildException {
-        // make sure we don't have an illegal set of options
-        validateAttributes();   
-
-        // deal with the single file
-        if (file != null) {
-            if (file.exists()) {
-                if (destFile == null) {
-                    destFile = new File(destDir, file.getName());
-                }
-                
-                if (forceOverwrite || 
-                    (file.lastModified() > destFile.lastModified())) {
-                    fileCopyMap.put(file.getAbsolutePath(), destFile.getAbsolutePath());
-                } else {
-                    log(file + " omitted as " + destFile + " is up to date.",
-                        Project.MSG_VERBOSE);
-                }
-            } else {
-                String message = "Could not find file " 
-                                 + file.getAbsolutePath() + " to copy.";
-                log(message);
-                throw new BuildException(message);
-            }
-        }
-
-        // deal with the filesets
-        for (int i=0; i<filesets.size(); i++) {
-            FileSet fs = (FileSet) filesets.elementAt(i);
-            DirectoryScanner ds = fs.getDirectoryScanner(project);
-            File fromDir = fs.getDir(project);
-
-            String[] srcFiles = ds.getIncludedFiles();
-            String[] srcDirs = ds.getIncludedDirectories();
-
-            scan(fromDir, destDir, srcFiles, srcDirs);
-        }
-
-        // do all the copy operations now...
-        doFileOperations();
-
-        // clean up destDir again - so this instance can be used a second
-        // time without throwing an exception
-        if (destFile != null) {
-            destDir = null;
-        }
-    }
-
-//************************************************************************
-//  protected and private methods
-//************************************************************************
-
-    /**
-     * Ensure we have a consistent and legal set of attributes, and set
-     * any internal flags necessary based on different combinations 
-     * of attributes.
-     */
-    protected void validateAttributes() throws BuildException {
-        if (file == null && filesets.size() == 0) {
-            throw new BuildException("Specify at least one source - a file or a fileset.");
-        }
-
-        if (destFile != null && destDir != null) {
-            throw new BuildException("Only one of destfile and destdir may be set.");
-        }
-
-        if (destFile == null && destDir == null) {
-            throw new BuildException("One of destfile or destdir must be set.");
-        }
-
-        if (file != null && file.exists() && file.isDirectory()) {
-            throw new BuildException("Use a fileset to copy directories.");
-        }
-           
-        if (destFile != null && filesets.size() > 0) {
-            throw new BuildException("Cannot concatenate multple files into a single file.");
-        }
-
-        if (destFile != null) {
-            destDir = new File(destFile.getParent());   // be 1.1 friendly
-        }
-
-    }
-
-    /**
-     * Compares source files to destination files to see if they should be
-     * copied.
-     */
-    protected void scan(File fromDir, File toDir, String[] files, String[] dirs) {
-        FileNameMapper mapper = null;
-        if (mapperElement != null) {
-            mapper = mapperElement.getImplementation();
-        } else if (flatten) {
-            mapper = new FlatFileNameMapper();
-        } else {
-            mapper = new IdentityMapper();
-        }
-
-        buildMap(fromDir, toDir, files, mapper, fileCopyMap);
-
-        if (includeEmpty) {
-            buildMap(fromDir, toDir, dirs, mapper, dirCopyMap);
-        }
-    }
-
-    protected void buildMap(File fromDir, File toDir, String[] names,
-                            FileNameMapper mapper, Hashtable map) {
-
-        String[] toCopy = null;
-        if (forceOverwrite) {
-            Vector v = new Vector();
-            for (int i=0; i<names.length; i++) {
-                if (mapper.mapFileName(names[i]) != null) {
-                    v.addElement(names[i]);
-                }
-            }
-            toCopy = new String[v.size()];
-            v.copyInto(toCopy);
-        } else {
-            SourceFileScanner ds = new SourceFileScanner(this);
-            toCopy = ds.restrict(names, fromDir, toDir, mapper);
-        }
-        
-        for (int i = 0; i < toCopy.length; i++) {
-            File src = new File(fromDir, toCopy[i]);
-            File dest = new File(toDir, mapper.mapFileName(toCopy[i])[0]);
-            map.put( src.getAbsolutePath(), dest.getAbsolutePath() );
-        }
-    }
-
-    /**
-     * Actually does the file (and possibly empty directory) copies.
-     * This is a good method for subclasses to override.
-     */
-    protected void doFileOperations() {
-        if (fileCopyMap.size() > 0) {
-            log("Copying " + fileCopyMap.size() + 
-                " file" + (fileCopyMap.size() == 1 ? "" : "s") + 
-                " to " + destDir.getAbsolutePath() );
-
-            Enumeration e = fileCopyMap.keys();
-            while (e.hasMoreElements()) {
-                String fromFile = (String) e.nextElement();
-                String toFile = (String) fileCopyMap.get(fromFile);
-
-                if( fromFile.equals( toFile ) ) {
-                    log("Skipping self-copy of " + fromFile, verbosity);
-                    continue;
-                }
-
-                try {
-                    log("Copying " + fromFile + " to " + toFile, verbosity);
-                    
-                    FilterSetCollection executionFilters = new FilterSetCollection();
-                    if (filtering) {
-                        executionFilters.addFilterSet(project.getGlobalFilterSet());
-                    }
-                    for (Enumeration filterEnum = filterSets.elements(); filterEnum.hasMoreElements();) {
-                        executionFilters.addFilterSet((FilterSet)filterEnum.nextElement());
-                    }
-                    fileUtils.copyFile(fromFile, toFile, executionFilters,
-                                       forceOverwrite, preserveLastModified);
-                } catch (IOException ioe) {
-                    String msg = "Failed to copy " + fromFile + " to " + toFile
-                        + " due to " + ioe.getMessage();
-                    throw new BuildException(msg, ioe, location);
-                }
-            }
-        }
-
-        if (includeEmpty) {
-            Enumeration e = dirCopyMap.elements();
-            int count = 0;
-            while (e.hasMoreElements()) {
-                File d = new File((String)e.nextElement());
-                if (!d.exists()) {
-                    if (!d.mkdirs()) {
-                        log("Unable to create directory " + d.getAbsolutePath(), Project.MSG_ERR);
-                    } else {
-                        count++;
-                    }
-                }
-            }
-
-            if (count > 0) {
-                log("Copied " + count + 
-                    " empty director" + 
-                    (count==1?"y":"ies") + 
-                    " to " + destDir.getAbsolutePath());
-            }
-        }
-    }
-
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseFileUtils.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseFileUtils.java
deleted file mode 100644
index 48d73c0..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseFileUtils.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.eclipse.ant.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-
-import org.apache.tools.ant.types.FilterSetCollection;
-import org.apache.tools.ant.util.FileUtils;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-/**
- * Subclasses FileUtiles from Ant to extend its
- * funtionalities.
- */
-public class EclipseFileUtils extends FileUtils {
-
-	/** Indicates the default string encoding on this platform */
-	private static String defaultEncoding = new java.io.InputStreamReader(new java.io.ByteArrayInputStream(new byte[0])).getEncoding();
-
-	/** instance of this library */
-	private static final String LIBRARY_NAME = "core_2_0_5";
-	private static boolean hasNatives = false;
-	
-	static {
-		try {
-			System.loadLibrary(LIBRARY_NAME);
-			hasNatives = true;
-		} catch (UnsatisfiedLinkError e) {
-			logMissingNativeLibrary(e);
-		}
-	}
-	
-public void copyFile(File sourceFile, File destFile, FilterSetCollection filters, boolean overwrite, boolean preserveLastModified) throws IOException {
-	super.copyFile(sourceFile, destFile, filters, overwrite, preserveLastModified);
-	if (hasNatives)
-		internalCopyAttributes(toPlatformBytes(sourceFile.getAbsolutePath()), toPlatformBytes(destFile.getAbsolutePath()), preserveLastModified);
-}
-/**
- * Copies file attributes from source to destination. The copyLastModified attribute
- * indicates whether the lastModified attribute should be copied.
- */
-protected static boolean copyAttributes(String source, String destination, boolean copyLastModified) {
-	if (hasNatives)
-		return internalCopyAttributes(toPlatformBytes(source), toPlatformBytes(destination), false);
-	return false; // not supported
-}
-/**
- * Copies file attributes from source to destination. The copyLastModified attribute
- * indicates whether the lastModified attribute should be copied.
- */
-private static final native boolean internalCopyAttributes(byte[] source, byte[] destination, boolean copyLastModified);
-
-private static void logMissingNativeLibrary(UnsatisfiedLinkError e) {
-	String libName = System.mapLibraryName(LIBRARY_NAME);
-	String message = Policy.bind("info.couldNotLoadLibrary", libName);
-	IStatus status = new Status(IStatus.INFO, AntPlugin.PI_ANT, IStatus.INFO, message, e);
-	AntPlugin.getPlugin().getLog().log(status);
-}
-/**
- * Calling String.getBytes() creates a new encoding object and other garbage.
- * This can be avoided by calling String.getBytes(String encoding) instead.
- */
-protected static byte[] toPlatformBytes(String target) {
-	if (defaultEncoding == null)
-		return target.getBytes();
-	// try to use the default encoding
-	try {
-		return target.getBytes(defaultEncoding);
-	} catch (UnsupportedEncodingException e) {
-		// null the default encoding so we don't try it again
-		defaultEncoding = null;
-		return target.getBytes();
-	}
-}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseJavac.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseJavac.java
deleted file mode 100644
index 0b3f29a..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseJavac.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "The Jakarta Project", "Ant", and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-import org.apache.tools.ant.taskdefs.Javac;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.types.Path;
-import java.io.File;
-import org.apache.tools.ant.DirectoryScanner;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.compilers.CompilerAdapter;
-
-/**
- * Ant task which replaces the standard Ant Javac task.  This version of the task
- * uses a special compiler adapter factory which in turn uses the Ant plug-in's
- * object class registry to find the class to use for compiler adapters.  This is required
- * because of the platform's classloading strategy.
- * <p>
- * This task can be used as a direct replacement for the original Javac task
- * </p>
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- */
-
-public class EclipseJavac extends Javac {
-	
-/**
- * Executes the task.
- * 
- * @exception BuildException thrown if a problem occurs during execution
- */
-public void execute() throws BuildException {
-	// first off, make sure that we've got a srcdir
-
-	Path src = getSrcdir();
-	if (src == null)
-		throw new BuildException(Policy.bind("exception.missingSrcAttribute"), location);
-	String[] list = src.list();
-	if (list.length == 0)
-		throw new BuildException(Policy.bind("exception.missingSrcAttribute"), location);
-
-	File destDir = getDestdir();
-	if (destDir != null && !destDir.isDirectory())
-		throw new BuildException(Policy.bind("exception.missingDestinationDir",destDir.toString()), location);
-
-	// scan source directories and dest directory to build up 
-	// compile lists
-	resetFileLists();
-	for (int i = 0; i < list.length; i++) {
-		File srcDir = (File) project.resolveFile(list[i]);
-		if (!srcDir.exists()) {
-			throw new BuildException(Policy.bind("exception.missingSourceDir",srcDir.getPath()), location);
-		}
-
-		DirectoryScanner ds = this.getDirectoryScanner(srcDir);
-
-		String[] files = ds.getIncludedFiles();
-
-		scanDir(srcDir, destDir != null ? destDir : srcDir, files);
-	}
-
-	// compile the source files
-
-	String compiler = project.getProperty("build.compiler");
-	if (compiler == null) {
-		if (Project.getJavaVersion().startsWith("1.3")) {
-			compiler = "modern";
-		} else {
-			compiler = "classic";
-		}
-	}
-
-	if (compileList.length > 0) {
-
-		CompilerAdapter adapter = EclipseCompilerAdapterFactory.getCompiler(compiler, this);
-		log(Policy.bind("info.compiling"));
-
-		// now we need to populate the compiler adapter
-		adapter.setJavac(this);
-
-		// finally, lets execute the compiler!!
-		if (!adapter.execute()) {
-			if (failOnError) {
-				throw new BuildException(Policy.bind("error.compileFailed"), location);
-			} else {
-				log(Policy.bind("error.compileFailed"), Project.MSG_ERR);
-			}
-		}
-	}
-}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseProject.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseProject.java
deleted file mode 100644
index 5143345..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/EclipseProject.java
+++ /dev/null
@@ -1,288 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 1999 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowlegement may appear in the software itself,
- *    if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "The Jakarta Project", "Ant", and "Apache Software
- *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- *    nor may "Apache" appear in their names without prior written
- *    permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.apache.tools.ant.*;
-import java.io.*;
-import java.io.File;
-import java.io.IOException;
-import java.util.*;
-
-/**
- * An Ant project adapted to running inside the Eclipse Platform.  Because of the class
- * loading structure of the Eclipse platform, the standard techniques for creating instances 
- * of tasks and datatypes needs to be adapted.
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- */
-
-public class EclipseProject extends Project {
-/**
- * Creates a new project for use in running Ant inside the Eclipse Platform.
- */
-public EclipseProject() {
-	super();
-}
-/**
- * Creates and returns a new instance of the identified data type.
- * 
- * @return the new data type instance
- * @param typeName the name of the type to create
- * @exception BuildException thrown if a problem occurs during data type creation
- */
-public Object createDataType(String typeName) throws BuildException {
-	// First look in the types defined in the plugin extension points. If not
-	// found, do the super behaviour.
-	// check to see if the ant plugin is available.  If we are running from
-	// the command line (i.e., no platform) it will not be.
-	if (AntPlugin.getPlugin() == null)
-		return internalCreateDataType(typeName);
-	Map types = AntPlugin.getPlugin().getTypeExtensions();
-	if (types == null)
-		return internalCreateDataType(typeName);
-	IConfigurationElement declaration = (IConfigurationElement) types.get(typeName);
-	if (declaration == null)
-		return internalCreateDataType(typeName);
-	String className = declaration.getAttribute(AntPlugin.CLASS);
-	try {
-		Class typeClass = declaration.getDeclaringExtension().getDeclaringPluginDescriptor().getPluginClassLoader().loadClass(className);
-		addDataTypeDefinition(typeName, typeClass);
-	} catch (ClassNotFoundException e) {
-		return internalCreateDataType(typeName);
-	}
-	return internalCreateDataType(typeName);
-}
-/**
- * Creates and returns a new instance of the identified task.
- * 
- * @return the new task
- * @param taskName the name of the task to create
- * @exception BuildException thrown if a problem occurs during task creation
- */
-public Task createTask(String taskName) throws BuildException {
-	// First try to find if the task is defined in a plug-in. If not, call
-	// the super method.
-	// check to see if the ant plugin is available.  If we are running from
-	// the command line (i.e., no platform) it will not be.
-	if (AntPlugin.getPlugin() == null)
-		return super.createTask(taskName);
-	Map tasks = AntPlugin.getPlugin().getTaskExtensions();
-	if (tasks == null)
-		return super.createTask(taskName);
-	IConfigurationElement declaration = (IConfigurationElement) tasks.get(taskName);
-	if (declaration == null)
-		return super.createTask(taskName);
-	String className = declaration.getAttribute(AntPlugin.CLASS);
-	try {
-		Class taskClass = declaration.getDeclaringExtension().getDeclaringPluginDescriptor().getPluginClassLoader().loadClass(className);
-		addTaskDefinition(taskName, taskClass);
-	} catch (ClassNotFoundException e) {
-		return super.createTask(taskName);
-	}
-	return super.createTask(taskName);
-}
-/**
- * Sends a build finished notification to all registered listeners along with
- * the exception that caused the termination.
- * 
- * @param exception the exception to include with the notification
- */
-protected void fireBuildFinished(Throwable exception) {
-	super.fireBuildFinished(exception);
-}
-/**
- * Sends a build started notification to all registered listeners.
- */
-protected void fireBuildStarted() {
-	super.fireBuildStarted();
-}
-/**
- * Sends a target started notification to all the listeners when an execute target 
- * has just been started.
- */
-protected void fireExecuteTargetStarted(Target target) {
-    BuildEvent event = new BuildEvent(target);
-    Vector buildListeners = getBuildListeners();
-    for (int i = 0; i < buildListeners.size(); i++) {
-		if (buildListeners.elementAt(i) instanceof IAntRunnerListener) {
-			IAntRunnerListener listener = (IAntRunnerListener) buildListeners.elementAt(i);
-			listener.executeTargetStarted(event);
-		}
-	}
-}
-/**
- * Sends a target finished notification to all the listeners when an execute target
- * has just been finished.
- */
-protected void fireExecuteTargetFinished(Target target, Throwable exception) {
-    BuildEvent event = new BuildEvent(target);
-    event.setException(exception);
-    Vector buildListeners = getBuildListeners();
-    for (int i = 0; i < buildListeners.size(); i++) {
-		if (buildListeners.elementAt(i) instanceof IAntRunnerListener) {
-			IAntRunnerListener listener = (IAntRunnerListener) buildListeners.elementAt(i);
-			listener.executeTargetFinished(event);
-		}
-	}
-}
-/**
- * Initializes the receiver.
- * 
- * @exception BuildException thrown if a problem occurs during initialization.
- */
-public void init() throws BuildException {
-	super.init();
-	// add some additional tasks and datatypes.  Normally they would be found
-	// in the plugin.xml markup for the Ant Support plugin but if we are not running 
-	// the platform we need to add them here.  
-	addTaskDefinition("ant", EclipseAnt.class);
-	addTaskDefinition("javac", EclipseJavac.class);
-	addDataTypeDefinition("commapatternset", CommaPatternSet.class);
-	addDataTypeDefinition("command", CommandDataType.class);
-	System.setProperty("ant.regexp.matcherimpl", "org.eclipse.ant.core.XercesRegexpMatcher");
-	// initialize the datatype table with marker values so that the table contains
-	// the keys (needed while parsing) but don't load the classes to prevent plugin activation.
-	if (AntPlugin.getPlugin() == null)
-		return;
-	Map types = AntPlugin.getPlugin().getTypeExtensions();
-	if (types == null)
-		return;
-	for (Iterator i = types.keySet().iterator(); i.hasNext();) {
-		String typeName = (String)i.next();
-		if (getDataTypeDefinitions().get(typeName) == null)
-			addDataTypeDefinition(typeName, EclipseProject.class);
-	}
-}
-
-protected Object internalCreateDataType(String typeName) throws BuildException {
-    Class c = (Class) getDataTypeDefinitions().get(typeName);
-
-    if (c == null)
-        return null;
-
-    try {
-        java.lang.reflect.Constructor ctor = null;
-        boolean noArg = false;
-        // DataType can have a "no arg" constructor or take a single 
-        // Project argument.
-        try {
-            ctor = c.getConstructor(new Class[0]);
-            noArg = true;
-        } catch (NoSuchMethodException nse) {
-            ctor = c.getConstructor(new Class[] {Project.class});
-            noArg = false;
-        }
-
-        Object o = null;
-        if (noArg) {
-             o = ctor.newInstance(new Object[0]);
-        } else {
-             o = ctor.newInstance(new Object[] {this});
-        }
-        if (o instanceof ProjectComponent) {
-            ((ProjectComponent)o).setProject(this);
-        }
-        String msg = "   +DataType: " + typeName;
-        log (msg, MSG_DEBUG);
-        return o;
-    } catch (java.lang.reflect.InvocationTargetException ite) {
-        Throwable t = ite.getTargetException();
-        String msg = "Could not create datatype of type: "
-             + typeName + " due to " + t;
-        throw new BuildException(msg, t);
-    } catch (Throwable t) {
-        String msg = "Could not create datatype of type: "
-             + typeName + " due to " + t;
-        throw new BuildException(msg, t);
-    }
-}
-/**
- * Executes a target. Notification has been added: the build listener knows that a top level
- * target is being executed and when it is finished.
- * 
- * @see Project#executeTarget(String targetName)
- */
-public void executeTarget(String targetName) throws BuildException {
-	Target targetToExecute = (Target) getTargets().get(targetName);
-	if (targetToExecute == null)
-		// can happen if the user has specified a target name that is not valid
-		throw new BuildException(Policy.bind("exception.targetDoesNotExist", targetName));
-    try {
-        fireExecuteTargetStarted(targetToExecute);
-        super.executeTarget(targetName);
-        fireExecuteTargetFinished(targetToExecute, null);
-    } catch(RuntimeException exc) {
-        fireExecuteTargetFinished(targetToExecute, exc);
-        throw exc;
-    }
-}
-
-
-
-
-
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/IAntRunnerListener.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/IAntRunnerListener.java
deleted file mode 100644
index 4c064bc..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/IAntRunnerListener.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/IncrementalBuild.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/IncrementalBuild.java
deleted file mode 100644
index 7060357..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/IncrementalBuild.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.CoreException;
-import java.util.HashMap;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-
-/**
- * Ant task which runs the platform's incremental build facilities.
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- */
-
-public class IncrementalBuild extends Task {
-	private String builder;
-	private String project;
-	private int kind= IncrementalProjectBuilder.INCREMENTAL_BUILD;
-	private HashMap args= new HashMap(5);
-
-	/**
-	 * Unique identifier constant (value <code>"KIND_INCR"</code>)
-	 * indicating that an incremental build should be performed.
-	 */
-	public final static String KIND_INCR = "incr";
-	
-	/**
-	 * Unique identifier constant (value <code>"KIND_FULL"</code>)
-	 * indicating that a full build should be performed.
-	 */
-	public final static String KIND_FULL = "full";
-	
-	/**
-	 * Unique identifier constant (value <code>"KIND_AUTO"</code>)
-	 * indicating that an auto build should be performed.
-	 */
-	public final static String KIND_AUTO = "auto";
-	
-	/**
-	 * Inner class that represents a name-value pair.
-	 */
-	public class Argument {
-		private String name;
-
-		/**
-		 * Sets the name of this argument. 
-		 * @param name the name of this argument
-		 */
-		public void setName(String value) {
-			name= value;
-		}
-
-		/**
-		 * Sets the value of this argument. 
-		 * @param value the value of this argument
-		 */
-		public void setValue(String value) {
-			if (value == null)
-				args.remove(name);
-			else
-				args.put(name, value);
-		}
-	}
-
-/**
- * Constructs an <code>IncrementalBuild</code> instance.
- */
-public IncrementalBuild() {
-	super();
-}
-/**
- * Creates and returns a new <code>Argument</code>.
- * 
- * @return the new argument
- */
-public Argument createArgument() {
-	return new Argument();
-}
-/**
- * Executes this task.
- * 
- * @exception BuildException thrown if a problem occurs during execution
- */
-public void execute() throws BuildException {
-	try {
-		if (project == null) {
-			ResourcesPlugin.getWorkspace().build(kind, null);
-		} else {
-			IProject target= ResourcesPlugin.getWorkspace().getRoot().getProject(project);
-			if (builder == null)
-				target.build(kind, null);
-			else
-				target.build(kind, builder, args, null);
-		}
-	} catch (CoreException e) {
-		throw new BuildException(e);
-	}
-}
-/**
- * Sets the name of the receiver's builder.
- * 
- * @param value the name of the receiver's builder
- */
-public void setBuilder(String value) {
-	builder= value;
-}
-/**
- * Sets the receiver's kind> attribute.  This value must be one
- * of <code>IncrementalBuild.KIND_FULL</code>, <code>IncrementalBuild.KIND_AUTO</code>,
- * <code>IncrementalBuild.KIND_INCR</code>.
- * 
- * @param kind the receiver's kind attribute
- */
-public void setKind(String value) {
-	if (IncrementalBuild.KIND_FULL.equalsIgnoreCase(value))
-		kind= IncrementalProjectBuilder.FULL_BUILD;
-	else if (IncrementalBuild.KIND_AUTO.equalsIgnoreCase(value))
-		kind= IncrementalProjectBuilder.AUTO_BUILD;
-	else if (IncrementalBuild.KIND_INCR.equalsIgnoreCase(value))
-		kind= IncrementalProjectBuilder.INCREMENTAL_BUILD;
-}
-/**
- * Sets the receiver's target project.
- * 
- * @param value the receiver's target project
- */
-public void setProject(String value) {
-	project= value;
-}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/MoveProject.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/MoveProject.java
deleted file mode 100644
index f5c4240..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/MoveProject.java
+++ /dev/null
@@ -1,276 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.util.*;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.apache.tools.ant.*;
-
-/**
- * An Ant task which moves an existing Eclipse project.
- * <p>
- * The name of the project to move (source), its new name (destination) and the "force" attribute 
- * must be specified.<br>
- * The directory where the project is located on the file system, the comment, the nature(s)
- * and the referenced projects are optional. If the directory is not specified, the project 
- * will just be renamed after the new name. The user can specify "null" for the location if he wants
- * the project to be moved in the default workspace directory.<br>
- * It is also possible to define commands with nested elements.
- * <p><p>
- * Example:<p>
- *	&lt;eclipse.moveProject source="Foo" destination="Bar" location="D:\MyWork\My Project"/&gt;
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- * @see IProject#move
- */
-public class MoveProject extends Task {
-	
-	/**
-	 * The name of the source project.
-	 */
-	private String source = null;
-	
-	/**
-	 * The name of the project after it has been moved.
-	 */
-	private String destination = null;
-	
-	/**
-	 * The force attribute.
-	 */
-	private boolean force;
-	// variable used to know if the user has actually set the "force" attribute
-	private boolean isForceSet = false;
-
-	/**
-	 * The folder where the user wants to move the project.
-	 */
-	private IPath location = null;
-	// variable used to know if the user has specified "null" or not
-	private boolean isLocationSet = false;
-	
-	/**
-	 * The natures, if the user wants to modify them.
-	 */
-	private String[] natures = null;
-	
-	/**
-	 * The comment, if the user wants to modify it
-	 */
-	private String comment = null;
-	
-	/**
-	 * The projects that the project references, if the user wants to modify them
-	 */
-	private IProject[] referencedProjects = null;
-
-	/**
-	 * The builders and their arguments (commands), if the user wants to modify them
-	 */
-	private Vector commands;
-	
-
-/**
- * Constructs a new <code>MoveProject</code> instance.
- */
-public MoveProject() {
-	super();
-	commands = new Vector();
-}
-
-/**
- * Performs the project move operation.
- * 
- * @exception BuildException thrown if a problem occurs during execution.
- */
-public void execute() throws BuildException {
-	
-	validateAttributes();
-	
-	IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(source);
-	
-	try {
-		if (!newProject.exists()) 
-			throw new BuildException(Policy.bind("exception.projectDoesntExist", source));
-			
-		IProject temp = ResourcesPlugin.getWorkspace().getRoot().getProject(destination);
-		if (temp.exists())
-			throw new BuildException(Policy.bind("exception.nameAlreadyUsed", destination));		
-			
-		if (!newProject.isOpen())
-			newProject.open(null);
-		
-		IProjectDescription desc = newProject.getDescription();
-		desc.setName(destination);
-		setLocationToDescription(newProject, desc);
-
-		if (natures != null)
-			desc.setNatureIds(natures);
-		if (comment != null)
-			desc.setComment(comment);
-		if (referencedProjects != null)
-			desc.setReferencedProjects(referencedProjects);
-		if (!commands.isEmpty())
-			desc.setBuildSpec(createCommands(desc));
-			
-		newProject.move(desc, force, null);
-		
-	} catch (CoreException e) {
-		throw new BuildException(e);
-	}
-}
-
-protected void setLocationToDescription(IProject newProject, IProjectDescription desc) {
-	if (isLocationSet && location!= null && !ResourcesPlugin.getWorkspace().validateProjectLocation(newProject, location).isOK())
-		// the user wants to change the location.
-		// location can be null if the user set the attribute to "null" in order to copy the folder in the default workspace directory
-		throw new BuildException(Policy.bind("exception.folderAlreadyUsedForAnotherProject"));
-
-	desc.setLocation(location);			
-}
-
-protected ICommand[] createCommands(IProjectDescription description) {
-	ICommand[] commandArray = new ICommand[commands.size()];
-	int index = 0;
-	for (Iterator i = commands.iterator(); i.hasNext();) {
-		CommandDataType b = (CommandDataType) i.next();
-		commandArray[index] = description.newCommand();
-		// needs the project of this target to be able to get the name and the arguments
-		commandArray[index].setBuilderName(b.getName(project));
-		commandArray[index].setArguments(b.getArguments(project));
-		index++;
-	}
-	return commandArray;
-}
-
-/**
- * Sets the name of the project that the user wants to move.
- * 
- * @param the name of the project		
- */
-public void setSource(String value) {
-	source = value;
-}
-
-/**
- * Sets the new name for the project.
- * 
- * @param the new name	
- */
-public void setDestination(String value) {
-	destination = value;
-}
-
-/**
- * Sets the directory where the project will be moved. The parameter is a String
- * and not a File because the user can specify "null" if he wants to refer to the
- * default workspace directory.
- * 
- * @param the name of the folder or "null" for the default workspace directory
- */
-public void setLocation(String value) {
-	isLocationSet = true;
-	if (value.equals("null"))
-		// we leave the location as it currently is (i.e. null)
-		return;
-	location = new Path(value);
-	if (!location.isAbsolute()) {
-		// the location can be relative if the user used a period in the path
-		org.eclipse.core.runtime.Path defaultPath = new org.eclipse.core.runtime.Path(project.getBaseDir().toString());
-		location = defaultPath.append(location);
-	}
-}
-
-/**
- * Sets the force attribute.
- * 
- * @param true/false		
- */
-public void setForce(boolean value) {
-	force = value;
-	isForceSet = true;
-}
-
-/**
- * Sets the natures for the project. They are given as a list of nature identifers
- * separated by a coma.
- * 
- * @param the natures specified by the user
- */
-public void setNatures(String value) {
-	StringTokenizer tokenizer = new StringTokenizer(value, ",");
-	Vector vect = new Vector(1);
-	while (tokenizer.hasMoreTokens())
-		vect.add(((String)tokenizer.nextToken()).trim());
-	natures = new String[vect.size()];
-	vect.toArray(natures);
-}
-
-/**
- * Sets the comment for the project.
- * 
- * @param the comment
- */
-public void setComment(String value) {
-	comment = value;
-}
-
-/**
- * Sets the projects that the project references. They are given as a list of project names
- * separated by a coma.
- * 
- * @param the natures specified by the user
- */
-public void setReferencedProjects(String value) {
-	StringTokenizer tokenizer = new StringTokenizer(value, ",");
-	Vector vect = new Vector(1);
-	while (tokenizer.hasMoreTokens()) {
-		IProject currentProject = ResourcesPlugin.getWorkspace().getRoot().getProject(((String) tokenizer.nextToken()).trim());
-		if (currentProject.exists())
-			vect.add(currentProject);
-		else
-			throw new BuildException(Policy.bind("exception.unknownProject", currentProject.getName()));
-	}
-		
-	referencedProjects = new IProject[vect.size()];
-	vect.toArray(referencedProjects);
-}
-
-/**
- * Adds a CommandDataType object to the set of commands specified for this project.
- * 
- * @param the command
- */
-public void addCommand(CommandDataType command) {
-	commands.add(command);
-}
-
-/**
- * Performs a validation of the receiver.
- * 
- * @exception BuildException thrown if a problem occurs during validation.
- */
-protected void validateAttributes() throws BuildException {
-	if (source == null) 
-		throw new BuildException(Policy.bind("exception.sourceNotSpecified"));
-
-	if (destination == null) 
-		throw new BuildException(Policy.bind("exception.destinationNotSpecified"));
-		
-	if (location!= null && !location.isValidPath(location.toOSString()))
-		throw new BuildException(Policy.bind("exception.invalidPath", location.toOSString()));
-	
-	if (!isForceSet)
-		throw new BuildException(Policy.bind("exception.forceNotSpecified"));
-}
-
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Policy.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Policy.java
deleted file mode 100644
index 44f46e1..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/Policy.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/RefreshLocal.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/RefreshLocal.java
deleted file mode 100644
index 8995f69..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/RefreshLocal.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import java.util.Vector;
-import org.apache.tools.ant.*;
-import org.apache.tools.ant.types.PatternSet;
-
-/**
- * An Ant task which refreshes the Eclipse Platform's view of the local filesystem.
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- * @see IResource#refreshLocal
- */
-public class RefreshLocal extends Task {
-	/**
-	 * Unique identifier constant (value <code>"DEPTH_ZERO"</code>)
-	 * indicating that refreshes should be performed only on the target
-	 * resource itself
-	 */
-	public static final String DEPTH_ZERO = "zero";
-	
-	/**
-	 * Unique identifier constant (value <code>"DEPTH_ONE"</code>)
-	 * indicating that refreshes should be performed on the target
-	 * resource and its children
-	 */
-	public static final String DEPTH_ONE = "one";
-	
-	/**
-	 * Unique identifier constant (value <code>"DEPTH_INFINITE"</code>)
-	 * indicating that refreshes should be performed on the target
-	 * resource and all of its recursive children
-	 */
-	public static final String DEPTH_INFINITE = "infinite";
-	
-	/**
-	 * The resource to refresh.
-	 */
-	protected IResource resource;
-	
-	/**
-	 * The depth to refresh to.
-	 */
-	protected int depth = IResource.DEPTH_INFINITE;
-	
-	private IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-/**
- * Constructs a new <code>RefreshLocal</code> instance.
- */
-public RefreshLocal() {
-	super();
-}
-
-/**
- * Performs the refresh operation.
- * 
- * @exception BuildException thrown if a problem occurs during execution.
- */
-public void execute() throws BuildException {
-	// make sure we don't have an illegal set of options
-	validateAttributes();
-
-	// deal with the single resource
-	if (resource != null) {
-		if (!resource.exists())
-			throw new BuildException(Policy.bind("exception.resourceNotFound",resource.toString()));
-		try {
-			resource.refreshLocal(depth, null);
-			return;
-		} catch (CoreException e) {
-			throw new BuildException(e);
-		}
-	} else
-		throw new BuildException(Policy.bind("exception.resourceNotSpecified"));
-}
-/**
- * Refreshes a collection of resources.
- * 
- * @param resources the names of the resources to refresh
- * @exception BuildException thrown if a problem occurs during refresh
- */
-protected void refreshResources(String[] resources) throws BuildException {
-	for (int i = 0; i < resources.length; i++) {
-		IResource target = root.findMember(resources[i]);
-		if (target == null)
-			throw new BuildException(Policy.bind("exception.resourceNotFound",resources[i].toString()));
-		try {
-			target.refreshLocal(depth, null);
-		} catch (CoreException e) {
-			throw new BuildException(e);
-		}
-	}
-}
-
-/**
- * Sets the depth of this task appropriately.  The specified argument must
- * by one of <code>RefreshLocal.DEPTH_ZERO</code>, <code>RefreshLocal.DEPTH_ONE</code>
- * or <code>RefreshLocal.DEPTH_INFINITE</code>.
- * 
- * @param value the depth to refresh to		
- */
-public void setDepth(String value) {
-	if (DEPTH_ZERO.equalsIgnoreCase(value))
-		depth = IResource.DEPTH_ZERO;
-	else
-		if (DEPTH_ONE.equalsIgnoreCase(value))
-			depth = IResource.DEPTH_ONE;
-		else
-			if (DEPTH_INFINITE.equalsIgnoreCase(value))
-				depth = IResource.DEPTH_INFINITE;
-}
-
-/**
- * Sets the root of the workspace resource tree to refresh.
- * 
- * @param value the root value
- */
-public void setResource(String value) {
-	resource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(value));
-}
-
-/**
- * Performs a validation of the receiver.
- * 
- * @exception BuildException thrown if a problem occurs during validation.
- */
-protected void validateAttributes() throws BuildException {
-}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/XercesRegexpMatcher.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/XercesRegexpMatcher.java
deleted file mode 100644
index 4b670e3..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/XercesRegexpMatcher.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.eclipse.ant.core;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.apache.tools.ant.util.regexp.RegexpMatcher;
-import org.apache.xerces.utils.regex.RegularExpression;
-import org.apache.xerces.utils.regex.Match;
-import java.util.Vector;
-import org.apache.tools.ant.BuildException;
-
-/**
- * An Ant regular expression matcher adapted to use the Xerces XML parser.
- * This implementation is the standard one used when running Ant inside the
- * Eclipse platform using the <code>AntRunner</code>.
- * <p>
- * <b>Note:</b> This class/interface is part of an interim API that is still under 
- * development and expected to change significantly before reaching stability. 
- * It is being made available at this early stage to solicit feedback from pioneering 
- * adopters on the understanding that any code that uses this API will almost 
- * certainly be broken (repeatedly) as the API evolves.
- * </p>
- */
-
-public class XercesRegexpMatcher implements RegexpMatcher {
-	private RegularExpression regexp;
-
-/**
- * Creates a new Xerces based regular expression matcher.
- */
-public XercesRegexpMatcher() {
-	super();
-}
-/**
- * Returns a collection of matched groups found in an argument.
- *
- * <p>Group 0 will be the full match, the rest are the
- * parenthesized subexpressions</p>.
- * 
- * @return the collection of matched groups found in the argument.
- * @param argument the argument
- */
-public Vector getGroups(String argument) {
-	Match match = new Match();
-	if (!regexp.matches(argument, match))
-		return null;
-	int count = match.getNumberOfGroups();
-	Vector result = new Vector(count);
-	for (int i = 0; i < count; i++) {
-		result.add(match.getCapturedText(i));
-	}
-	return result;
-}
-/**
- * Returns a string representation of the receiver
- * 
- * @return a string representation of the receiver
- */
-public String getPattern() {
-	return regexp.getPattern();
-}
-/**
- * Returns a <code>boolean</code> indicating whether an argument
- * matches with the receiver.
- * 
- * @return a <code>boolean</code> indicating whether an argument
- * matches with the receiver.
- * @param argument the argument to match with the receiver
- */
-public boolean matches(String argument) {
-	return regexp.matches(argument);
-}
-
-/**
- * Sets the receiver's pattern.
- * 
- * @param pattern the pattern value
- * @exception BuildException thrown if a problem occurs setting the pattern
- */
-public void setPattern(String pattern) throws BuildException {
-	if (regexp == null)
-		regexp = new RegularExpression(pattern);
-	else
-		regexp.setPattern(pattern);
-}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/messages.properties b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/messages.properties
deleted file mode 100644
index 44c1e55..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/messages.properties
+++ /dev/null
@@ -1,90 +0,0 @@
-### Ant Core plugin message catalog
-
-### labels
-label.buildFile = Build file: {0}
-label.mainTargets = Main targets:
-label.subTargets = Subtargets:
-label.defaultTarget = Default target:
-
-### usage
-usage.options = options
-usage.target = target
-usage.Options = Options
-usage.printMessage = print this message
-usage.projectHelp = print project help information
-usage.versionInfo = print the version information and exit
-usage.beQuiet = be extra quiet
-usage.beVerbose = be extra verbose
-usage.printDebugInfo = print debugging information
-usage.emacsLog = produce logging information without adornments
-usage.useFile = use given file for log
-usage.logClass = the class which is to perform logging
-usage.listenerClass = add an instance of class as a project listener
-usage.fileToBuild = use given buildfile
-usage.propertiesValues = use value for given property
-usage.findFileToBuild = search for buildfile towards the root of the filesystem and use it
-usage.antVersion = Ant version 
-usage.compiledOn =  compiled on 
-
-
-
-### info
-info.compiling = Compiling source files
-info.searchingFor = Searching for: {0} ...
-info.searchingIn = Searching in: {0} ...
-info.couldNotLoadLibrary = Could not load library: {0}.
-
-### error
-error.compileFailed = Compile failed; messages should have been provided.
-error.buildFailed = Build Failed.
-
-### exception
-exception.antTaskCallingParentTarget = Ant task calling its own parent target.
-exception.buildFileIsDirectory = Build file is a directory: {0}
-exception.buildFileNotFound = Build file not found: {0}
-exception.cannotAppendToReference = Cannot append to a reference.
-exception.cannotCreateListener = Unable to instantiate listener: {0}
-exception.cannotCreateLogger = Unable to instantiate logger: {0}
-exception.cannotLoadVersionInfo = Could not load the version information. {0}
-exception.cannotSetOutput = Ant cannot set output to: {0}
-exception.cannotWriteToLog = Cannot write on the specified log file.  Make sure the path exists and you have write permissions.
-exception.classNotFound = Class not found: {0}
-exception.classNotCompiler = Class is not a compiler adapter: {0}
-exception.creationProblem = Exception creating: {0}
-exception.loggerDoesNotImplementInterface = The specified logger class does not implement the BuildLogger interface: {0}
-exception.missingBuildFile = You must specify a build file when using the -buildfile argument.
-exception.missingClassName = You must specify a class name when using the -listener argument.
-exception.missingDestinationDir = Destination directory does not exist or is not a directory: {0}
-exception.missingExcludesFile = Excludes file not found: {0}
-exception.missingIncludesFile = Includes file not found: {0}
-exception.missingLogFile = You must specify a log file when using the -log argument.
-exception.missingSrcAttribute = srcdir attribute must be set.
-exception.missingSourceDir = srcdir does not exist: {0}
-exception.multipleLoggers = Only one logger class may be specified.
-exception.noBuildFile = Could not locate a build file.
-exception.noParser = No JAXP compliant XML parser found. See http://java.sun.com/xml for the reference implementation.
-exception.notAPatternSet = Not a patternset: {0}
-exception.patternFile = An error occured while reading pattern file: {0}
-exception.resourceNotFound = Resource not found: {0}
-exception.unknownArgument = Unknown argument: {0}
-exception.sourceNotSpecified = The attribute "source" must be specified.
-exception.forceNotSpecified = The attribute "force" must be specified.
-exception.deleteContentNotSpecified = The attribute "deleteContent" must be specified.
-exception.projectDoesntExist = The project "{0}" does not exist.
-exception.nameAlreadyUsed = The name "{0}" is already used for another project.
-exception.destinationNotSpecified = The attribute destination must be specified.
-exception.invalidPath = Invalid path: {0}.
-exception.propertyAndPathIdNotSpecified = At least one of the "property" or "pathId" attributes must be specified.
-exception.cantUseBoth = "fileSystemPath" and "resourcePath" can't be used at the same time.
-exception.mustHaveOneAttribute = "fileSystemPath" or "resourcePath" must be specified.
-exception.pathNotValid = The path "{0}" for the resource is not a valid path as the first segment does not represent a project.
-exception.noProjectMatchThePath = The path "{0}" doesn't match any existing project.
-exception.unknownProject = The project "{0}" does not exist.
-exception.commandMustHaveName = The attribute "name" must be set for the command.
-exception.doesntDenoteACommand = {0} doesn't denote a command.
-exception.noAttributes = You must not specify any attribute when using refid.
-exception.noNestedElements = You must not define nested elements when using refid.
-exception.folderAlreadyUsedForAnotherProject = Project content location overlaps with an existing project's content location.
-exception.cantCopyProjectInSameFolder = You must specify a location for the project to copy because it is already located in a specific folder ("{0}").
-exception.resourceNotSpecified = The resource attribute must be specified with a valid existing resource name.
-exception.targetDoesNotExist = The target "{0}" does not exist.
\ 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 d737de8..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=windows-1252">
-   <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.ui/.classpath b/ant/org.eclipse.ant.ui/.classpath
deleted file mode 100644
index b07cb74..0000000
--- a/ant/org.eclipse.ant.ui/.classpath
+++ /dev/null
@@ -1,13 +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="/org.eclipse.core.boot"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.eclipse.core.resources"/>
-    <classpathentry kind="src" path="/org.eclipse.ant.core"/>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="src" path="/org.eclipse.swt"/>
-    <classpathentry kind="src" path="/org.eclipse.ui"/>
-    <classpathentry kind="src" path="/org.apache.ant"/>
-    <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 c5e82d7..0000000
--- a/ant/org.eclipse.ant.ui/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/.vcm_meta b/ant/org.eclipse.ant.ui/.vcm_meta
deleted file mode 100644
index b877ca5..0000000
--- a/ant/org.eclipse.ant.ui/.vcm_meta
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project-description>
-	<nature id="org.eclipse.jdt.core.javanature"/>
-	<reference project-name="org.apache.ant"/>
-	<reference project-name="org.eclipse.ant.core"/>
-	<reference project-name="org.eclipse.core.boot"/>
-	<reference project-name="org.eclipse.core.resources"/>
-	<reference project-name="org.eclipse.core.runtime"/>
-	<reference project-name="org.eclipse.swt"/>
-	<reference project-name="org.eclipse.ui"/>
-	<builder name="org.eclipse.jdt.core.javabuilder">
-	</builder>
-</project-description>
diff --git a/ant/org.eclipse.ant.ui/about.html b/ant/org.eclipse.ant.ui/about.html
deleted file mode 100644
index 768324e..0000000
--- a/ant/org.eclipse.ant.ui/about.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<head>
-<title>About</title>
-<style type="text/css">
-p, table, td, th { font-family: arial, helvetica, geneva; font-size: 10pt}
-pre { font-family: "Courier New", Courier, mono; font-size: 10pt}
-h2 { font-family: arial, helvetica, geneva; font-size: 18pt; font-weight: bold ; line-height: 14px}
-code { font-family: "Courier New", Courier, mono; font-size: 10pt}
-sup { font-family: arial,helvetica,geneva; font-size: 10px}
-h3 { font-family: arial, helvetica, geneva; font-size: 14pt; font-weight: bold}
-li { font-family: arial, helvetica, geneva; font-size: 10pt}
-h1 { font-family: arial, helvetica, geneva; font-size: 28px; font-weight: bold}
-body { font-family: arial, helvetica, geneva; font-size: 10pt; clip: rect(   ); margin-top: 5mm; margin-left: 3mm}
-</style>
-</head>
-<body lang="EN-US" link="blue" vlink="purple">
-<table border="0" cellspacing="5" cellpadding="2" width="100%" >
-  <tr> 
-    <td align="LEFT" valign="TOP" colspan="2" bgcolor="#0080C0"><b><font color="#FFFFFF">About This Content</font></b></td>
-  </tr>
-  <tr> 
-    <td> 
-<p>11th December, 2001</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in &quot;Content&quot;.  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-<a href="http://www.eclipse.org/legal/cpl-v05.html">Common Public License Version 0.5</a> &quot;CPL&quot;.  For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL &quot;Other License&quot;, any modifications, enhancements and/or
-other code and/or documentation &quot;Modifications&quot; uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/build.properties b/ant/org.eclipse.ant.ui/build.properties
deleted file mode 100644
index 4b8a87b..0000000
--- a/ant/org.eclipse.ant.ui/build.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-source.antui.jar=src/
-bin.includes=icons/,plugin.xml,*.jar,plugin.properties,about.html
-javadoc.packages=org.eclipse.*
diff --git a/ant/org.eclipse.ant.ui/icons/basic/clcl16/clear.gif b/ant/org.eclipse.ant.ui/icons/basic/clcl16/clear.gif
deleted file mode 100644
index 2558326..0000000
--- a/ant/org.eclipse.ant.ui/icons/basic/clcl16/clear.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/basic/clcl16/hideOrShowTree.gif b/ant/org.eclipse.ant.ui/icons/basic/clcl16/hideOrShowTree.gif
deleted file mode 100644
index 5a8c7ea..0000000
--- a/ant/org.eclipse.ant.ui/icons/basic/clcl16/hideOrShowTree.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/basic/clcl16/showOnlySelectedText.gif b/ant/org.eclipse.ant.ui/icons/basic/clcl16/showOnlySelectedText.gif
deleted file mode 100644
index be9eb92..0000000
--- a/ant/org.eclipse.ant.ui/icons/basic/clcl16/showOnlySelectedText.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/basic/cview16/ant_view.gif b/ant/org.eclipse.ant.ui/icons/basic/cview16/ant_view.gif
deleted file mode 100644
index 0165a50..0000000
--- a/ant/org.eclipse.ant.ui/icons/basic/cview16/ant_view.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/basic/eview16/ant_view.gif b/ant/org.eclipse.ant.ui/icons/basic/eview16/ant_view.gif
deleted file mode 100644
index 76be436..0000000
--- a/ant/org.eclipse.ant.ui/icons/basic/eview16/ant_view.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/basic/wizban/ant_wiz.gif b/ant/org.eclipse.ant.ui/icons/basic/wizban/ant_wiz.gif
deleted file mode 100644
index c4aaf15..0000000
--- a/ant/org.eclipse.ant.ui/icons/basic/wizban/ant_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/full/clcl16/clear.gif b/ant/org.eclipse.ant.ui/icons/full/clcl16/clear.gif
deleted file mode 100644
index 2558326..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/clcl16/clear.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/full/clcl16/hideOrShowTree.gif b/ant/org.eclipse.ant.ui/icons/full/clcl16/hideOrShowTree.gif
deleted file mode 100644
index 5a8c7ea..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/clcl16/hideOrShowTree.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/full/clcl16/showOnlySelectedText.gif b/ant/org.eclipse.ant.ui/icons/full/clcl16/showOnlySelectedText.gif
deleted file mode 100644
index be9eb92..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/clcl16/showOnlySelectedText.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/full/cview16/ant_view.gif b/ant/org.eclipse.ant.ui/icons/full/cview16/ant_view.gif
deleted file mode 100644
index 03e30a2..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/cview16/ant_view.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/full/eview16/ant_view.gif b/ant/org.eclipse.ant.ui/icons/full/eview16/ant_view.gif
deleted file mode 100644
index eba5891..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/eview16/ant_view.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/full/eview16/build_exec.gif b/ant/org.eclipse.ant.ui/icons/full/eview16/build_exec.gif
deleted file mode 100644
index 20e7bae..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/eview16/build_exec.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/full/wizban/ant_wiz.gif b/ant/org.eclipse.ant.ui/icons/full/wizban/ant_wiz.gif
deleted file mode 100644
index 42754e5..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/wizban/ant_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/plugin.properties b/ant/org.eclipse.ant.ui/plugin.properties
deleted file mode 100644
index 249f8bf..0000000
--- a/ant/org.eclipse.ant.ui/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-antActionSetLabel = Ant
-antBuilderPropertyName=Tool Script Builders
-antConsole = Ant Console
-antConsolePreferences = Console
-antLauncher = Ant Targets
-antPreferences = Ant Preferences
-executeAntLabel = Run Ant Script
-executeAntTooltip =  Run Ant script
-executeToolScriptLabel = Run Tool &Script...
-pluginName = Ant Build Tool UI
-runAnt = Run &Ant...
-runAntTip = Run Ant with the selected build file
diff --git a/ant/org.eclipse.ant.ui/plugin.xml b/ant/org.eclipse.ant.ui/plugin.xml
deleted file mode 100644
index ceb49e4..0000000
--- a/ant/org.eclipse.ant.ui/plugin.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<plugin
-  name = "%pluginName"
-  id="org.eclipse.ant.ui"
-  version = "2.0.2"
-  provider-name = "Object Technology International, Inc."
-  class="org.eclipse.ant.internal.ui.AntUIPlugin">
-
-  <requires>
-    <import plugin="org.eclipse.ui"/>
-    <import plugin="org.eclipse.core.resources"/>
-    <import plugin="org.eclipse.ant.core"/>
-  </requires>
-
-  <runtime>
-    <library name="antui.jar">  
-      <export name = "*"/>
-    </library> 
-  </runtime>
-
-  <extension point="org.eclipse.ui.popupMenus">
-	<objectContribution
-		id="org.eclipse.ant.ui.RunAnt"
-		objectClass="org.eclipse.core.resources.IResource"
-		nameFilter="*.xml">
-		<action
-			id="RunAnt"
-			label="%runAnt"
-			tooltip="%runAntTip"
-			menubarPath="additions"
-			enablesFor="1"
-			class="org.eclipse.ant.internal.ui.RunAntActionDelegate">
-		</action>
-	</objectContribution>			
-  </extension>
-  
-  <extension point="org.eclipse.ui.views">
-	<category 
-		id="org.eclipse.ant.ui"
-		name="&amp;Ant">
-	</category>
-	<view
-		id="org.eclipse.ant.ui.antconsole"
-		name="%antConsole"
-		icon="icons/full/cview16/ant_view.gif"
-		category="org.eclipse.ant.ui"
-		class="org.eclipse.ant.internal.ui.AntConsole">
-	</view>
-  </extension>
-  
-  <extension point="org.eclipse.ui.preferencePages">
-  	<page 
-  		id="org.eclipse.ant.ui.AntPreferences" 
-  		name="%antPreferences"
-  		class="org.eclipse.ant.internal.ui.AntPreferencesPage">
-  	</page>
-  	<page 
-  		id="org.eclipse.ant.ui.AntConsolePreferences" 
-  		name="%antConsolePreferences"
-  		class="org.eclipse.ant.internal.ui.AntConsolePreferencePage"
-  		category="org.eclipse.ant.ui.AntPreferences">
-  	</page>
-  </extension>
-  
-  <extension point="org.eclipse.ui.actionSets">
-	<actionSet label="%antActionSetLabel" 
-		visible="false" 
-		id="org.eclipse.ant.ui.antActionSet">
-	  	<action label="%executeAntLabel" 
-	  		pulldown="true" 
-	  		icon="icons/full/eview16/ant_view.gif" 
-	  		tooltip="%executeAntTooltip" 
-	  		class="org.eclipse.ant.internal.ui.AntLaunchDropDownAction" 
-	  		toolbarPath="ant" 
-	  		id="org.eclipse.ant.ui.antDropDownAction" /> 
-	</actionSet>
-  </extension>
-  
-</plugin>
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntAction.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntAction.java
deleted file mode 100644
index 6f25b52..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntAction.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.File;
-
-import org.apache.tools.ant.ProjectHelper;
-import org.eclipse.ant.core.EclipseProject;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.ui.*;
-
-public class AntAction extends Action {
-	
-	private IFile file;
-	
-public AntAction(IFile file) {
-	super();
-	this.file = file;
-	if (file != null) {
-		setText(file.getName());
-		setToolTipText(file.getFullPath().toOSString());
-	}
-	else
-		setText(Policy.bind("launcher.noFile"));
-}
-
-public void run() {
-	if (file == null)
-		return;
-	
-	// save the modified files if required by the user
-	if (AntUIPlugin.getPlugin().getPreferenceStore().getBoolean(IAntPreferenceConstants.AUTO_SAVE)) {
-		IEditorPart[] editors = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditors();
-		for (int i=0; i<editors.length; i++) {
-			if (editors[i].isDirty()) {
-				editors[i].getSite().getPage().saveEditor(editors[i],false);
-			}
-		}
-	}
-	
-	EclipseProject project = extractProject(file);
-	if (project == null)
-		return;
-		
-	AntLaunchWizard wizard = new AntLaunchWizard(project,file);
-	wizard.setNeedsProgressMonitor(true);
-	WizardDialog dialog = new WizardDialog(AntUIPlugin.getPlugin().getWorkbench().getActiveWorkbenchWindow().getShell(),wizard);
-	dialog.create();
-	dialog.open();
-}
-
-protected EclipseProject extractProject(IFile sourceFile) {
-	// create a project and initialize it
-	EclipseProject antProject = new EclipseProject();
-	antProject.init();
-	antProject.setProperty("ant.file",sourceFile.getLocation().toOSString());
-	
-	try {
-		ProjectHelper.configureProject(antProject,new File(sourceFile.getLocation().toOSString()));
-	} catch (Exception e) {
-		// If the document is not well-formated for example
-		String message = e.getMessage();
-		if (message == null)
-			message = Policy.bind("error.antParsingError");
-		IStatus status = new Status(IStatus.ERROR,AntUIPlugin.PI_ANTUI,IStatus.ERROR,message,e);
-		ErrorDialog.openError(
-			AntUIPlugin.getPlugin().getWorkbench().getActiveWorkbenchWindow().getShell(),
-			Policy.bind("error.antScriptError"),
-			Policy.bind("error.antParsingError"),
-			status);
-			
-		return null;
-	}
-	return antProject;
-}
-
-}
-
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntConsole.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntConsole.java
deleted file mode 100644
index d43d131..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntConsole.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntConsolePreferencePage.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntConsolePreferencePage.java
deleted file mode 100644
index 749f936..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntConsolePreferencePage.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.jface.preference.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.help.WorkbenchHelp;
-
-/**
- * A page to set the preferences for the console
- */
-public class AntConsolePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-		
-
-/**
- * Create the console page.
- */
-public AntConsolePreferencePage() {
-	super(GRID);
-	
-	setDescription(Policy.bind("preferences.description"));
-	
-	IPreferenceStore store= AntUIPlugin.getPlugin().getPreferenceStore();
-	setPreferenceStore(store);
-}
-public void createControl(Composite parent) {
-	super.createControl(parent);
-	
-	// should do something here with the help..	
-	/*
-	WorkbenchHelp.setHelp(
-		parent,
-		new Object[] { IAntHelpContextIds.ANT_CONSOLE_PREFERENCE_PAGE });
-	*/
-}
-/**
- * Create all field editors for this page
- */
-public void createFieldEditors() {
-
-	ColorFieldEditor errOut= new ColorFieldEditor(IAntPreferenceConstants.CONSOLE_ERROR_RGB, Policy.bind("preferences.errorColor"), getFieldEditorParent());
-	ColorFieldEditor warnOut= new ColorFieldEditor(IAntPreferenceConstants.CONSOLE_WARNING_RGB, Policy.bind("preferences.warningColor"), getFieldEditorParent());
-	ColorFieldEditor infoOut= new ColorFieldEditor(IAntPreferenceConstants.CONSOLE_INFO_RGB, Policy.bind("preferences.infoColor"), getFieldEditorParent());
-	ColorFieldEditor verbOut= new ColorFieldEditor(IAntPreferenceConstants.CONSOLE_VERBOSE_RGB, Policy.bind("preferences.verboseColor"), getFieldEditorParent());
-	ColorFieldEditor debugOut= new ColorFieldEditor(IAntPreferenceConstants.CONSOLE_DEBUG_RGB, Policy.bind("preferences.debugColor"), getFieldEditorParent());
-	
-	FontFieldEditor font= new FontFieldEditor(IAntPreferenceConstants.CONSOLE_FONT, Policy.bind("preferences.font"), getFieldEditorParent());
-
-	addField(errOut);
-	addField(warnOut);
-	addField(infoOut);
-	addField(verbOut);
-	addField(debugOut);
-	addField(font);
-}
-/**
- * Returns the font data that describes the font to use for the console
- */
-protected static FontData getConsoleFontData() {
-	IPreferenceStore pstore= AntUIPlugin.getPlugin().getPreferenceStore();
-	FontData fontData= PreferenceConverter.getFontData(pstore, IAntPreferenceConstants.CONSOLE_FONT);
-	return fontData;
-}
-/**
- * Returns the a color based on the type.
- */
-protected static Color getPreferenceColor(String type) {
-	IPreferenceStore pstore= AntUIPlugin.getPlugin().getPreferenceStore();
-	RGB outRGB= PreferenceConverter.getColor(pstore, type);
-	return new Color(Display.getCurrent() ,outRGB);
-}
-/**
- * @see IWorkbenchPreferencePage#init
- */
-public void init(IWorkbench workbench) {
-}
-
-}
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchDropDownAction.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchDropDownAction.java
deleted file mode 100644
index a75050d..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchDropDownAction.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
- 
-import java.io.File;
-import org.apache.tools.ant.ProjectHelper;
-import org.eclipse.ant.core.EclipseProject;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
-
-/**
- * Superclass of run & debug pulldown actions.
- */
-public class AntLaunchDropDownAction implements IWorkbenchWindowPulldownDelegate {
-	
-
-/**
- * @see IWorkbenchWindowActionDelegate
- */
-public void dispose() {
-}
-
-private void createMenuForAction(Menu parent, Action action) {
-	ActionContributionItem item= new ActionContributionItem(action);
-	item.fill(parent, -1);
-}
-
-/**
- * @see IWorkbenchWindowPulldownDelegate
- */
-public Menu getMenu(Control parent) {
-	Menu menu= new Menu(parent);
-	IFile[] historyList= AntUIPlugin.getPlugin().getHistory();
-	int count= 0;
-	for (int i = 0; i < historyList.length; i++) {
-		IFile file = historyList[i];
-		if (file == null) 
-			break;
-		AntAction newAction= new AntAction(file);
-		createMenuForAction(menu, newAction);
-		count++;
-	}
-	if (count == 0)
-		createMenuForAction(menu, new AntAction(null));
-
-	return menu;
-}
-
-/**
- * @see IWorkbenchWindowActionDelegate
- */
-public void init(IWorkbenchWindow window){
-}
-
-/**
- * @see IActionDelegate
- */
-public void run(IAction action) {
-	IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-	IStructuredSelection selection= resolveSelection(window);
-	
-	if (selection != null) {
-		Object selectedObject = selection.getFirstElement();
-		if (selectedObject instanceof IFile) {
-			if (((IFile) selectedObject).getFileExtension().equals("xml"))
-				new AntAction((IFile) selectedObject).run();
-		}
-		else if (selectedObject instanceof FileEditorInput) {
-			if ((((FileEditorInput) selectedObject).getFile()).getFileExtension().equals("xml"))
-				new AntAction(((FileEditorInput) selectedObject).getFile()).run();
-		}
-	}
-}
-
-/**
- * Determines and returns the selection that provides context for the launch,
- * or <code>null</code> if there is no selection.
- */
-protected IStructuredSelection resolveSelection(IWorkbenchWindow window) {
-	if (window == null) {
-		return null;
-	}
-	ISelection selection= window.getSelectionService().getSelection();
-	if (selection == null || selection.isEmpty() || !(selection instanceof IStructuredSelection)) {
-		// there is no obvious selection - go fishing
-		selection= null;
-		IWorkbenchPage page= window.getActivePage();
-		if (page == null) {
-			//workspace is closed
-			return null;
-		}
-
-		// first, see if there is an active editor, and try its input element
-		IEditorPart editor= page.getActiveEditor();
-		Object element= null;
-		if (editor != null) {
-			element= editor.getEditorInput();
-		}
-
-		if (selection == null && element != null) {
-			selection= new StructuredSelection(element);
-		}
-	}
-	return (IStructuredSelection)selection;
-}
-
-/**
- * @see IActionDelegate
- */
-public void selectionChanged(IAction action, ISelection selection){
-}
-
-}
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchWizard.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchWizard.java
deleted file mode 100644
index a88950f..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchWizard.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchWizardPage.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchWizardPage.java
deleted file mode 100644
index b081040..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchWizardPage.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntPreferencesPage.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntPreferencesPage.java
deleted file mode 100644
index 1ae0135..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntPreferencesPage.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntPropertyChangeListener.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntPropertyChangeListener.java
deleted file mode 100644
index bf82ea5..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntPropertyChangeListener.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntTreeContentProvider.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntTreeContentProvider.java
deleted file mode 100644
index 796547c..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntTreeContentProvider.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.jface.viewers.*;
-
-/**
- * Content provider for the tree viewer of the Ant Console.
- */
-
-public class AntTreeContentProvider implements ITreeContentProvider {
-	
-	private AntConsole console;
-	
-public AntTreeContentProvider(AntConsole console) {
-	this.console = console;
-}
-
-/**
- * @see ITreeContentProvider#getChildren(Object)
- */
-public Object[] getChildren(Object parent) {
-		return ((OutputStructureElement) parent).getChildren();
-}
-
-/**
- * @see ITreeContentProvider#getParent(Object)
- */
-public Object getParent(Object element) {
-	return ((OutputStructureElement) element).getParent();
-}
-
-/**
- * @see ITreeContentProvider#hasChildren(Object)
- */
-public boolean hasChildren(Object element) {
-		return ((OutputStructureElement) element).hasChildren();
-}
-
-/**
- * @see IStructuredContentProvider#getElements(Object)
- */
-public Object[] getElements(Object parent) {
-	return ((OutputStructureElement) parent).getChildren();
-}
-
-/**
- * @see IContentProvider#dispose()
- */
-public void dispose() {
-}
-
-/**
- * @see IContentProvider#inputChanged(Viewer, Object, Object)
- */
-public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-}
-
-}
-
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntTreeLabelProvider.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntTreeLabelProvider.java
deleted file mode 100644
index a6cbbed..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntTreeLabelProvider.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Label provider for the tree viewer of the Ant Console.
- */
-
-public class AntTreeLabelProvider implements ILabelProvider {
-	
-	private AntConsole console;
-	
-public AntTreeLabelProvider(AntConsole console) {
-	this.console = console;
-}
-
-
-/**
- * @see ILabelProvider#getImage(Object)
- */
-public Image getImage(Object element) {
-	return null;
-}
-
-/**
- * @see ILabelProvider#getText(Object)
- */
-public String getText(Object element) {
-	String text = ((OutputStructureElement) element).getName();
-	if ( text == null)
-		// this can happen if the userwrites a task name that doesn't exist => the #taskStarted will be triggered
-		// but null will be given as a name to the current task, and then only, the exception will be raised
-		return Policy.bind("antTreeLabelProvider.invalidTaskName");
-	return text;
-}
-
-/**
- * @see IBaseLabelProvider#addListener(ILabelProviderListener)
- */
-public void addListener(ILabelProviderListener listener) {
-}
-
-/**
- * @see IBaseLabelProvider#dispose()
- */
-public void dispose() {
-}
-
-/**
- * @see IBaseLabelProvider#isLabelProperty(Object, String)
- */
-public boolean isLabelProperty(Object arg0, String arg1) {
-	return false;
-}
-
-/**
- * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
- */
-public void removeListener(ILabelProviderListener listener) {
-}
-
-}
-
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntUIPlugin.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntUIPlugin.java
deleted file mode 100644
index 1dd8018..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntUIPlugin.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.net.*;
-import java.util.*;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * The plug-in runtime class for the AntUI plug-in.
- */
-public final class AntUIPlugin extends AbstractUIPlugin{
-
-	/**
-	 * Unique identifier constant (value <code>"org.eclipse.ant.ui"</code>)
-	 * for the Ant UI plug-in.
-	 */
-	public static final String PI_ANTUI= "org.eclipse.ant.ui";
-	
-	public static final String PROPERTIES_MESSAGES = "org.eclipse.ant.internal.ui.messages";
-	
-	public static final String IMG_ANT_SCRIPT= "icons/full/eview16/ant_view.gif";
-	public static final String IMG_BUILDER= "icons/full/eview16/build_exec.gif";
-	
-	private static final String SETTINGS_COMMAND_HISTORY = "CommandHistory";
-	private static final int MAX_COMMAND_HISTORY = 15;
-	
-	
-	/**
-	 * The single instance of this plug-in runtime class.
-	 */
-	private static AntUIPlugin plugin;
-	
-	private final static int MAX_HISTORY_SIZE= 5;
-	/**
-	 * The most recent debug launches
-	 */
-	private IFile[] antHistory = new IFile[MAX_HISTORY_SIZE];
-	
-
-public AntUIPlugin(IPluginDescriptor desc) {
-	super(desc);
-	plugin= this;
-}
-
-public static AntUIPlugin getPlugin() {
-	return plugin;
-}
-
-public static ResourceBundle getResourceBundle() {
-	try {
-		return ResourceBundle.getBundle(PROPERTIES_MESSAGES);
-	} catch (MissingResourceException e) {
-		ErrorDialog.openError(
-			plugin.getWorkbench().getActiveWorkbenchWindow().getShell(),
-			Policy.bind("exception.missingResourceBundle"),
-			Policy.bind("exception.missingResourceBundle.message"),
-			new Status(IStatus.ERROR,PI_ANTUI,0,Policy.bind("exception.missingResourceBundle.message"),e));
-		return null;
-	}
-}
-
-/**
- * Adds the given command to the command history.
- * - if the command doesn't exist: put it at the first place
- * - if it exists and is already at the first place: does nothing
- * - if it exists and is not at the first place: move it to the first place
-
- */
-public void addToCommandHistory(String command) {
-	IDialogSettings settings = getDialogSettings();
-	String[] oldHistory = settings.getArray(SETTINGS_COMMAND_HISTORY);
-	if (oldHistory == null || oldHistory.length == 0) {
-		settings.put(SETTINGS_COMMAND_HISTORY, new String[] {command});
-		return;
-	}
-	if (command.equals(oldHistory[0])) {
-		return;
-	}
-	//search for existing command and move to top if found
-	int index;
-	for (index=1; index<oldHistory.length; index++)
-		if (command.equals(oldHistory[index]))
-			break;
-	if (index < oldHistory.length) {
-		//it was found, so replace it
-		for (int i=index; i>0; i--)
-			oldHistory[i] = oldHistory[i-1];
-		oldHistory[0] = command;
-		settings.put(SETTINGS_COMMAND_HISTORY, oldHistory);
-	}
-	//not found -- add it to the history
-	String[] newHistory;
-	if (oldHistory.length == MAX_COMMAND_HISTORY) {
-		//shift other commands down and add new one
-		System.arraycopy(oldHistory, 0, oldHistory, 1, oldHistory.length-1);
-		oldHistory[0] = command;
-		newHistory = oldHistory;
-	} else {
-		// grow the history array
-		newHistory = new String[oldHistory.length+1];
-		System.arraycopy(oldHistory, 0, newHistory, 1, oldHistory.length);
-		newHistory[0] = command;
-	}
-	settings.put(SETTINGS_COMMAND_HISTORY, newHistory);
-}
-/**
- * Adds the given file to the history: 
- * - if the file doesn't exist: put it at the first place
- * - if it exists and is already at the first place: does nothing
- * - if it exists and is not at the first place: move it to the first place
- * 
- * @param the file
- */
-public void addToHistory(IFile file) {
-	if (file.equals(antHistory[0]))
-		return;
-		
-	int index;
-	for (index=1; index<MAX_HISTORY_SIZE; index++)
-		if (file.equals(antHistory[index]))
-			break;
-	if (index == MAX_HISTORY_SIZE)
-		index--;
-	for (int i=index; i>0; i--)
-		antHistory[i] = antHistory[i-1];
-	antHistory[0] = file;	
-}
-
-/**
- * Returns the history of tool script command that have been run.
- */
-public String[] getCommandHistory() {
-	return getDialogSettings().getArray(SETTINGS_COMMAND_HISTORY);
-}
-/**
- * Returns the history of the AntPlugin, i.e. the files that were executed previously
- * 
- * @return an array containing the files
- */
-public IFile[] getHistory() {
-	return antHistory;	
-}
-
-/**
- * Returns the ImageDescriptor for the icon with the given path
- * 
- * @return the ImageDescriptor object
- */
-public ImageDescriptor getImageDescriptor(String path) {
-	try {
-		URL installURL = getDescriptor().getInstallURL();
-		URL url = new URL(installURL,path);
-		return ImageDescriptor.createFromURL(url);
-	} catch (MalformedURLException e) {
-		return null;
-	}
-}
-
-/**
- * @see AbstractUIPlugin#initializeDefaultPreferences
- */
-protected void initializeDefaultPreferences(IPreferenceStore prefs) {
-	prefs.setDefault(IAntPreferenceConstants.AUTO_SAVE, false);
-	prefs.setDefault(IAntPreferenceConstants.INFO_LEVEL, true);
-	prefs.setDefault(IAntPreferenceConstants.VERBOSE_LEVEL, false);
-	prefs.setDefault(IAntPreferenceConstants.DEBUG_LEVEL, false);
-
-	PreferenceConverter.setDefault(prefs, IAntPreferenceConstants.CONSOLE_ERROR_RGB, new RGB(255, 0, 0)); 		// red - exactly the same as debug Consol
-	PreferenceConverter.setDefault(prefs, IAntPreferenceConstants.CONSOLE_WARNING_RGB, new RGB(255, 100, 0)); 	// orange
-	PreferenceConverter.setDefault(prefs, IAntPreferenceConstants.CONSOLE_INFO_RGB, new RGB(0, 0, 255)); 		// blue
-	PreferenceConverter.setDefault(prefs, IAntPreferenceConstants.CONSOLE_VERBOSE_RGB, new RGB(0, 200, 125));	// green
-	PreferenceConverter.setDefault(prefs, IAntPreferenceConstants.CONSOLE_DEBUG_RGB, new RGB(0, 0, 0));			// black
-	
-}
-
-}
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/BuildCanceledException.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/BuildCanceledException.java
deleted file mode 100644
index 60e7e6b..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/BuildCanceledException.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.apache.tools.ant.BuildException;
-
-public class BuildCanceledException extends BuildException {
-
-public BuildCanceledException() {
-	super(Policy.bind("exception.canceled"));
-}
-
-}
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/IAntPreferenceConstants.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/IAntPreferenceConstants.java
deleted file mode 100644
index abec6e3..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/IAntPreferenceConstants.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-public interface IAntPreferenceConstants {
-	
-	// for the Ant preference page
-
-	public static final String AUTO_SAVE = "Ant.autoSave";
-	
-	public static final String OUPUT_LEVEL = "Ant.outputLevel";
-
- 	public static final String INFO_LEVEL = "Ant.infoLevel";
- 	
- 	public static final String VERBOSE_LEVEL = "Ant.verboseLevel";
- 	
- 	public static final String DEBUG_LEVEL = "Ant.levelLevel";
- 	
- 	
- 	// Colors and police for the Ant Console
- 	
-	public static final String CONSOLE_ERROR_RGB = "Ant.Console.errorColor";
-	
-	public static final String CONSOLE_WARNING_RGB = "Ant.Console.warningColor";
-
- 	public static final String CONSOLE_INFO_RGB = "Ant.Console.infoColor";
- 	
- 	public static final String CONSOLE_VERBOSE_RGB = "Ant.Console.verboseColor";
- 	
- 	public static final String CONSOLE_DEBUG_RGB = "Ant.Console.debugColor";
- 	
- 	public static final String CONSOLE_FONT = "Ant.Console.font";
-
-}
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/OutputStructureElement.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/OutputStructureElement.java
deleted file mode 100644
index f77f80f..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/OutputStructureElement.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.util.Vector;
-
-/**
- * Object which stores the index and the length of the output for a given
- * target or task (represented by a string)
- */
-
-public class OutputStructureElement {
-
-	private OutputStructureElement parent = null;
-	private Vector children;
-	private String name;
-	private int startIndex = 0;
-	private int length = 0;
-
-
-/**
- * This constructor is intended to be used only by the first element of the structure (the root element)
- */
-public OutputStructureElement(String name) {
-	// there's at least one target as it is the root which may be instantiated via this constructor
-	children = new Vector(1);
-	this.name = name;
-}
-
-/**
- * This constructor is used for any element but the first element of the structure (the root element)
- */	
-public OutputStructureElement(String name, OutputStructureElement parent, int startIndex) {
-	children = new Vector(0);
-	this.name = name;
-	this.startIndex = startIndex;
-	parent.addChild(this);
-}
-
-public void addChild(OutputStructureElement child) {
-	children.add(child);
-	child.setParent(this);
-}
-
-public boolean hasChildren() {
-	return !children.isEmpty();
-}
-
-public String getName() {
-	return name;
-}
-
-public void setName(String name) {
-	this.name = name;
-}
-
-public void setParent(OutputStructureElement parent) {
-	this.parent = parent;
-}
-
-public OutputStructureElement getParent() {
-	return parent;
-}
-
-public OutputStructureElement[] getChildren() {
-	return (OutputStructureElement[]) children.toArray(new OutputStructureElement[children.size()]);
-}
-
-public void setStartIndex(int index) {
-	startIndex = index;
-}
-
-public void setEndIndex(int index) {
-	length = index - startIndex;
-}
-
-public int getStartIndex() {
-	return startIndex;
-}
-
-public int getEndIndex() {
-	return startIndex + length;
-}
-
-public int getLength() {
-	return length;
-}
-
-public String toString() {
-	return name;
-}
-
-}
-
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/Policy.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/Policy.java
deleted file mode 100644
index 145fcd8..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/Policy.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.eclipse.ant.internal.ui;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.core.runtime.*;
-import java.util.*;
-
-public class Policy {
-	private static ResourceBundle bundle;
-	static {
-		relocalize();
-	}
-/**
- * Lookup the message with the given ID in this catalog 
- */
-public static String bind(String id) {
-	return bind(id, (String[])null);
-}
-/**
- * Lookup the message with the given ID in this catalog and bind its
- * substitution locations with the given string.
- */
-public static String bind(String id, String binding) {
-	return bind(id, new String[] {binding});
-}
-/**
- * Lookup the message with the given ID in this catalog and bind its
- * substitution locations with the given strings.
- */
-public static String bind(String id, String binding1, String binding2) {
-	return bind(id, new String[] {binding1, binding2});
-}
-
-/**
- * Lookup the message with the given ID in this catalog and bind its
- * substitution locations with the given string values.
- */
-public static String bind(String id, String[] bindings) {
-	if (id == null)
-		return "No message available";
-	String message = null;
-	try {
-		message = bundle.getString(id);
-	} catch (MissingResourceException e) {
-		// If we got an exception looking for the message, fail gracefully by just returning
-		// the id we were looking for.  In most cases this is semi-informative so is not too bad.
-		return "Missing message: " + id + "in: " + AntUIPlugin.PROPERTIES_MESSAGES;
-	}
-	if (bindings == null)
-		return message;
-	int length = message.length();
-	int start = -1;
-	int end = length;
-	StringBuffer output = new StringBuffer(80);
-	while (true) {
-		if ((end = message.indexOf('{', start)) > -1) {
-			output.append(message.substring(start + 1, end));
-			if ((start = message.indexOf('}', end)) > -1) {
-				int index = -1;
-				try {
-					index = Integer.parseInt(message.substring(end + 1, start));
-					output.append(bindings[index]);
-				} catch (NumberFormatException nfe) {
-					output.append(message.substring(end + 1, start + 1));
-				} catch (ArrayIndexOutOfBoundsException e) {
-					output.append("{missing " + Integer.toString(index) + "}");
-				}
-			} else {
-				output.append(message.substring(end, length));
-				break;
-			}
-		} else {
-			output.append(message.substring(start + 1, length));
-			break;
-		}
-	}
-	return output.toString();
-}
-public static IProgressMonitor monitorFor(IProgressMonitor monitor) {
-	if (monitor == null)
-		return new NullProgressMonitor();
-	return monitor;
-}
-/**
- * Creates a NLS catalog for the given locale.
- */
-public static void relocalize() {
-	bundle = ResourceBundle.getBundle(AntUIPlugin.PROPERTIES_MESSAGES, Locale.getDefault());
-}
-public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks) {
-	if (monitor == null)
-		return new NullProgressMonitor();
-	if (monitor instanceof NullProgressMonitor)
-		return monitor;
-	return new SubProgressMonitor(monitor, ticks);
-}
-public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks, int style) {
-	if (monitor == null)
-		return new NullProgressMonitor();
-	if (monitor instanceof NullProgressMonitor)
-		return monitor;
-	return new SubProgressMonitor(monitor, ticks, style);
-}
-}
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/RunAntActionDelegate.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/RunAntActionDelegate.java
deleted file mode 100644
index 6ecf21e..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/RunAntActionDelegate.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TargetsListContentProvider.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TargetsListContentProvider.java
deleted file mode 100644
index a70f07c..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TargetsListContentProvider.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TargetsListLabelProvider.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TargetsListLabelProvider.java
deleted file mode 100644
index 50ed423..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TargetsListLabelProvider.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/UIBuildListener.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/UIBuildListener.java
deleted file mode 100644
index 4f15da6..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/UIBuildListener.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/messages.properties b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/messages.properties
deleted file mode 100644
index d00d44f..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/messages.properties
+++ /dev/null
@@ -1,91 +0,0 @@
-### Ant UI plugin message catalog
-
-
-### wizard
-wizard.title = Run Ant
-wizard.executeAntScriptTitle = Execute Ant Script
-wizard.executeAntScriptDescription = Select the targets to execute.
-wizard.availableTargetsLabel = Available Targets:
-wizard.argumentsLabel = Arguments:
-wizard.displayLogLabel = &Display execution log to Ant console
-
-
-### label provider
-labelprovider.defaultTarget = Default target
-antTreeLabelProvider.invalidTaskName = Invalid task name
-
-
-### preferences page
-preferences.savePriorToBuilding = Save all &modified resources automatically prior to manual execution of an Ant script
-preferences.preferedOutputLevel = Preferred output level
-preferences.info = &Information (normal)
-preferences.verbose = &Verbose
-preferences.debug = De&bug
-preferences.description = Console text color settings.
-preferences.errorColor = &Error:
-preferences.warningColor = &Warning:
-preferences.infoColor = &Information:
-preferences.verboseColor = &Verbose:
-preferences.debugColor = &Debug:
-preferences.font = Console font setting:
-
-
-### console labels
-find_action.label=&Find...@Ctrl+F
-find_action.tooltip=Find
-find_action.image=
-find_action.description=Find
-
-
-### monitor
-monitor.runningAnt = Running Ant.
-monitor.buildStarted = Build started...
-monitor.targetColumn = Target: 
-monitor.started = started.
-
-
-### console
-console.copy = &Copy@Ctrl+C
-console.selectAll = Select &All@Ctrl+A
-console.clearOutput = Clear &Output
-console.expandAll = &Expand All
-console.hideOutputStructureTree = Hide Output Structure Tree
-console.showOutputStructureTree = Show Output Structure Tree
-console.hideTree = &Hide Tree
-console.showTree = &Show Tree
-console.showSelectedElementOnly = S&how Output of Selected Element Only
-console.showCompleteOutput = Show &Complete Output
-console.antScript = Ant Script
-console.project = Project
-
-### launcher
-launcher.noFile = No file recently executed.
-
-### Ant builder property page
-builderProperties.description= Tool scripts and external commands can be configured to run as part of the \n\
-incremental build process.  Use this page to add, remove, and configure tool \n\
-scripts to run when this project is built.
-
-### status
-status.targetPropertyNotRead = Could not read ant targets property from resource: {0}.
-status.targetPropertyNotWritten = Could not write ant targets property to resource: {0}.
-status.logPropertyNotRead = Could not read log property from resource: {0}.
-status.logPropertyNotWritten = Could not write log property to resource: {0}.
-status.consoleNotInitialized = Could not initialize Ant console view
-status.argumentPropertyNotRead = Could not read argument property from resource: {0}.
-status.argumentPropertyNotWritten = Could not write argument property to resource: {0}.
-
-
-### error
-error.antScriptError = Ant script error.
-error.antParsingError = A problem occurred parsing the Ant file.
-error.antExecutionErrorTitle = Ant Execution Problems.
-error.antExecutionError = A problem occurred executing the Ant file.
-error.antExecutionErrorGeneral = See the output console for details.
-
-
-### exception
-exception.canceled = Canceled.
-exception.buildException = BuildException: {0}
-exception.missingResourceBundle = Missing Resource Bundle
-exception.missingResourceBundle.message = The resource properties for the Ant UI plugin could not be found.
diff --git a/platform/org.eclipse.sdk/.vcm_meta b/platform/org.eclipse.sdk/.vcm_meta
deleted file mode 100644
index 3f788a5..0000000
--- a/platform/org.eclipse.sdk/.vcm_meta
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project-description>
-	<comment></comment>
-</project-description>
diff --git a/platform/org.eclipse.sdk/about.html b/platform/org.eclipse.sdk/about.html
deleted file mode 100644
index 768324e..0000000
--- a/platform/org.eclipse.sdk/about.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<head>
-<title>About</title>
-<style type="text/css">
-p, table, td, th { font-family: arial, helvetica, geneva; font-size: 10pt}
-pre { font-family: "Courier New", Courier, mono; font-size: 10pt}
-h2 { font-family: arial, helvetica, geneva; font-size: 18pt; font-weight: bold ; line-height: 14px}
-code { font-family: "Courier New", Courier, mono; font-size: 10pt}
-sup { font-family: arial,helvetica,geneva; font-size: 10px}
-h3 { font-family: arial, helvetica, geneva; font-size: 14pt; font-weight: bold}
-li { font-family: arial, helvetica, geneva; font-size: 10pt}
-h1 { font-family: arial, helvetica, geneva; font-size: 28px; font-weight: bold}
-body { font-family: arial, helvetica, geneva; font-size: 10pt; clip: rect(   ); margin-top: 5mm; margin-left: 3mm}
-</style>
-</head>
-<body lang="EN-US" link="blue" vlink="purple">
-<table border="0" cellspacing="5" cellpadding="2" width="100%" >
-  <tr> 
-    <td align="LEFT" valign="TOP" colspan="2" bgcolor="#0080C0"><b><font color="#FFFFFF">About This Content</font></b></td>
-  </tr>
-  <tr> 
-    <td> 
-<p>11th December, 2001</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in &quot;Content&quot;.  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-<a href="http://www.eclipse.org/legal/cpl-v05.html">Common Public License Version 0.5</a> &quot;CPL&quot;.  For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL &quot;Other License&quot;, any modifications, enhancements and/or
-other code and/or documentation &quot;Modifications&quot; uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/platform/org.eclipse.sdk/about_prod.gif b/platform/org.eclipse.sdk/about_prod.gif
deleted file mode 100644
index 262c524..0000000
--- a/platform/org.eclipse.sdk/about_prod.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.sdk/build.properties b/platform/org.eclipse.sdk/build.properties
deleted file mode 100644
index 220b667..0000000
--- a/platform/org.eclipse.sdk/build.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-# Eclipse build contribution
-bin.includes=*.gif,platform.ini,platform.properties,plugin.xml,plugin.properties,product.properties,welcome.xml,product.ini,about.html
diff --git a/platform/org.eclipse.sdk/platform.ini b/platform/org.eclipse.sdk/platform.ini
deleted file mode 100644
index 0d3adeb..0000000
--- a/platform/org.eclipse.sdk/platform.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-name = Eclipse Platform
-detailedName = %detailedName 
-version = 2.0 (pre-release)
-buildID = @build@
-platformURL = http://www.eclipse.org
-copyright = %copyright 
-
diff --git a/platform/org.eclipse.sdk/platform.properties b/platform/org.eclipse.sdk/platform.properties
deleted file mode 100644
index 5c5ebe3..0000000
--- a/platform/org.eclipse.sdk/platform.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-copyright = (c) Copyright IBM Corp. 2000, 2002.  All rights reserved.\n\
-\n\
-     This offering is based on technology from the Eclipse Project.\n\
-     http://www.eclipse.org\n\
-\n\
-     Third party code may be provided with, included in, or accompany this product.\n\
-     See the license and plugin info for details.\n\
-
-detailedName = Eclipse Platform
\ No newline at end of file
diff --git a/platform/org.eclipse.sdk/plugin.properties b/platform/org.eclipse.sdk/plugin.properties
deleted file mode 100644
index e698ba3..0000000
--- a/platform/org.eclipse.sdk/plugin.properties
+++ /dev/null
@@ -1 +0,0 @@
-pluginName = Eclipse SDK Configuration Plug-In
diff --git a/platform/org.eclipse.sdk/plugin.xml b/platform/org.eclipse.sdk/plugin.xml
deleted file mode 100644
index 69ed2d5..0000000
--- a/platform/org.eclipse.sdk/plugin.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.sdk"
-   name="%pluginName"
-   version="2.0"
-   provider-name="Object Technology International, Inc.">
-</plugin>
diff --git a/platform/org.eclipse.sdk/prod.gif b/platform/org.eclipse.sdk/prod.gif
deleted file mode 100644
index 6ca37e0..0000000
--- a/platform/org.eclipse.sdk/prod.gif
+++ /dev/null
Binary files differ
diff --git a/platform/org.eclipse.sdk/product.ini b/platform/org.eclipse.sdk/product.ini
deleted file mode 100644
index 48c2ef5..0000000
--- a/platform/org.eclipse.sdk/product.ini
+++ /dev/null
@@ -1,17 +0,0 @@
-name = Eclipse Project SDK
-detailedName = %detailedName
-image = prod.gif
-version = 2.0 (pre-release)
-application = org.eclipse.ui.workbench
-appName = Eclipse
-productURL = http://www.eclipse.org
-aboutImage = about_prod.gif
-welcomePage = welcome.xml
-baseInfosets = /org.eclipse.platform.doc.user/toc.xml,\
-                              /org.eclipse.jdt.doc.user/toc.xml,\
-                              /org.eclipse.platform.doc.isv/toc.xml,\
-                              /org.eclipse.jdt.doc.isv/toc.xml,\
-                              /org.eclipse.pde.doc.user/toc.xml
-defaultPerspectiveId = org.eclipse.ui.resourcePerspective
-copyright = %copyright
-buildID = @build@
\ No newline at end of file
diff --git a/platform/org.eclipse.sdk/product.properties b/platform/org.eclipse.sdk/product.properties
deleted file mode 100644
index 2c63923..0000000
--- a/platform/org.eclipse.sdk/product.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-copyright = (c) Copyright IBM Corp. 2000, 2002.  All rights reserved.\n\
-\n\
-     Visit the website at http://www.eclipse.org\n\
-
-detailedName = Eclipse Project SDK
-
diff --git a/platform/org.eclipse.sdk/welcome.xml b/platform/org.eclipse.sdk/welcome.xml
deleted file mode 100644
index 124f33c..0000000
--- a/platform/org.eclipse.sdk/welcome.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?> 
-<welcomePage 
-	title="Welcome to the Workbench">
-	<intro>This page will help familiarize you with the Workbench.
-To get started, read the sections below and click on the related links. </intro>
-
-	<item><b>Create Java components </b>
-To begin Java development, create a <action pluginId="org.eclipse.jdt.ui"  class="org.eclipse.jdt.internal.ui.wizards.OpenProjectWizardAction">Java project</action>.  Select the newly created project
-and choose File > New > Other.... In the left column of the wizard, select Java and double
-click on Java Package in the right column. Fill in the name of your package and click Finish. 
-
-To create a Java class, select the package in the navigator view and click on the 
-"Open the New Wizard" toolbar button (on the far left of the toolbar). This toolbar button
-provides us with a quick alternative to File > New > Other... .  Choose Java Class in the right column of
-the category Java, and click Next. In the class wizard fill in the name of your class and 
-click Finish to create the class and start editing it.</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. You can also use Alt+Up and Alt+Down to
-move between the open perspectives. 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.
-
-When opening perspectives you can hold down Ctrl (on Linux use Alt+Shift) or Shift to
-optionally open each perspective in its own window, or to replace the current perspective 
-with a new perspective. The behavior of Ctrl and Shift is configurable from <action pluginId="org.eclipse.ui"  class="org.eclipse.ui.internal.OpenPreferencesAction">Workbench > Preferences</action>.
-
-To open the Java perspective choose Perspective > Open > Java. </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 Perspective > Show View. 
-To reset the perspective to its original state, choose <action pluginId="org.eclipse.ui"  class="org.eclipse.ui.internal.ResetPerspectiveAction">Perspective > Reset</action>. 
-
-Once you have arranged your perspective, you can save it using Perspective > Save 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">Perspective > Customize...</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.vcm.ui"  class="org.eclipse.vcm.internal.ui.actions.OpenRepositoriesViewAction">Repositories view</action>. Next, specify the location
-of your CVS repository. To do this choose <action pluginId="org.eclipse.vcm.ui.cvs"  class="org.eclipse.vcm.internal.ui.ccvs.NewRepositoryConnectionAction">New > CVS Repository Location...</action> from the
-Repositories view popup menu. When the location wizard opens, fill in the details of your 
-CVS repository and click Finish. 
-
-In the Repositories view expand the location entry and expand Streams. Choose the HEAD
-stream and expand it to view any ongoing work. Select the projects you want to work with
-and choose "Add to Workspace" from the project's popup menu.</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> or the <topic id="/org.eclipse.jdt.doc.user/toc.xml">Java Development User Guide</topic>.</item>
-
-
-</welcomePage>
\ No newline at end of file
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.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java
index fb46567..fbd75d3 100644
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java
+++ b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java
@@ -8,7 +8,7 @@
  * @version 	1.0
  * @author
  */
-public class Locator { 
+public class Locator {
 	public int indent;
 	public int x, y;
 	public int width, height;
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
