diff --git a/ant/org.eclipse.ant.core/.classpath b/ant/org.eclipse.ant.core/.classpath
deleted file mode 100644
index 520e05a..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="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="lib" path="/org.apache.ant/ant.jar" sourcepath="/org.apache.ant/antsrc.zip"/>
-    <classpathentry kind="src" path="src_ant"/>
-    <classpathentry kind="src" path="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 57b480f..0000000
--- a/ant/org.eclipse.ant.core/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-lib
diff --git a/ant/org.eclipse.ant.core/.project b/ant/org.eclipse.ant.core/.project
deleted file mode 100644
index 787040f..0000000
--- a/ant/org.eclipse.ant.core/.project
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ant.core</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.xerces</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.team.cvs.core.cvsnature</nature>
-	</natures>
-</projectDescription>
diff --git a/ant/org.eclipse.ant.core/about.html b/ant/org.eclipse.ant.core/about.html
deleted file mode 100644
index e0c672a..0000000
--- a/ant/org.eclipse.ant.core/about.html
+++ /dev/null
@@ -1,97 +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>3rd April, 2002</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in &quot;Content&quot;.  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-<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 &quot;Ant Derivative Work&quot; are based on Ant code:</p>
-
-<ul>
-	<li>CommaPatternSet contained in antsupport.jar and antsupportsrc.zip</li>
-	<li>InternalAntRunner contained in antsupportlib.jar and antsupportlibsrc.zip</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 17737d2..0000000
--- a/ant/org.eclipse.ant.core/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-custom = true
-
-source.antsupport.jar=src/
-source.lib/antsupportlib.jar=src_ant/
-bin.includes=plugin.xml,*.jar,plugin.properties,about.html,lib/
-javadoc.packages=org.eclipse.*
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/build.xml b/ant/org.eclipse.ant.core/build.xml
deleted file mode 100644
index c583e52..0000000
--- a/ant/org.eclipse.ant.core/build.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.ant.core" default="plugin.zip" basedir=".">
-  <target name="initTemplate" unless="template">
-    <initTemplate/>
-  </target>
-  <target name="init" depends="initTemplate">
-    <property name="plugin" value="org.eclipse.ant.core"/>
-    <property name="version" value="2.2.1"/>
-    <property name="stamp" value=""/>
-    <property name="os" value="win32"/>
-    <property name="ws" value="win32"/>
-    <property name="nl" value="en_US"/>
-    <property name="arch" value="x86"/>
-  </target>
-
-  <target name="src.zip" depends="init">
-    <property name="base" value="${basedir}/src.zip.pdetemp"/>
-    <delete dir="${base}"/>
-    <mkdir dir="${base}"/>
-    <antcall target="src">
-      <param name ="destroot" value="${base}/plugins/${plugin}_${version}"/>
-    </antcall>
-	<ant antfile="${template}" target="runZip">
-      <property name="resultingFile" value="${basedir}/${plugin}_${version}.src.zip"/>
-      <property name="targetDir" value="${base}"/>
-	</ant>
-    <delete dir="${base}"/>
-  </target>
-
-  <target name="plugin.zip" depends="bin.zip"/>
-  <target name="bin.zip" depends="init">
-    <property name="base" value="${basedir}/bin.zip.pdetemp"/>
-    <delete dir="${base}"/>
-    <mkdir dir="${base}"/>
-    <antcall target="jar">
-      <param name ="destroot" value="${base}/plugins/${plugin}_${version}"/>
-    </antcall>
-    <antcall target="bin">
-      <param name ="destroot" value="${base}/plugins/${plugin}_${version}"/>
-    </antcall>
-    <delete>
-      <fileset dir="${base}" includes="**/*.bin.log"/>
-    </delete>
-	<ant antfile="${template}" target="runZip">
-      <property name="resultingFile" value="${basedir}/${plugin}_${version}.zip"/>
-      <property name="targetDir" value="${base}"/>
-	</ant>
-    <delete dir="${base}"/>
-  </target>
-
-  <target name="log.zip" depends="init">
-    <property name="base" value="${basedir}/log.zip.pdetemp"/>
-    <delete dir="${base}"/>
-    <mkdir dir="${base}"/>
-    <antcall target="log">
-      <param name ="destroot" value="${base}/plugins/${plugin}_${version}"/>
-    </antcall>
-	<ant antfile="${template}" target="runZip">
-      <property name="resultingFile" value="${basedir}/${plugin}_${version}.log.zip"/>
-      <property name="targetDir" value="${base}"/>
-	</ant>
-    <delete dir="${base}"/>
-  </target>
-
-  <target name="antsupport.jar" depends="init">
-    <ant antfile="${template}" target="jar">
-      <property name="mapping" value="src/"/>
-      <property name="includes" value="src/"/>
-      <property name="excludes" value=""/>
-      <property name="dest" value="${basedir}/antsupport.jar"/>
-      <property name="compilePath" value="../org.eclipse.core.runtime/bin;../org.eclipse.core.runtime/runtime.jar;../org.eclipse.core.boot/bin;../org.eclipse.core.boot/boot.jar;../org.apache.xerces/bin;../org.apache.xerces/xerces.jar;../org.apache.ant/bin;../org.apache.ant/ant.jar;../org.apache.ant/jakarta-ant-1.4.1-optional.jar"/>
-    </ant>
-  </target>
-
-  <target name="lib/antsupportlib.jar" depends="init">
-    <ant antfile="${template}" target="jar">
-      <property name="mapping" value="src_ant/"/>
-      <property name="includes" value="src_ant/"/>
-      <property name="excludes" value=""/>
-      <property name="dest" value="${basedir}/lib/antsupportlib.jar"/>
-      <property name="compilePath" value="../org.eclipse.core.runtime/bin;../org.eclipse.core.runtime/runtime.jar;../org.eclipse.core.boot/bin;../org.eclipse.core.boot/boot.jar;antsupport.jar;bin/;../org.apache.xerces/bin;../org.apache.xerces/xerces.jar;../org.apache.ant/bin;../org.apache.ant/ant.jar;../org.apache.ant/jakarta-ant-1.4.1-optional.jar"/>
-    </ant>
-  </target>
-
-  <target name="jar" depends="init,antsupport.jar,lib/antsupportlib.jar">
-  </target>
-
-  <target name="antsupportsrc.zip" depends="init">
-    <property name="destroot" value="${basedir}"/>
-    <ant antfile="${template}" target="src">
-      <property name="mapping" value="src/"/>
-      <property name="includes" value="src/**/*.java"/>
-      <property name="excludes" value=""/>
-      <property name="dest" value="${destroot}/antsupportsrc.zip"/>
-    </ant>
-  </target>
-
-  <target name="lib/antsupportlibsrc.zip" depends="init">
-    <property name="destroot" value="${basedir}"/>
-    <ant antfile="${template}" target="src">
-      <property name="mapping" value="src_ant/"/>
-      <property name="includes" value="src_ant/**/*.java"/>
-      <property name="excludes" value=""/>
-      <property name="dest" value="${destroot}/lib/antsupportlibsrc.zip"/>
-    </ant>
-  </target>
-
-  <target name="src" depends="init,antsupportsrc.zip,lib/antsupportlibsrc.zip">
-  </target>
-
-  <target name="bin" depends="init">
-    <property name="destroot" value="${basedir}"/>
-    <ant antfile="${template}" target="bin">
-      <property name="includes" value="plugin.xml,*.jar,plugin.properties,about.html,lib/"/>
-      <property name="excludes" value="src/,src_ant/"/>
-      <property name="dest" value="${destroot}"/>
-    </ant>
-  </target>
-
-  <target name="log" depends="init">
-    <property name="destroot" value="${basedir}"/>
-    <ant antfile="${template}" target="log">
-      <property name="dest" value="${destroot}"/>
-    </ant>
-  </target>
-
-  <target name="clean" depends="init">
-    <ant antfile="${template}" target="clean">
-      <property name="jar" value="antsupport.jar,lib/antsupportlib.jar"/>
-      <property name="srczips" value="antsupportsrc.zip,lib/antsupportlibsrc.zip"/>
-    </ant>
-    <delete>
-      <fileset dir="." includes="**/*.pdetemp"/>
-    </delete>
-    <delete file="${plugin}_${version}.zip"/>
-    <delete file="${plugin}_${version}.src.zip"/>
-    <delete file="${plugin}_${version}.doc.zip"/>
-    <delete file="${plugin}_${version}.log.zip"/>
-  </target>
-</project>
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 8fc06f7..0000000
--- a/ant/org.eclipse.ant.core/buildnotes_platform-ant.html
+++ /dev/null
@@ -1,247 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
-   <title>Eclipse Platform Release Notes Core</title>
-<!-- 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 20020411
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F04%2F09&chfieldto=2002%2F04%2F12&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=Active&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020409
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-<b><tt>org.eclipse.ant.core</tt></b> does not export <b><tt>org.apache.ant</tt></b>
-anymore. Plug-ins that need to have access to Ant classes need to require
-<b><tt>org.apache.ant</tt></b>
-directly.</li>
-
-<li>
-Tasks <b><tt>refreshLocal</tt></b> and <b><tt>incrementalBuild</tt></b>
-are not available anymore. Use <b><tt>eclipse.refreshLocal</tt></b> and
-<b><tt>eclipse.incrementalBuild</tt></b>
-instead.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-New property <b><tt>eclipse.running</tt></b> is set for scripts running
-inside Eclipse.</li>
-
-<li>
-It is now possible to extend the Ant classpath by adding new JARs, folders,
-tasks and types through a preference (Workbench->Preferences->Ant->Customize).</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2002%2F01%2F29&chfieldto=2002%2F04%2F09&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=Active&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20020129
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2001%2F12%2F17&chfieldto=2002%2F01%2F29&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=ant&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20011218
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2001%2F12%2F11&chfieldto=2001%2F12%2F17&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=ant&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20011211
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-Ant code from Apache has moved to a new plug-in called org.apache.ant..</li>
-</ul>
-
-<h3>
-Resolved Bugs</h3>
-
-<ul>
-<li>
-<a href="http://dev.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&bugidtype=include&bug_id=&changedin=&votes=&chfield=bug_status&chfieldfrom=2001%2F11%2F27&chfieldto=2001%2F12%2F10&chfieldvalue=&product=Platform&component=Ant&short_desc=&short_desc_type=allwordssubstr&long_desc=&long_desc_type=allwordssubstr&keywords=&keywords_type=anywords&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&namedcmd=Active&newqueryname=&order=Bug+Number">Click
-here</a> to see PRs which have been marked as RESOLVED, VERIFIED or CLOSED
-since the last integration build.</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20011127 (v213)
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5391">5391</a>&nbsp;
-Upgrade to Ant 1.4.1</li>
-</ul>
-
-<h1>
-
-<hr WIDTH="100%">Eclipse Platform Build Notes<br>
-Ant</h1>
-Eclipse SDK Build 20011120 (v211)
-<h2>
-What's new in this drop</h2>
-
-<h3>
-API changes</h3>
-
-<ul>
-<li>
-None.</li>
-</ul>
-
-<h3>
-Other highlights</h3>
-
-<ul>
-<li>
-<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=5331">5331</a>&nbsp;
-Ant does not override optional tasks with org.eclipse.ant.core.antTasks
-extension point</li>
-</ul>
-
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/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 a8c550f..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 3ec3f86..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antObjects.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
-   <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:</i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ELEMENT antObject EMPTY></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;&nbsp;&nbsp;&nbsp; library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp; ></tt>
-<ul>
-<li>
-<b>name -</b> name of the class to be defined</li>
-
-<li>
-<b>class</b> - the fully qualified name of a Java class</li>
-
-<li>
-<b>library</b> - a path relative to the plug-in install location for the
-library containing the object</li>
-</ul>
-<b><i>Examples: </i></b>The following is an example of an object declaration:
-<p><tt>&nbsp;&nbsp; &lt;extension point="org.eclipse.ant.core.antObject"></tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antObject name="com.example.Foo"
-class="com.example.Foo"/></tt>
-<br><tt>&nbsp;&nbsp; &lt;/extension></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 a6da96c..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTasks.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
-   <title>AntTasks</title>
-</head>
-<body link="#0000FF" vlink="#800080">
-
-<center>
-<h1>
-AntTasks</h1></center>
-<b><i>Identifier: </i></b>org.eclipse.ant.core.antTasks
-<p><b><i>Description: </i></b>Allows plug-ins to define arbitrary Ant tasks
-for use by the Ant infrastructure.&nbsp; The standard Ant infrastructure
-allows for the addition of arbitrary tasks.&nbsp; Unfortunately, it is
-unlikely that the Ant Core plug-in would have the classes required by these
-tasks on its classpath (or that of any of its prerequisites).&nbsp; To
-address this, clients should define an extension which plugs into this
-extension-point and maps a task name onto a class.&nbsp; The Ant plug-in
-can then request that the declaring plug-in load the specified class.
-<p><b><i>Configuration Markup:</i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ELEMENT antTask EMPTY></tt>
-<br><tt>&nbsp;&nbsp; &lt;!ATTLIST antTask</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp; ></tt>
-<ul>
-<li>
-<b>name -</b> name of the task to be defined</li>
-
-<li>
-<b>class</b> - the fully qualified name of a Java class implementing the
-task.&nbsp; Generally this class must be a subclass of&nbsp; <tt>org.apache.tools.ant.Task</tt>.</li>
-
-<li>
-<b>library</b> - a path relative to the plug-in install location for the
-library containing the task</li>
-</ul>
-<b><i>Examples: </i></b>The following is an example of an object declaration:
-<p><tt>&nbsp;&nbsp; &lt;extension point="org.eclipse.ant.core.antTask"></tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antTask name="coolTask" class="com.example.CoolTask"/></tt>
-<br><tt>&nbsp;&nbsp; &lt;/extension></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 eadff6d..0000000
--- a/ant/org.eclipse.ant.core/doc/org_eclipse_ant_core_antTypes.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; I) [Netscape]">
-   <title>AntObjects</title>
-</head>
-<body link="#0000FF" vlink="#800080">
-
-<center>
-<h1>
-AntTypes</h1></center>
-<b><i>Identifier: </i></b>org.eclipse.ant.core.antTypes
-<p><b><i>Description: </i></b>Allows plug-ins to define arbitrary Ant datatypes
-for use by the Ant infrastructure.&nbsp; The standard Ant infrastructure
-allows for the addition of arbitrary datatypes.&nbsp; Unfortunately, it
-is unlikely that the Ant Core plug-in would have the classes required by
-these datatypes on its classpath (or that of any of its prerequisites).&nbsp;
-To address this, clients should define an extension which plugs into this
-extension-point and maps a datatype name onto a class.&nbsp; The Ant plug-in
-can then request that the declaring plug-in load the specified class.
-<p><b><i>Configuration Markup:</i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ELEMENT antType EMPTY></tt>
-<br><tt>&nbsp;&nbsp; &lt;!ATTLIST antType</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp; ></tt>
-<ul>
-<li>
-<b>name -</b> name of the task to be defined</li>
-
-<li>
-<b>class</b> - the fully qualified name of a Java class implementing the
-datatype.&nbsp; Generally this class must be a subclass of&nbsp; <tt>org.apache.tools.ant.types.DataType</tt>.</li>
-
-<li>
-<b>library</b> - a path relative to the plug-in install location for the
-library containing the type</li>
-</ul>
-<b><i>Examples: </i></b>The following is an example of an object declaration:
-<p><tt>&nbsp;&nbsp; &lt;extension point="org.eclipse.ant.core.antType"></tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;antTask name="coolType" class="com.example.CoolType"/></tt>
-<br><tt>&nbsp;&nbsp; &lt;/extension></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/newpde_build.xml b/ant/org.eclipse.ant.core/newpde_build.xml
deleted file mode 100644
index b3faa09..0000000
--- a/ant/org.eclipse.ant.core/newpde_build.xml
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.ant.core" default="build.jars" basedir=".">
-
-	<target name="initTemplate" unless="template">
-		<initTemplate/>
-	</target>
-
-	<target name="init" depends="initTemplate, properties">
-	</target>
-
-	<target name="build.update.jar" depends="init">
-		<property name="base" value="${basedir}/bin.zip.pdetemp"/>
-		<delete dir="${base}"/>
-		<mkdir dir="${base}"/>
-		<antcall target="build.jars"/>
-		<antcall target="gather.bin.parts">
-			<param name="destination" value="${base}/"/>
-		</antcall>
-		<delete>
-			<fileset dir="${base}" includes="**/*.bin.log"/>
-		</delete>
-		<zip zipfile="${basedir}/${plugin}_${version}.jar" basedir="${base}/plugins/${plugin}"/>
-		<delete dir="${base}"/>
-	</target>
-
-	<target name="gather.bin.parts" depends="init" if="destination">
-		<ant antfile="${template}" target="includesExcludesCopy">
-			<property name="srcdir" value="${basedir}"/>
-			<property name="dest" value="${destination}/plugins/${plugin}"/>
-			<property name="excludes" value="${bin.excludes}"/>
-			<property name="includes" value="${bin.includes}"/>
-		</ant>
-	</target>
-
-	<target name="antsupport.jar" depends="init">
-		<ant antfile="${template}" target="jar">
-			<property name="dest" value="${basedir}/antsupport.jar"/>
-			<property name="srcdir" value="${basedir}"/>
-			<property name="includes" value="src/"/>
-			<property name="excludes" value=""/>
-			<property name="mapping" value="src/"/>
-			<property name="compilePath" value="${location.org.eclipse.core.runtime}/bin;${location.org.eclipse.core.runtime}/runtime.jar;${location.org.eclipse.core.boot}/bin;${location.org.eclipse.core.boot}/boot.jar;${location.org.eclipse.ant.core}/bin;${location.org.eclipse.ant.core}/antsupport.jar;${location.org.apache.xerces}/bin;${location.org.apache.xerces}/xerces.jar"/>
-		</ant>
-	</target>
-
-	<target name="lib/antsupportlib.jar" depends="init">
-		<ant antfile="${template}" target="jar">
-			<property name="dest" value="${basedir}/lib/antsupportlib.jar"/>
-			<property name="srcdir" value="${basedir}"/>
-			<property name="includes" value="src_ant/"/>
-			<property name="excludes" value=""/>
-			<property name="mapping" value="src_ant/"/>
-			<property name="compilePath" value="${location.org.eclipse.core.runtime}/bin;${location.org.eclipse.core.runtime}/runtime.jar;${location.org.eclipse.core.boot}/bin;${location.org.eclipse.core.boot}/boot.jar;${location.org.eclipse.ant.core}/bin;${location.org.eclipse.ant.core}/antsupport.jar;${location.org.apache.xerces}/bin;${location.org.apache.xerces}/xerces.jar;${location.org.apache.ant}/ant.jar"/>
-		</ant>
-	</target>
-
-	<target name="build.jars" depends="init,antsupport.jar,lib/antsupportlib.jar">
-	</target>
-
-	<target name="build.zips" depends="init">
-	</target>
-
-	<target name="gather.sources" depends="init" if="destination">
-		<mkdir dir="${destination}/plugins/${plugin}"/>
-		<copy file="${basedir}/antsupportsrc.zip" todir="${destination}/plugins/${plugin}"/>
-		<mkdir dir="${destination}/plugins/${plugin}/lib"/>
-		<copy file="${basedir}/lib/antsupportlibsrc.zip" todir="${destination}/plugins/${plugin}/lib"/>
-	</target>
-
-	<target name="antsupportsrc.zip" depends="init">
-		<ant antfile="${template}" target="src">
-			<property name="srcdir" value="${basedir}"/>
-			<property name="mapping" value="src/"/>
-			<property name="dest" value="${basedir}/antsupportsrc.zip"/>
-			<property name="excludes" value=""/>
-			<property name="includes" value="src/**/*.java"/>
-		</ant>
-	</target>
-
-	<target name="lib/antsupportlibsrc.zip" depends="init">
-		<ant antfile="${template}" target="src">
-			<property name="srcdir" value="${basedir}"/>
-			<property name="mapping" value="src_ant/"/>
-			<property name="dest" value="${basedir}/lib/antsupportlibsrc.zip"/>
-			<property name="excludes" value=""/>
-			<property name="includes" value="src_ant/**/*.java"/>
-		</ant>
-	</target>
-
-	<target name="build.sources" depends="init,antsupportsrc.zip,lib/antsupportlibsrc.zip">
-	</target>
-
-	<target name="gather.logs" depends="init">
-		<mkdir dir="${destination}/plugins/${plugin}"/>
-		<copy file="${basedir}/antsupport.jar.bin.log" todir="${destination}/plugins/${plugin}"/>
-		<mkdir dir="${destination}/plugins/${plugin}/lib"/>
-		<copy file="${basedir}/lib/antsupportlib.jar.bin.log" todir="${destination}/plugins/${plugin}/lib"/>
-	</target>
-
-	<target name="clean" depends="init">
-		<delete>
-			<fileset dir="${basedir}" includes="*.bin"/>
-			<fileset dir="${basedir}" includes="**/*.log"/>
-			<fileset dir="${basedir}" includes="antsupport.jar,lib/antsupportlib.jar"/>
-			<fileset dir="${basedir}" includes="antsupportsrc.zip,lib/antsupportlibsrc.zip"/>
-			<fileset dir="${basedir}" includes="**/*.pdetemp"/>
-		</delete>
-		<delete file="${plugin}_${version}.jar"/>
-		<delete file="${plugin}_${version}.src.zip"/>
-		<delete file="${plugin}_${version}.log.zip"/>
-	</target>
-
-	<target name="properties">
-		<property name="plugin" value="org.eclipse.ant.core"/>
-		<property name="version" value="2.2.1"/>
-		<pluginLocation plugin="org.eclipse.core.boot" property="location.org.eclipse.core.boot"/>
-		<pluginLocation plugin="org.eclipse.core.runtime" property="location.org.eclipse.core.runtime"/>
-		<pluginLocation plugin="org.apache.xerces" property="location.org.apache.xerces"/>
-		<pluginLocation plugin="org.apache.ant" property="location.org.apache.ant"/>
-		<pluginLocation plugin="org.eclipse.ant.core" property="location.org.eclipse.ant.core"/>
-		<property name="bin.includes" value="plugin.xml,*.jar,plugin.properties,about.html,lib/"/>
-		<property name="bin.excludes" value="src/,src_ant/"/>
-	</target>
-
-</project>
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/plugin.properties b/ant/org.eclipse.ant.core/plugin.properties
deleted file mode 100644
index 172c8da..0000000
--- a/ant/org.eclipse.ant.core/plugin.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-pluginName = Ant Build Tool Core
-providerName = Object Technology International, Inc.
-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 802a2be..0000000
--- a/ant/org.eclipse.ant.core/plugin.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.ant.core"
-   name="%pluginName"
-   version="2.3.1"
-   provider-name="%providerName"
-   class="org.eclipse.ant.core.AntCorePlugin">
-
-   <requires>
-     <import plugin="org.apache.xerces"/>
-   </requires>
-
-   <runtime>
-     <library name="antsupport.jar">
-       <export name="*"/>
-     </library>
-   </runtime>
-
-   <extension-point id="antObjects" name="%objectsName"/>
-   <extension-point id="antTasks" name="%tasksName"/>
-   <extension-point id="antTypes" name="%typesName"/>
-
-   <!-- Applications -->
-   <extension
-     id="antRunner"
-     point="org.eclipse.core.runtime.applications">
-     <application>
-       <run
-         class="org.eclipse.ant.core.AntRunner">
-       </run>
-    </application>
-   </extension>
-   
-   <!-- Objects -->
-   <extension point="org.eclipse.ant.core.antObjects">
-      <antObject
-         name="org.eclipse.ant.internal.core.ant.InternalAntRunner"
-         class="org.eclipse.ant.internal.core.ant.InternalAntRunner"
-         library="lib/antsupportlib.jar">
-      </antObject>
-   </extension>
-
-   <!-- Types -->
-   <extension point="org.eclipse.ant.core.antTypes">
-      <antType
-         name="commapatternset"
-         class="org.eclipse.ant.internal.core.ant.CommaPatternSet"
-         library="lib/antsupportlib.jar">
-      </antType>
-      <antType
-         name="eclipse.commapatternset"
-         class="org.eclipse.ant.internal.core.ant.CommaPatternSet"
-         library="lib/antsupportlib.jar">
-      </antType>
-   </extension>
-</plugin>
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntCorePlugin.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntCorePlugin.java
deleted file mode 100644
index cbef820..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntCorePlugin.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.core;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ant.internal.core.AntCorePreferences;
-import org.eclipse.ant.internal.core.IAntCoreConstants;
-import org.eclipse.core.runtime.*;
-
-public class AntCorePlugin extends Plugin implements IAntCoreConstants {
-
-	/**
-	 * The single instance of this plug-in runtime class.
-	 */
-	private static AntCorePlugin plugin;
-
-	/**
-	 * Table of Ant tasks (IConfigurationElement) added through the tasks extension point
-	 */
-	private Map taskExtensions;
-
-	/**
-	 * Table of Ant objects (IConfigurationElement) added through the objects extension point
-	 */
-	private Map objectExtensions;
-
-	/**
-	 * Table of Ant ypes (IConfigurationElement) added through the types extension point
-	 */
-	private Map typeExtensions;
-
-	/**
-	 * 
-	 */
-	private AntCorePreferences preferences;
-
-	/**
-	 * Unique identifier constant (value <code>"org.eclipse.ant.core"</code>)
-	 * for the Ant Core plug-in.
-	 */
-	public static final String PI_ANTCORE= "org.eclipse.ant.core";
-
-	/**
-	 * Simple identifier constant (value <code>"antTasks"</code>)
-	 * for the Ant tasks extension point.
-	 */
-	public static final String PT_TASKS = "antTasks";
-
-	/**
-	 * Simple identifier constant (value <code>"antObjects"</code>)
-	 * for the Ant tasks extension point.
-	 */
-	public static final String PT_OBJECTS = "antObjects";
-
-	/**
-	 * Simple identifier constant (value <code>"antTypes"</code>)
-	 * for the Ant tasks extension point.
-	 */
-	public static final String PT_TYPES = "antTypes";
-
-	/**
-	 * 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>"name"</code>)
-	 * of a tag that appears in Ant extensions.
-	 */
-	public static final String NAME = "name";
-
-	/**
-	 * Simple identifier constant (value <code>"library"</code>)
-	 * of a tag that appears in Ant extensions.
-	 */
-	public static final String LIBRARY = "library";
-
-public AntCorePlugin(IPluginDescriptor descriptor) {
-	super(descriptor);
-	plugin = this;
-}
-
-public void startup() throws CoreException {
-	taskExtensions = extractExtensions(PT_TASKS);
-	objectExtensions = extractExtensions(PT_OBJECTS);
-	typeExtensions = extractExtensions(PT_TYPES);
-}
-
-public void shutdown() throws CoreException {
-	if (preferences == null)
-		return;
-	preferences.updatePluginPreferences();
-	savePluginPreferences();
-}
-
-protected Map extractExtensions(String point) {
-	IExtensionPoint extensionPoint = getDescriptor().getExtensionPoint(point);
-	if (extensionPoint == null)
-		return null;
-	IConfigurationElement[] extensions = extensionPoint.getConfigurationElements();
-	Map result = new HashMap(extensions.length);
-	for (int i = 0; i < extensions.length; i++) {
-		String name = extensions[i].getAttribute(NAME);
-		result.put(name, extensions[i]);
-	}
-	return result;
-}
-
-public AntCorePreferences getPreferences() {
-	if (preferences == null)
-		preferences = new AntCorePreferences(taskExtensions, objectExtensions, typeExtensions);
-	return preferences;
-}
-
-/**
- * Returns this plug-in.
- *
- * @return the single instance of this plug-in runtime class
- */
-public static AntCorePlugin getPlugin() {
-	return plugin;
-}
-
-}
\ No newline at end of file
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 9e4967a..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.core;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.util.*;
-
-import org.eclipse.ant.internal.core.*;
-import org.eclipse.ant.internal.core.AntClassLoader;
-import org.eclipse.ant.internal.core.AntCorePreferences;
-import org.eclipse.core.boot.IPlatformRunnable;
-import org.eclipse.core.runtime.*;
-/**
- * Entry point for running Ant scripts inside Eclipse.
- */
-public class AntRunner implements IPlatformRunnable, IAntCoreConstants {
-
-	protected String buildFileLocation = DEFAULT_BUILD_FILENAME;
-	protected List buildListeners;
-	protected Vector targets;
-	protected Map userProperties;
-	protected int messageOutputLevel = 2; // Project.MSG_INFO
-	protected String buildLoggerClassName;
-	protected String arguments;
-
-public AntRunner() {
-	buildListeners = new ArrayList(5);
-}
-
-protected ClassLoader getClassLoader() {	
-	AntCorePreferences preferences = AntCorePlugin.getPlugin().getPreferences();
-	URL[] urls = preferences.getURLs();
-	ClassLoader[] pluginLoaders = preferences.getPluginClassLoaders();
-	return new AntClassLoader(urls, pluginLoaders, null);
-}
-
-/**
- * Sets the buildFileLocation.
- * 
- * @param buildFileLocation the file system location of the build file
- */
-public void setBuildFileLocation(String buildFileLocation) {
-	if (buildFileLocation == null)
-		this.buildFileLocation = DEFAULT_BUILD_FILENAME;
-	else
-		this.buildFileLocation = buildFileLocation;
-}
-
-/**
- * 
- * 
- * @param 
- */
-public void setMessageOutputLevel(int level) {
-	this.messageOutputLevel = level;
-}
-
-/**
- * 
- */
-public void setArguments(String arguments) {
-	this.arguments = arguments;
-}
-
-/**
- * Sets the executionTargets in the order they need to run.
- * 
- */
-public void setExecutionTargets(String[] executionTargets) {
-	targets = new Vector(10);
-	for (int i = 0; i < executionTargets.length; i++)
-		targets.add(executionTargets[i]);
-}
-
-/**
- * Adds a build listener.
- * 
- * @param buildListener a build listener
- */
-public void addBuildListener(String className) {
-	if (className == null)
-		return;
-	buildListeners.add(className);
-}
-
-/**
- * Adds a build logger.
- * 
- * @param className a BuildLogger class name
- */
-public void addBuildLogger(String className) {
-	this.buildLoggerClassName = className;
-}
-
-/**
- * Adds user properties.
- */
-public void addUserProperties(Map properties) {
-	this.userProperties = properties;
-}
-
-/**
- * Runs the build script.
- */
-public void run() throws CoreException {
-	try {
-		ClassLoader loader = getClassLoader();
-		Class classInternalAntRunner = loader.loadClass("org.eclipse.ant.internal.core.ant.InternalAntRunner");
-		Object runner = classInternalAntRunner.newInstance();
-		// set build file
-		Method setBuildFileLocation = classInternalAntRunner.getMethod("setBuildFileLocation", new Class[] {String.class});
-		setBuildFileLocation.invoke(runner, new Object[] {buildFileLocation});
-		// add listeners
-		Method addBuildListeners = classInternalAntRunner.getMethod("addBuildListeners", new Class[] {List.class});
-		addBuildListeners.invoke(runner, new Object[] {buildListeners});
-		// add build logger
-		if (buildLoggerClassName != null) {
-			Method addBuildLogger = classInternalAntRunner.getMethod("addBuildLogger", new Class[] {String.class});
-			addBuildLogger.invoke(runner, new Object[] {buildLoggerClassName});
-		}
-		// add properties
-		Method addUserProperties = classInternalAntRunner.getMethod("addUserProperties", new Class[] {Map.class});
-		addUserProperties.invoke(runner, new Object[] {userProperties});
-		// set message output level
-		Method setMessageOutputLevel = classInternalAntRunner.getMethod("setMessageOutputLevel", new Class[] {int.class});
-		setMessageOutputLevel.invoke(runner, new Object[] {new Integer(messageOutputLevel)});
-		// set execution targets
-		if (targets != null) {
-			Method setExecutionTargets = classInternalAntRunner.getMethod("setExecutionTargets", new Class[] {Vector.class});
-			setExecutionTargets.invoke(runner, new Object[] {targets});
-		}
-		// set extra arguments
-		if (arguments != null) {
-			Method setArguments = classInternalAntRunner.getMethod("setArguments", new Class[] {String.class});
-			setArguments.invoke(runner, new Object[] {arguments});
-		}
-		// run
-		Method run = classInternalAntRunner.getMethod("run", null);
-		run.invoke(runner, null);
-	} catch (InvocationTargetException e) {
-		Throwable realException = e.getTargetException();
-		throw new CoreException(new Status(IStatus.ERROR, PI_ANTCORE, ERROR_RUNNING_SCRIPT, Policy.bind("error.buildFailed"), realException));
-	} catch (Exception e) {
-		throw new CoreException(new Status(IStatus.ERROR, PI_ANTCORE, ERROR_RUNNING_SCRIPT, Policy.bind("error.buildFailed"), e));
-	}
-}
-
-/**
- * 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 {
-	ClassLoader loader = getClassLoader();
-	Class classInternalAntRunner = loader.loadClass("org.eclipse.ant.internal.core.ant.InternalAntRunner");
-	Object runner = classInternalAntRunner.newInstance();
-	Method run = classInternalAntRunner.getMethod("run", new Class[] {Object.class});
-	run.invoke(runner, new Object[] {argArray});
-	return null;
-}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/package.html b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/package.html
deleted file mode 100644
index a931089..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/package.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides support for running the Ant build tool in the platform.
-<h2>
-Package Specification</h2>
-This package defines a number of task and data types and various infrastructure
-pieces which make Ant in the platform easier and more powerful.
-</body>
-</html>
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntClassLoader.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntClassLoader.java
deleted file mode 100644
index 41c5a92..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntClassLoader.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.core;
-
-import java.net.URL;
-import java.net.URLClassLoader;
-
-public class AntClassLoader extends URLClassLoader {
-
-	protected ClassLoader[] pluginLoaders;
-
-public AntClassLoader(URL[] urls, ClassLoader[] pluginLoaders, ClassLoader parent) {
-	super(urls, parent);
-	this.pluginLoaders = pluginLoaders;
-}
-
-public Class loadClass(String name) throws ClassNotFoundException {
-	Class result = loadClassParent(name);
-	if (result == null)
-		result = loadClassURLs(name);
-	if (result == null)
-		result = loadClassPlugins(name);
-	if (result == null)
-		throw new ClassNotFoundException(name);
-	return result;
-}
-
-protected Class loadClassParent(String name) {
-	try {
-		ClassLoader parent = getParent();
-		if (parent != null)
-			return parent.loadClass(name);
-	} catch (ClassNotFoundException e) {
-	}
-	return null;
-}
-
-protected Class loadClassURLs(String name) {
-	try {
-		return super.loadClass(name);
-	} catch (ClassNotFoundException e) {
-	}
-	return null;
-}
-
-protected Class loadClassPlugins(String name) {
-	Class result = null;
-	if (pluginLoaders != null) {
-		for (int i = 0; (i < pluginLoaders.length) && (result == null); i++) {
-			try {
-				result = pluginLoaders[i].loadClass(name);
-			} catch (ClassNotFoundException e) {
-			}
-		}
-	}
-	return result;
-}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntCorePreferences.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntCorePreferences.java
deleted file mode 100644
index 6b05f02..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/AntCorePreferences.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.core;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.*;
-
-import org.eclipse.ant.core.AntCorePlugin;
-import org.eclipse.core.runtime.*;
-/**
- * 
- */
-public class AntCorePreferences implements IAntCoreConstants {
-
-	protected List defaultTasks;
-	protected List defaultTypes;
-	protected List defaultURLs;
-	protected Task[] customTasks;
-	protected Type[] customTypes;
-	protected URL[] customURLs;
-	protected Map defaultObjects;
-	protected List pluginClassLoaders;
-	
-public AntCorePreferences(Map defaultTasks, Map defaultObjects, Map defaultTypes) {
-	initializePluginClassLoaders();
-	defaultURLs = new ArrayList(20);
-	this.defaultTasks = computeDefaultTasks(defaultTasks);
-	this.defaultTypes = computeDefaultTypes(defaultTypes);
-	this.defaultObjects = computeDefaultObjects(defaultObjects);
-	restoreCustomObjects();
-}
-
-protected void restoreCustomObjects() {
-	Preferences prefs = AntCorePlugin.getPlugin().getPluginPreferences();
-	// tasks
-	String tasks = prefs.getString(PREFERENCE_TASKS);
-	if (tasks.equals(""))
-		customTasks = new Task[0];
-	else
-		customTasks = extractTasks(prefs, getArrayFromString(tasks));
-	// types
-	String types = prefs.getString(PREFERENCE_TYPES);
-	if (types.equals(""))
-		customTypes = new Type[0];
-	else
-		customTypes = extractTypes(prefs, getArrayFromString(types));
-	// urls
-	String urls = prefs.getString(PREFERENCE_URLS);
-	if (urls.equals(""))
-		customURLs = getDefaultCustomURLs();
-	else
-		customURLs = extractURLs(prefs, getArrayFromString(urls));
-}
-
-protected Task[] extractTasks(Preferences prefs, String[] tasks) {
-	List result = new ArrayList(10);
-	for (int i = 0; i < tasks.length; i++) {
-		try {
-			String taskName = tasks[i];
-			String[] values = getArrayFromString(prefs.getString(PREFIX_TASK + taskName));
-			Task task = new Task();
-			task.setTaskName(taskName);
-			task.setClassName(values[0]);
-			task.setLibrary(new URL(values[1]));
-			result.add(task);
-		} catch (MalformedURLException e) {
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_MALFORMED_URL, Policy.bind("exception.malformedURL"), e);
-			AntCorePlugin.getPlugin().getLog().log(status);
-		}
-	}
-	return (Task[]) result.toArray(new Task[result.size()]);
-}
-
-protected Type[] extractTypes(Preferences prefs, String[] types) {
-	List result = new ArrayList(10);
-	for (int i = 0; i < types.length; i++) {
-		try {
-			String typeName = types[i];
-			String[] values = getArrayFromString(prefs.getString(PREFIX_TYPE + typeName));
-			Type type = new Type();
-			type.setTypeName(typeName);
-			type.setClassName(values[0]);
-			type.setLibrary(new URL(values[1]));
-			result.add(type);
-		} catch (MalformedURLException e) {
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_MALFORMED_URL, Policy.bind("exception.malformedURL"), e);
-			AntCorePlugin.getPlugin().getLog().log(status);
-		}
-	}
-	return (Type[]) result.toArray(new Type[result.size()]);
-}
-
-protected URL[] extractURLs(Preferences prefs, String[] urls) {
-	List result = new ArrayList(10);
-	for (int i = 0; i < urls.length; i++) {
-		try {
-			result.add(new URL(urls[i]));
-		} catch (MalformedURLException e) {
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_MALFORMED_URL, Policy.bind("exception.malformedURL"), e);
-			AntCorePlugin.getPlugin().getLog().log(status);
-		}
-	}
-	return (URL[]) result.toArray(new URL[result.size()]);
-}
-
-
-
-
-public URL[] getDefaultCustomURLs() {
-	List result = new ArrayList(10);
-	IPluginDescriptor descriptor = Platform.getPlugin("org.apache.ant").getDescriptor();
-	addLibraries(descriptor, result);
-	descriptor = Platform.getPlugin("org.apache.xerces").getDescriptor();
-	addLibraries(descriptor, result);
-	addToolsJar(result);
-	return (URL[]) result.toArray(new URL[result.size()]);
-}
-
-protected List computeDefaultTasks(Map tasks) {
-	List result = new ArrayList(10);
-	for (Iterator iterator = tasks.entrySet().iterator(); iterator.hasNext();) {
-		Map.Entry entry = (Map.Entry) iterator.next();
-		Task task = new Task();
-		task.setTaskName((String) entry.getKey());
-		IConfigurationElement element = (IConfigurationElement) entry.getValue();
-		task.setClassName(element.getAttribute(AntCorePlugin.CLASS));
-		String library = element.getAttribute(AntCorePlugin.LIBRARY);
-		if (library == null) {
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_LIBRARY_NOT_SPECIFIED, Policy.bind("error.libraryNotSpecified", task.getTaskName()), null);
-			AntCorePlugin.getPlugin().getLog().log(status);
-			continue;
-		}
-		IPluginDescriptor descriptor = element.getDeclaringExtension().getDeclaringPluginDescriptor();
-		try {
-			URL url = Platform.asLocalURL(new URL(descriptor.getInstallURL(), library));
-			task.setLibrary(url);
-			defaultURLs.add(url);
-		} catch (Exception e) {
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_MALFORMED_URL, Policy.bind("exception.malformedURL"), e);
-			AntCorePlugin.getPlugin().getLog().log(status);
-			continue;
-		}
-		result.add(task);
-		addPluginClassLoader(descriptor.getPluginClassLoader());
-	}
-	return result;
-}
-
-protected List computeDefaultTypes(Map types) {
-	List result = new ArrayList(10);
-	for (Iterator iterator = types.entrySet().iterator(); iterator.hasNext();) {
-		Map.Entry entry = (Map.Entry) iterator.next();
-		Type type = new Type();
-		type.setTypeName((String) entry.getKey());
-		IConfigurationElement element = (IConfigurationElement) entry.getValue();
-		type.setClassName(element.getAttribute(AntCorePlugin.CLASS));
-		String library = element.getAttribute(AntCorePlugin.LIBRARY);
-		if (library == null) {
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_LIBRARY_NOT_SPECIFIED, Policy.bind("error.libraryNotSpecified", type.getTypeName()), null);
-			AntCorePlugin.getPlugin().getLog().log(status);
-			continue;
-		}
-		IPluginDescriptor descriptor = element.getDeclaringExtension().getDeclaringPluginDescriptor();
-		try {
-			URL url = Platform.asLocalURL(new URL(descriptor.getInstallURL(), library));
-			type.setLibrary(url);
-			defaultURLs.add(url);
-		} catch (Exception e) {
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_MALFORMED_URL, Policy.bind("exception.malformedURL"), e);
-			AntCorePlugin.getPlugin().getLog().log(status);
-			continue;
-		}
-		result.add(type);
-		addPluginClassLoader(descriptor.getPluginClassLoader());
-	}
-	return result;
-}
-
-/**
- * It returns the same objects as passed in the arguments. The only difference
- * is that it does extract other useful information.
- */
-protected Map computeDefaultObjects(Map objects) {
-	for (Iterator iterator = objects.entrySet().iterator(); iterator.hasNext();) {
-		Map.Entry entry = (Map.Entry) iterator.next();
-		IConfigurationElement element = (IConfigurationElement) entry.getValue();
-		String library = element.getAttribute(AntCorePlugin.LIBRARY);
-		if (library == null) {
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_LIBRARY_NOT_SPECIFIED, Policy.bind("error.libraryNotSpecified", (String) entry.getKey()), null);
-			AntCorePlugin.getPlugin().getLog().log(status);
-			continue;
-		}
-		IPluginDescriptor descriptor = element.getDeclaringExtension().getDeclaringPluginDescriptor();
-		try {
-			URL url = Platform.asLocalURL(new URL(descriptor.getInstallURL(), library));
-			defaultURLs.add(url);
-		} catch (Exception e) {
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_MALFORMED_URL, Policy.bind("exception.malformedURL"), e);
-			AntCorePlugin.getPlugin().getLog().log(status);
-			continue;
-		}
-		addPluginClassLoader(descriptor.getPluginClassLoader());
-	}
-	return objects;
-}
-
-/**
- * Ant running through the command line tries to find tools.jar to help the user. Try
- * emulating the same behaviour here.
- */
-protected void addToolsJar(List destination) {
-	IPath path = new Path(System.getProperty("java.home"));
-	if (path.lastSegment().equalsIgnoreCase("jre"))
-		path = path.removeLastSegments(1);
-	path = path.append("lib").append("tools.jar");
-	File tools = path.toFile();
-	if (!tools.exists())
-		return;
-	try {
-		destination.add(tools.toURL());
-	} catch (MalformedURLException e) {
-		IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, ERROR_MALFORMED_URL, Policy.bind("exception.malformedURL"), e);
-		AntCorePlugin.getPlugin().getLog().log(status);
-	}
-}
-
-protected void addLibraries(IPluginDescriptor source, List destination) {
-	URL root = source.getInstallURL();
-	ILibrary[] libraries = source.getRuntimeLibraries();
-	for (int i = 0; i < libraries.length; i++) {
-		try {
-			URL url = new URL(root, libraries[i].getPath().toString());
-			destination.add(Platform.asLocalURL(url));
-		} catch (Exception e) {
-			// FIXME: add error code and better message
-			IStatus status = new Status(IStatus.ERROR, AntCorePlugin.PI_ANTCORE, -1, e.getMessage(), e);
-			AntCorePlugin.getPlugin().getLog().log(status);
-			continue;
-		}
-	}
-}
-
-
-
-protected void addPluginClassLoader(ClassLoader loader) {
-	if (!pluginClassLoaders.contains(loader))
-		pluginClassLoaders.add(loader);
-}
-
-
-
-public URL[] getURLs() {
-	List result = new ArrayList(10);
-	if (defaultURLs != null)
-		result.addAll(defaultURLs);
-	if (customURLs != null)
-		result.addAll(Arrays.asList(customURLs));
-	return (URL[]) result.toArray(new URL[result.size()]);
-}
-
-public ClassLoader[] getPluginClassLoaders() {
-	return (ClassLoader[]) pluginClassLoaders.toArray(new ClassLoader[pluginClassLoaders.size()]);
-}
-
-protected void initializePluginClassLoaders() {
-	pluginClassLoaders = new ArrayList(20);
-	// ant.core should always be present
-	pluginClassLoaders.add(Platform.getPlugin(AntCorePlugin.PI_ANTCORE).getDescriptor().getPluginClassLoader());
-}
-
-
-/**
- * Returns default + custom tasks.
- */
-public List getTasks() {
-	List result = new ArrayList(10);
-	if (defaultTasks != null)
-		result.addAll(defaultTasks);
-	if (customTasks != null)
-		result.addAll(Arrays.asList(customTasks));
-	return result;
-}
-
-public Task[] getCustomTasks() {
-	return customTasks;
-}
-
-public Type[] getCustomTypes() {
-	return customTypes;
-}
-
-public URL[] getCustomURLs() {
-	return customURLs;
-}
-
-public void setCustomTasks(Task[] tasks) {
-	this.customTasks = tasks;
-}
-
-public void setCustomTypes(Type[] types) {
-	this.customTypes = types;
-}
-
-public void setCustomURLs(URL[] urls) {
-	this.customURLs = urls;
-}
-
-/**
- * Returns default + custom types.
- */
-public List getTypes() {
-	List result = new ArrayList(10);
-	if (defaultTypes != null)
-		result.addAll(defaultTypes);
-	if (customTypes != null)
-		result.addAll(Arrays.asList(customTypes));
-	return result;
-}
-
-/**
- * Convert a list of tokens into an array. The list separator has to be specified.
- */
-public static String[] getArrayFromString(String list, String separator) {
-	if (list == null || list.trim().equals(""))
-		return new String[0];
-	ArrayList result = new ArrayList();
-	for (StringTokenizer tokens = new StringTokenizer(list, separator); tokens.hasMoreTokens();) {
-		String token = tokens.nextToken().trim();
-		if (!token.equals(""))
-			result.add(token);
-	}
-	return (String[]) result.toArray(new String[result.size()]);
-}
-
-/**
- * convert a list of comma-separated tokens into an array
- */
-public static String[] getArrayFromString(String list) {
-	return getArrayFromString(list, ",");
-}
-
-public void updatePluginPreferences() {
-	Preferences prefs = AntCorePlugin.getPlugin().getPluginPreferences();
-	updateTasks(prefs);
-	updateTypes(prefs);
-	updateURLs(prefs);
-}
-
-protected void updateTasks(Preferences prefs) {
-	if (customTasks.length == 0) {
-		prefs.setValue(PREFERENCE_TASKS, "");
-		return;
-	}
-	StringBuffer tasks = new StringBuffer();
-	for (int i = 0; i < customTasks.length; i++) {
-		tasks.append(customTasks[i].getTaskName());
-		tasks.append(",");
-		prefs.setValue(PREFIX_TASK + customTasks[i].getTaskName(), customTasks[i].getClassName() + "," + customTasks[i].getLibrary().toExternalForm());
-	}
-	prefs.setValue(PREFERENCE_TASKS, tasks.toString());
-}
-
-protected void updateTypes(Preferences prefs) {
-	if (customTypes.length == 0) {
-		prefs.setValue(PREFERENCE_TYPES, "");
-		return;
-	}
-	StringBuffer types = new StringBuffer();
-	for (int i = 0; i < customTypes.length; i++) {
-		types.append(customTypes[i].getTypeName());
-		types.append(",");
-		prefs.setValue(PREFIX_TYPE + customTypes[i].getTypeName(), customTypes[i].getClassName() + "," + customTypes[i].getLibrary().toExternalForm());
-	}
-	prefs.setValue(PREFERENCE_TYPES, types.toString());
-}
-
-protected void updateURLs(Preferences prefs) {
-	StringBuffer urls = new StringBuffer();
-	for (int i = 0; i < customURLs.length; i++) {
-		urls.append(customURLs[i].toExternalForm());
-		urls.append(",");
-	}
-	prefs.setValue(PREFERENCE_URLS, urls.toString());
-}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/IAntCoreConstants.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/IAntCoreConstants.java
deleted file mode 100644
index bd47ef0..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/IAntCoreConstants.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.core;
-
-/**
- * Common constants.
- */
-public interface IAntCoreConstants {
-
-	// default values
-	public static final String PI_ANTCORE = "org.eclipse.ant.core";
-	public static final String DEFAULT_BUILD_FILENAME = "build.xml";
-	
-	// error codes
-	public static final int ERROR_RUNNING_SCRIPT = 1;
-	public static final int ERROR_MALFORMED_URL = 2;
-	public static final int ERROR_LIBRARY_NOT_SPECIFIED = 3;
-
-	// preferences
-	public static final String PREFERENCE_TASKS = "tasks";
-	public static final String PREFERENCE_TYPES = "types";
-	public static final String PREFERENCE_URLS = "urls";
-	public static final String PREFIX_TASK = "task.";
-	public static final String PREFIX_TYPE = "type.";
-	public static final String PREFIX_URL = "url.";
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/Policy.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/Policy.java
deleted file mode 100644
index 2e8ff68..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/Policy.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2000,2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.core;
-
-import java.text.MessageFormat;
-import java.util.*;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-public class Policy {
-	private static final String bundleName = "org.eclipse.ant.internal.core.messages";//$NON-NLS-1$
-	private static ResourceBundle bundle = ResourceBundle.getBundle(bundleName, Locale.getDefault());
-
-/**
- * Lookup the message with the given ID in this catalog 
- */
-public static String bind(String id) {
-	return bind(id, (String[])null);
-}
-public static IProgressMonitor monitorFor(IProgressMonitor monitor) {
-	if (monitor == null)
-		return new NullProgressMonitor();
-	return monitor;
-}
-/**
- * Lookup the message with the given ID in this catalog and bind its
- * substitution locations with the given string.
- */
-public static String bind(String id, String binding) {
-	return bind(id, new String[] {binding});
-}
-/**
- * Lookup the message with the given ID in this catalog and bind its
- * substitution locations with the given strings.
- */
-public static String bind(String id, String binding1, String binding2) {
-	return bind(id, new String[] {binding1, binding2});
-}
-
-/**
- * Lookup the message with the given ID in this catalog and bind its
- * substitution locations with the given string values.
- */
-public static String bind(String id, String[] bindings) {
-	if (id == null)
-		return "No message available";//$NON-NLS-1$
-	String message = null;
-	try {
-		message = bundle.getString(id);
-	} catch (MissingResourceException e) {
-		// If we got an exception looking for the message, fail gracefully by just returning
-		// the id we were looking for.  In most cases this is semi-informative so is not too bad.
-		return "Missing message: " + id + " in: " + bundleName;//$NON-NLS-1$
-	}
-	if (bindings == null)
-		return message;
-	return MessageFormat.format(message, bindings);
-}
-}
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/Task.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/Task.java
deleted file mode 100644
index 9d09cda..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/Task.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.core;
-
-import java.net.URL;
-
-public class Task {
-
-	protected String taskName;
-	protected String className;
-	protected URL library;
-
-/**
- * Gets the className.
- * @return Returns a String
- */
-public String getClassName() {
-	return className;
-}
-
-/**
- * Sets the className.
- * @param className The className to set
- */
-public void setClassName(String className) {
-	this.className = className;
-}
-
-/**
- * Gets the library.
- * @return Returns a URL
- */
-public URL getLibrary() {
-	return library;
-}
-
-/**
- * Sets the library.
- * @param library The library to set
- */
-public void setLibrary(URL library) {
-	this.library = library;
-}
-
-/**
- * Gets the taskName.
- * @return Returns a String
- */
-public String getTaskName() {
-	return taskName;
-}
-
-/**
- * Sets the taskName.
- * @param taskName The taskName to set
- */
-public void setTaskName(String taskName) {
-	this.taskName = taskName;
-}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/Type.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/Type.java
deleted file mode 100644
index 3ba3664..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/Type.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.core;
-
-import java.net.URL;
-
-public class Type {
-
-	protected String typeName;
-	protected String className;
-	protected URL library;
-
-/**
- * Gets the className.
- * @return Returns a String
- */
-public String getClassName() {
-	return className;
-}
-
-/**
- * Sets the className.
- * @param className The className to set
- */
-public void setClassName(String className) {
-	this.className = className;
-}
-
-/**
- * Gets the library.
- * @return Returns a URL
- */
-public URL getLibrary() {
-	return library;
-}
-
-/**
- * Sets the library.
- * @param library The library to set
- */
-public void setLibrary(URL library) {
-	this.library = library;
-}
-
-/**
- * Gets the taskName.
- * @return Returns a String
- */
-public String getTypeName() {
-	return typeName;
-}
-
-/**
- * Sets the taskName.
- * @param taskName The taskName to set
- */
-public void setTypeName(String taskName) {
-	this.typeName = taskName;
-}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/messages.properties b/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/messages.properties
deleted file mode 100644
index 7603d25..0000000
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/internal/core/messages.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-### Ant Core plugin message catalog
-
-### errors
-error.buildFailed = Build Failed.
-error.libraryNotSpecified = Library not specified for: {0}
-
-### exceptions
-exception.malformedURL = Malformed URL.
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/CommaPatternSet.java b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/CommaPatternSet.java
deleted file mode 100644
index d17087a..0000000
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/CommaPatternSet.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.core.ant;
-
-/*
- * 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 java.io.*;
-import java.util.*;
-
-import org.apache.tools.ant.*;
-import org.apache.tools.ant.types.PatternSet;
-import org.apache.tools.ant.types.Reference;
-import org.apache.tools.ant.types.PatternSet.NameEntry;
-import org.eclipse.ant.internal.core.Policy;
-
-/**
- * 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(Policy.bind("exception.missingIncludesFile", inclFile.getAbsolutePath()));
-                    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(Policy.bind("exception.missingExcludesFile", exclFile.getAbsolutePath()));
-                    readPatterns(exclFile, excludeList, p);
-                }
-            }
-            excludesFileList.removeAllElements();
-        }
-    }
-
-    public String toString()
-    {
-        return "patternSet{ includes: " + includeList + 
-            " excludes: " + excludeList + " }";
-    }
-}
-
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java
deleted file mode 100644
index 287e860..0000000
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java
+++ /dev/null
@@ -1,726 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.core.ant;
-
-/*
- * 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 java.io.*;
-import java.util.*;
-
-import org.apache.tools.ant.*;
-import org.eclipse.ant.core.AntCorePlugin;
-import org.eclipse.ant.internal.core.*;
-import org.eclipse.ant.internal.core.Policy;
-import org.eclipse.ant.internal.core.Task;
-import org.eclipse.core.runtime.IConfigurationElement;
-/**
- * Eclipse application entry point into Ant. Derived from the original Ant Main class
- * to ensure that the functionality is 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 InternalAntRunner {
-
-	/**
-	 *
-	 */
-	protected List buildListeners;
-
-	/**
-	 *
-	 */
-	protected String buildFileLocation;
-
-	/** Targets we want to run. */
-	protected Vector targets;
-
-	/**
-	 *
-	 */
-	protected Map userProperties;
-
-	/** Our current message output status. Follows Project.MSG_XXX */
-	protected int messageOutputLevel = Project.MSG_INFO;
-
-	/** Indicates whether output to the log is to be unadorned. */
-	protected boolean emacsMode = false;
-
-	/** Indicates we should only parse and display the project help information */
-	protected boolean projectHelp = false;
-
-	/** 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 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.
-	 */
-	protected String loggerClassname = null;
-
-	/** Extra arguments to be parsed as command line arguments. */
-	protected String extraArguments = null;
-
-	// properties
-	private static final String PROPERTY_ECLIPSE_RUNNING = "eclipse.running";
-
-public InternalAntRunner() {
-	buildListeners = new ArrayList(5);
-}
-
-/**
- * Adds a build listener.
- * 
- * @param buildListener a build listener
- */
-public void addBuildListeners(List classNames) {
-	List result = new ArrayList(10);
-	try {
-		for (Iterator iterator = classNames.iterator(); iterator.hasNext();) {
-			String className = (String) iterator.next();
-			Class listener = Class.forName(className);
-			result.add(listener.newInstance());
-		}
-	} catch (Exception e) {
-		throw new BuildException(e);
-	}
-	this.buildListeners = result;
-}
-
-/**
- * Adds a build logger .
- * 
- * @param
- */
-public void addBuildLogger(String className) {
-	this.loggerClassname = className;
-}
-
-/**
- * Adds user properties.
- */
-public void addUserProperties(Map properties) {
-	this.userProperties = properties;
-}
-
-protected void addBuildListeners(Project project) {
-	try {
-		project.addBuildListener(createLogger());
-		for (Iterator iterator = buildListeners.iterator(); iterator.hasNext();)
-			project.addBuildListener((BuildListener) iterator.next());
-	} catch (Exception e) {
-		throw new BuildException(e);
-	}
-}
-
-
-protected void setProperties(Project project) {
-	project.setUserProperty(PROPERTY_ECLIPSE_RUNNING, "true");
-    project.setUserProperty("ant.file" , buildFileLocation);
-	project.setUserProperty("ant.version", getAntVersion());
-    if (userProperties == null)
-    	return;
-    for (Iterator iterator = userProperties.entrySet().iterator(); iterator.hasNext();) {
-		Map.Entry entry = (Map.Entry) iterator.next();
-		project.setUserProperty((String) entry.getKey(), (String) entry.getValue());
-	}
-}
-
-protected void setTasks(Project project) {
-	List tasks = AntCorePlugin.getPlugin().getPreferences().getTasks();
-	if (tasks == null)
-		return;
-	try {
-		for (Iterator iterator = tasks.iterator(); iterator.hasNext();) {
-			Task task = (Task) iterator.next();
-			Class taskClass = Class.forName(task.getClassName());
-			project.addTaskDefinition(task.getTaskName(), taskClass);
-		}
-	} catch (ClassNotFoundException e) {
-		throw new BuildException(e);
-	}
-}
-
-protected void setTypes(Project project) {
-	List types = AntCorePlugin.getPlugin().getPreferences().getTypes();
-	if (types == null)
-		return;
-	try {
-		for (Iterator iterator = types.iterator(); iterator.hasNext();) {
-			Type type = (Type) iterator.next();
-			Class typeClass = Class.forName(type.getClassName());
-			project.addDataTypeDefinition(type.getTypeName(), typeClass);
-		}
-	} catch (Exception e) {
-		throw new BuildException(e);
-	}
-}
-
-
-/**
- * Parses the build script and adds necessary information into
- * the given project.
- */
-protected void parseScript(Project project) {
-	File buildFile = new File(buildFileLocation);
-	ProjectHelper.configureProject(project, buildFile);
-}
-
-/**
- * Runs the build script.
- */
-public void run() {
-	if (extraArguments != null)
-		processCommandLine(getArrayList(extraArguments));
-	Project project = new Project();
-	Throwable error = null;
-    PrintStream originalErr = System.err;
-    PrintStream originalOut = System.out;
-	try {
-        System.setOut(new PrintStream(new DemuxOutputStream(project, false)));
-        System.setErr(new PrintStream(new DemuxOutputStream(project, true)));
-		project.log(Policy.bind("label.buildFile", buildFileLocation));
-        fireBuildStarted(project);
-		project.init();
-		addBuildListeners(project);
-		setProperties(project);
-		setTasks(project);
-		setTypes(project);
-		parseScript(project);
-		if (projectHelp) {
-			printHelp(project);
-			return;
-		}
-		if (targets != null && !targets.isEmpty())
-			project.executeTargets(targets);
-		else
-			project.executeTarget(project.getDefaultTarget());
-	} catch(RuntimeException e) {
-        error = e;
-        throw e;
-    } catch(Error e) {
-        error = e;
-        throw e;
-	} finally {
-		if (error != null)
-			error.printStackTrace();
-        System.setErr(originalErr);
-        System.setOut(originalOut);
-		fireBuildFinished(project, error);
-	}
-}
-
-/**
- * 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(project, defaultName, defaultDesc, Policy.bind("label.defaultTarget"), maxLength);
-
-    }
-
-    printTargets(project, topNames, topDescriptions, Policy.bind("label.mainTargets"), maxLength);
-    printTargets(project, subNames, null, Policy.bind("label.subTargets"), 0);
-}
-
-/**
- * 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;
-}
-
-/**
- * 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(Project project, 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(project, msg.toString(), Project.MSG_INFO);
-}
-
-/**
- * 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 void run(Object argArray) throws Exception {
-	boolean success = processCommandLine(getArrayList((String[]) argArray));
-    if (!success)
-        return;
-	try {
-		run();
-	} catch (Exception e) {
-		printMessage(e);
-		throw e;
-	}
-}
-
-/**
- * Prints the message of the Throwable if it is not null.
- * 
- * @param t the throwable whose message is to be displayed
- */
-protected void printMessage(Throwable t) {
-	String message= t.getMessage();
-	if (message != null)
-		logMessage(null, message, Project.MSG_ERR);
-}
-
-/**
- * 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
- */
-protected BuildLogger createLogger() {
-	BuildLogger logger = null;
-	if (loggerClassname != null) {
-		try {
-			logger = (BuildLogger) (Class.forName(loggerClassname).newInstance());
-		} catch (Exception e) {
-			String message = Policy.bind("exception.cannotCreateLogger", loggerClassname);
-			logMessage(null, message, Project.MSG_ERR);
-			throw new BuildException(e);
-		}
-	} else {
-		logger = new DefaultLogger();
-	}
-	logger.setMessageOutputLevel(messageOutputLevel);
-	logger.setOutputPrintStream(out);
-	logger.setErrorPrintStream(err);
-	logger.setEmacsMode(emacsMode);
-	return logger;
-}
-
-/**
- * We only have to do this because Project.fireBuildStarted is protected. If it becomes
- * public we should remove this method and call the appropriate one.
- */
-private void fireBuildStarted(Project project) {
-    BuildEvent event = new BuildEvent(project);
-    for (Iterator iterator = buildListeners.iterator(); iterator.hasNext();) {
-        BuildListener listener = (BuildListener) iterator.next();
-        listener.buildStarted(event);
-	}
-}
-
-/**
- * We only have to do this because Project.fireBuildFinished is protected. If it becomes
- * public we should remove this method and call the appropriate one.
- */
-private void fireBuildFinished(Project project, Throwable error) {
-    BuildEvent event = new BuildEvent(project);
-    event.setException(error);
-    for (Iterator iterator = buildListeners.iterator(); iterator.hasNext();) {
-        BuildListener listener = (BuildListener) iterator.next();
-        listener.buildFinished(event);
-	}
-}
-
-protected void logMessage(Project project, String message, int priority) {
-	if (project == null)
-		project = new Project();
-    BuildEvent event = new BuildEvent(project);
-    event.setMessage(message, priority);
-    for (Iterator iterator = buildListeners.iterator(); iterator.hasNext();) {
-        BuildListener listener = (BuildListener) iterator.next();
-        listener.messageLogged(event);
-	}
-}
-
-/**
- * Sets the buildFileLocation.
- * 
- * @param buildFileLocation the file system location of the build file
- */
-public void setBuildFileLocation(String buildFileLocation) {
-	this.buildFileLocation = buildFileLocation;
-}
-
-/**
- * Sets the message output level. Use -1 for none.
- * 
- * @param 
- */
-public void setMessageOutputLevel(int level) {
-	this.messageOutputLevel = level;
-}
-
-/**
- * 
- */
-public void setArguments(String args) {
-	this.extraArguments = args;
-}
-
-/**
- * Sets the execution targets.
- * 
- */
-public void setExecutionTargets(Vector executiongTargets) {
-	targets = executiongTargets;
-}
-
-protected static String getAntVersion() throws BuildException {
-    try {
-        Properties props = new Properties();
-        InputStream in = Main.class.getResourceAsStream("/org/apache/tools/ant/version.txt");
-        props.load(in);
-        in.close();
-        
-        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"));
-        return msg.toString();
-    } catch (IOException ioe) {
-        throw new BuildException(Policy.bind("exception.cannotLoadVersionInfo", ioe.getMessage()));
-    } catch (NullPointerException npe) {
-        throw new BuildException(Policy.bind("exception.cannotLoadVersionInfo", ""));
-    }
-}
-
-/**
- * Looks for interesting command line arguments. Returns true is it is OK to run
- * the script.
- */
-protected boolean processCommandLine(List commands) {
-	// looks for flag-like commands
-	if (commands.remove("-help")) {
-		printUsage();
-		return false;
-	} 
-	if (commands.remove("-version")) {
-		printVersion();
-		return false;
-	} 
-	if (commands.remove("-quiet") || commands.remove("-q")) {
-		messageOutputLevel = Project.MSG_WARN;
-	} 
-	if (commands.remove("-verbose") || commands.remove("-v")) {
-		messageOutputLevel = Project.MSG_VERBOSE;
-	} 
-	if (commands.remove("-debug")) {
-		messageOutputLevel = Project.MSG_DEBUG;
-	}
-	if (commands.remove("-emacs")) {
-		emacsMode = true;
-	}
-	if (commands.remove("-projecthelp")) {
-		projectHelp = true;
-	} 
-	
-	// look for argumments
-	String[] args = getArguments(commands, "-logfile");
-	if (args == null) {
-		args = getArguments(commands, "-l");
-	}
-	if (args != null) {
-		try {
-			File logFile = new File(args[0]);
-			out = new PrintStream(new FileOutputStream(logFile));
-			err = out;
-		} catch (IOException e) {
-			logMessage(null, Policy.bind("exception.cannotWriteToLog"), Project.MSG_INFO);
-			return false;
-		}
-	}
-
-	args = getArguments(commands, "-buildfile");
-	if (args == null) {
-		args = getArguments(commands, "-file");
-		if (args == null)
-			args = getArguments(commands, "-f");
-	}
-	if (args != null) {
-		buildFileLocation = args[0];
-		targets = new Vector();
-		for (int i = 1; i < args.length; i++)
-			targets.add(args[i]);
-	}
-
-	args = getArguments(commands, "-listener");
-	if (args != null)
-		buildListeners.add(args[0]);
-
-	args = getArguments(commands, "-logger");
-	if (args != null)
-		loggerClassname = args[0];
-
-	processProperties(commands);
-
-	return true;
-}
-
-protected void processProperties(List commands) {
-	userProperties = new HashMap(10);
-	String[] args = (String[]) commands.toArray(new String[commands.size()]);
-	for (int i = 0; i < args.length; i++) {
-		String arg = args[i];
-		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];
-	
-			userProperties.put(name, value);
-			commands.remove(args[i]);
-		}
-	}
-}
-
-/**
- * Print the project description, if any
- */
-protected void printHelp(Project project) {
-	if (project.getDescription() != null)
-		logMessage(project, project.getDescription(), Project.MSG_INFO);
-	printTargets(project);
-}
-
-/**
- * Logs a message with the client indicating the version of <b>Ant</b> that this class
- * fronts.
- */
-protected void printVersion() {
- 	logMessage(null, getAntVersion(), Project.MSG_INFO);
-}
-
-/**
- * Logs a message with the client outlining the usage of <b>Ant</b>.
- */
-protected 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(null, msg.toString(), Project.MSG_INFO);
-}
-
-/**
- * From a command line list, get the array of arguments of a given parameter.
- * The parameter and its arguments are removed from the list.
- * @return null if the parameter is not found or has no arguments
- */
-protected String[] getArguments(List commands, String param) {
-	int index = commands.indexOf(param);
-	if (index == -1)
-		return null;
-	commands.remove(index);
-	if (index == commands.size()) // if this is the last command
-		return null;
-	List args = new ArrayList(commands.size());
-	while (index < commands.size()) { // while not the last command
-		String command = (String) commands.get(index);
-		if (command.startsWith("-")) // is it a new parameter?
-			break;
-		args.add(command);
-		commands.remove(index);
-	}
-	if (args.isEmpty())
-		return null;
-	return (String[]) args.toArray(new String[args.size()]);
-}
-
-/**
- * Helper method to ensure an array is converted into an ArrayList.
- */
-private ArrayList getArrayList(String[] args) {
-	// We could be using Arrays.asList() here, but it does not specify
-	// what kind of list it will return. We do need a list that
-	// implements the method List.remove(int) and ArrayList does.
-	ArrayList result = new ArrayList(args.length);
-	for (int i = 0; i < args.length; i++)
-		result.add(args[i]);
-	return result;
-}
-
-/**
- * Helper method to ensure an array is converted into an ArrayList.
- */
-private ArrayList getArrayList(String args) {
-	ArrayList result = new ArrayList();
-	for (StringTokenizer tokens = new StringTokenizer(args, ","); tokens.hasMoreTokens();) {
-		String token = tokens.nextToken().trim();
-		if (!token.equals(""))
-			result.add(token);
-	}
-	return result;
-}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/Policy.java b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/Policy.java
deleted file mode 100644
index ef4673e..0000000
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/Policy.java
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/messages.properties b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/messages.properties
deleted file mode 100644
index 32d3da2..0000000
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/messages.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-### Ant Core Library message catalog
-
-### exception
-exception.cannotAppendToReference = Cannot append to a reference.
-exception.cannotCreateLogger = Unable to instantiate logger: {0}
-exception.cannotLoadVersionInfo = Could not load the version information. {0}
-exception.cannotWriteToLog = Cannot write on the specified log file.  Make sure the path exists and you have write permissions.
-exception.missingExcludesFile = Excludes file not found: {0}
-exception.missingIncludesFile = Includes file not found: {0}
-exception.notAPatternSet = Not a patternset: {0}
-exception.patternFile = An error occured while reading pattern file: {0}
-
-### labels
-label.buildFile = Build file: {0}
-label.defaultTarget = Default target:
-label.mainTargets = Main targets:
-label.subTargets = Subtargets:
-
-### usage
-usage.antVersion = Ant version 
-usage.beQuiet = be extra quiet
-usage.beVerbose = be extra verbose
-usage.compiledOn =  compiled on 
-usage.emacsLog = produce logging information without adornments
-usage.fileToBuild = use given buildfile
-usage.findFileToBuild = search for buildfile towards the root of the filesystem and use it
-usage.listenerClass = add an instance of class as a project listener
-usage.logClass = the class which is to perform logging
-usage.options = options
-usage.Options = Options
-usage.printDebugInfo = print debugging information
-usage.printMessage = print this message
-usage.projectHelp = print project help information
-usage.propertiesValues = use value for given property
-usage.target = target
-usage.useFile = use given file for log
-usage.versionInfo = print the version information and exit
diff --git a/ant/org.eclipse.ant.ui/.classpath b/ant/org.eclipse.ant.ui/.classpath
deleted file mode 100644
index f250af5..0000000
--- a/ant/org.eclipse.ant.ui/.classpath
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src"/>
-    <classpathentry kind="src" path="src_ant"/>
-    <classpathentry kind="src" path="/org.apache.ant"/>
-    <classpathentry kind="src" path="/org.eclipse.ant.core"/>
-    <classpathentry kind="src" path="/org.eclipse.core.resources"/>
-    <classpathentry kind="src" path="/org.eclipse.ui"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/ant/org.eclipse.ant.ui/.cvsignore b/ant/org.eclipse.ant.ui/.cvsignore
deleted file mode 100644
index 57b480f..0000000
--- a/ant/org.eclipse.ant.ui/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-lib
diff --git a/ant/org.eclipse.ant.ui/.project b/ant/org.eclipse.ant.ui/.project
deleted file mode 100644
index a05291f..0000000
--- a/ant/org.eclipse.ant.ui/.project
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ant.ui</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.ant</project>
-		<project>org.eclipse.ant.core</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.ui</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.team.cvs.core.cvsnature</nature>
-	</natures>
-</projectDescription>
diff --git a/ant/org.eclipse.ant.ui/about.html b/ant/org.eclipse.ant.ui/about.html
deleted file mode 100644
index 441774f..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 bbb0319..0000000
--- a/ant/org.eclipse.ant.ui/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-custom = true
-
-source.antui.jar=src/
-source.lib/antuilib.jar=src_ant/
-bin.includes=icons/,plugin.xml,*.jar,plugin.properties,about.html,lib/
-javadoc.packages=org.eclipse.*
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/build.xml b/ant/org.eclipse.ant.ui/build.xml
deleted file mode 100644
index b9f7ec6..0000000
--- a/ant/org.eclipse.ant.ui/build.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.ant.ui" default="plugin.zip" basedir=".">
-  <target name="initTemplate" unless="template">
-    <initTemplate/>
-  </target>
-  <target name="init" depends="initTemplate">
-    <property name="plugin" value="org.eclipse.ant.ui"/>
-    <property name="version" value="2.0.2"/>
-    <property name="stamp" value=""/>
-    <property name="os" value="win32"/>
-    <property name="ws" value="win32"/>
-    <property name="nl" value="en_US"/>
-    <property name="arch" value="x86"/>
-  </target>
-
-  <target name="src.zip" depends="init">
-    <property name="base" value="${basedir}/src.zip.pdetemp"/>
-    <delete dir="${base}"/>
-    <mkdir dir="${base}"/>
-    <antcall target="src">
-      <param name ="destroot" value="${base}/plugins/${plugin}_${version}"/>
-    </antcall>
-	<ant antfile="${template}" target="runZip">
-      <property name="resultingFile" value="${basedir}/${plugin}_${version}.src.zip"/>
-      <property name="targetDir" value="${base}"/>
-	</ant>
-    <delete dir="${base}"/>
-  </target>
-
-  <target name="plugin.zip" depends="bin.zip"/>
-  <target name="bin.zip" depends="init">
-    <property name="base" value="${basedir}/bin.zip.pdetemp"/>
-    <delete dir="${base}"/>
-    <mkdir dir="${base}"/>
-    <antcall target="jar">
-      <param name ="destroot" value="${base}/plugins/${plugin}_${version}"/>
-    </antcall>
-    <antcall target="bin">
-      <param name ="destroot" value="${base}/plugins/${plugin}_${version}"/>
-    </antcall>
-    <delete>
-      <fileset dir="${base}" includes="**/*.bin.log"/>
-    </delete>
-	<ant antfile="${template}" target="runZip">
-      <property name="resultingFile" value="${basedir}/${plugin}_${version}.zip"/>
-      <property name="targetDir" value="${base}"/>
-	</ant>
-    <delete dir="${base}"/>
-  </target>
-
-  <target name="log.zip" depends="init">
-    <property name="base" value="${basedir}/log.zip.pdetemp"/>
-    <delete dir="${base}"/>
-    <mkdir dir="${base}"/>
-    <antcall target="log">
-      <param name ="destroot" value="${base}/plugins/${plugin}_${version}"/>
-    </antcall>
-	<ant antfile="${template}" target="runZip">
-      <property name="resultingFile" value="${basedir}/${plugin}_${version}.log.zip"/>
-      <property name="targetDir" value="${base}"/>
-	</ant>
-    <delete dir="${base}"/>
-  </target>
-
-  <target name="antui.jar" depends="init">
-    <ant antfile="${template}" target="jar">
-      <property name="mapping" value="src/"/>
-      <property name="includes" value="src/"/>
-      <property name="excludes" value=""/>
-      <property name="dest" value="${basedir}/antui.jar"/>
-      <property name="compilePath" value="../org.eclipse.core.runtime/bin;../org.eclipse.core.runtime/runtime.jar;../org.eclipse.core.boot/bin;../org.eclipse.core.boot/boot.jar;../org.apache.ant/bin;../org.apache.ant/ant.jar;../org.apache.ant/jakarta-ant-1.4.1-optional.jar;../org.apache.xerces/bin;../org.apache.xerces/xerces.jar;../org.eclipse.ant.core/bin;../org.eclipse.ant.core/antsupport.jar;../org.eclipse.core.resources/bin;../org.eclipse.core.resources/resources.jar;../org.eclipse.ui/bin;../org.eclipse.ui/workbench.jar;../org.eclipse.help/bin;../org.eclipse.help/help.jar;../org.apache.lucene/bin;../org.apache.lucene/lucene-1.2-rc2.jar;../org.apache.lucene/lucenedemo.zip;../org.eclipse.swt/bin;../org.eclipse.swt/ws/${ws}/swt-pi.jar;../org.eclipse.swt/ws/${ws}/swt.jar"/>
-    </ant>
-  </target>
-
-  <target name="lib/antuilib.jar" depends="init">
-    <ant antfile="${template}" target="jar">
-      <property name="mapping" value="src_ant/"/>
-      <property name="includes" value="src_ant/"/>
-      <property name="excludes" value=""/>
-      <property name="dest" value="${basedir}/lib/antuilib.jar"/>
-      <property name="compilePath" value="../org.eclipse.core.runtime/bin;../org.eclipse.core.runtime/runtime.jar;../org.eclipse.core.boot/bin;../org.eclipse.core.boot/boot.jar;antui.jar;bin/;../org.apache.ant/bin;../org.apache.ant/ant.jar;../org.apache.ant/jakarta-ant-1.4.1-optional.jar;../org.apache.xerces/bin;../org.apache.xerces/xerces.jar;../org.eclipse.ant.core/bin;../org.eclipse.ant.core/antsupport.jar;../org.eclipse.core.resources/bin;../org.eclipse.core.resources/resources.jar;../org.eclipse.ui/bin;../org.eclipse.ui/workbench.jar;../org.eclipse.help/bin;../org.eclipse.help/help.jar;../org.apache.lucene/bin;../org.apache.lucene/lucene-1.2-rc2.jar;../org.apache.lucene/lucenedemo.zip;../org.eclipse.swt/bin;../org.eclipse.swt/ws/${ws}/swt-pi.jar;../org.eclipse.swt/ws/${ws}/swt.jar"/>
-    </ant>
-  </target>
-
-  <target name="jar" depends="init,antui.jar,lib/antuilib.jar">
-  </target>
-
-  <target name="antuisrc.zip" depends="init">
-    <property name="destroot" value="${basedir}"/>
-    <ant antfile="${template}" target="src">
-      <property name="mapping" value="src/"/>
-      <property name="includes" value="src/**/*.java"/>
-      <property name="excludes" value=""/>
-      <property name="dest" value="${destroot}/antuisrc.zip"/>
-    </ant>
-  </target>
-
-  <target name="lib/antuilibsrc.zip" depends="init">
-    <property name="destroot" value="${basedir}"/>
-    <ant antfile="${template}" target="src">
-      <property name="mapping" value="src_ant/"/>
-      <property name="includes" value="src_ant/**/*.java"/>
-      <property name="excludes" value=""/>
-      <property name="dest" value="${destroot}/lib/antuilibsrc.zip"/>
-    </ant>
-  </target>
-
-  <target name="src" depends="init,antuisrc.zip,lib/antuilibsrc.zip">
-  </target>
-
-  <target name="bin" depends="init">
-    <property name="destroot" value="${basedir}"/>
-    <ant antfile="${template}" target="bin">
-      <property name="includes" value="icons/,plugin.xml,*.jar,plugin.properties,about.html,lib/"/>
-      <property name="excludes" value="src/,src_ant/"/>
-      <property name="dest" value="${destroot}"/>
-    </ant>
-  </target>
-
-  <target name="log" depends="init">
-    <property name="destroot" value="${basedir}"/>
-    <ant antfile="${template}" target="log">
-      <property name="dest" value="${destroot}"/>
-    </ant>
-  </target>
-
-  <target name="clean" depends="init">
-    <ant antfile="${template}" target="clean">
-      <property name="jar" value="antui.jar,lib/antuilib.jar"/>
-      <property name="srczips" value="antuisrc.zip,lib/antuilibsrc.zip"/>
-    </ant>
-    <delete>
-      <fileset dir="." includes="**/*.pdetemp"/>
-    </delete>
-    <delete file="${plugin}_${version}.zip"/>
-    <delete file="${plugin}_${version}.src.zip"/>
-    <delete file="${plugin}_${version}.doc.zip"/>
-    <delete file="${plugin}_${version}.log.zip"/>
-  </target>
-</project>
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/eview16/classpath.gif b/ant/org.eclipse.ant.ui/icons/full/eview16/classpath.gif
deleted file mode 100644
index f966fc3..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/eview16/classpath.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/full/eview16/jar_l_obj.gif b/ant/org.eclipse.ant.ui/icons/full/eview16/jar_l_obj.gif
deleted file mode 100644
index 11e04e2..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/eview16/jar_l_obj.gif
+++ /dev/null
Binary files differ
diff --git a/ant/org.eclipse.ant.ui/icons/full/eview16/type.gif b/ant/org.eclipse.ant.ui/icons/full/eview16/type.gif
deleted file mode 100644
index 2db7604..0000000
--- a/ant/org.eclipse.ant.ui/icons/full/eview16/type.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/newpde_build.xml b/ant/org.eclipse.ant.ui/newpde_build.xml
deleted file mode 100644
index 9e33740..0000000
--- a/ant/org.eclipse.ant.ui/newpde_build.xml
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="org.eclipse.ant.ui" default="build.jars" basedir=".">
-
-	<target name="initTemplate" unless="template">
-		<initTemplate/>
-	</target>
-
-	<target name="init" depends="initTemplate, properties">
-	</target>
-
-	<target name="build.update.jar" depends="init">
-		<property name="base" value="${basedir}/bin.zip.pdetemp"/>
-		<delete dir="${base}"/>
-		<mkdir dir="${base}"/>
-		<antcall target="build.jars"/>
-		<antcall target="gather.bin.parts">
-			<param name="destination" value="${base}/"/>
-		</antcall>
-		<delete>
-			<fileset dir="${base}" includes="**/*.bin.log"/>
-		</delete>
-		<zip zipfile="${basedir}/${plugin}_${version}.jar" basedir="${base}/plugins/${plugin}"/>
-		<delete dir="${base}"/>
-	</target>
-
-	<target name="gather.bin.parts" depends="init" if="destination">
-		<ant antfile="${template}" target="includesExcludesCopy">
-			<property name="srcdir" value="${basedir}"/>
-			<property name="dest" value="${destination}/plugins/${plugin}"/>
-			<property name="excludes" value="${bin.excludes}"/>
-			<property name="includes" value="${bin.includes}"/>
-		</ant>
-	</target>
-
-	<target name="lib/antuilib.jar" depends="init">
-		<ant antfile="${template}" target="jar">
-			<property name="dest" value="${basedir}/lib/antuilib.jar"/>
-			<property name="srcdir" value="${basedir}"/>
-			<property name="includes" value="src_ant/"/>
-			<property name="excludes" value=""/>
-			<property name="mapping" value="src_ant/"/>
-			<property name="compilePath" value="${location.org.eclipse.core.runtime}/bin;${location.org.eclipse.core.runtime}/runtime.jar;${location.org.eclipse.core.boot}/bin;${location.org.eclipse.core.boot}/boot.jar;${location.org.eclipse.ant.ui}/bin;${location.org.eclipse.ant.ui}/antui.jar;${location.org.apache.ant}/bin;${location.org.apache.ant}/ant.jar;${location.org.apache.ant}/jakarta-ant-1.4.1-optional.jar;${location.org.apache.xerces}/bin;${location.org.apache.xerces}/xerces.jar;${location.org.eclipse.ant.core}/bin;${location.org.eclipse.ant.core}/antsupport.jar;${location.org.eclipse.core.resources}/bin;${location.org.eclipse.core.resources}/resources.jar;${location.org.eclipse.ui}/bin;${location.org.eclipse.ui}/workbench.jar;${location.org.eclipse.help}/bin;${location.org.eclipse.help}/help.jar;${location.org.apache.lucene}/bin;${location.org.apache.lucene}/lucene-1.2-rc2.jar;${location.org.apache.lucene}/lucenedemo.zip;${location.org.eclipse.swt}/bin;${location.org.eclipse.swt}/ws/${ws}/swt-pi.jar;${location.org.eclipse.swt}/ws/${ws}/swt.jar"/>
-		</ant>
-	</target>
-
-	<target name="antui.jar" depends="init">
-		<ant antfile="${template}" target="jar">
-			<property name="dest" value="${basedir}/antui.jar"/>
-			<property name="srcdir" value="${basedir}"/>
-			<property name="includes" value="src/"/>
-			<property name="excludes" value=""/>
-			<property name="mapping" value="src/"/>
-			<property name="compilePath" value="${location.org.eclipse.core.runtime}/bin;${location.org.eclipse.core.runtime}/runtime.jar;${location.org.eclipse.core.boot}/bin;${location.org.eclipse.core.boot}/boot.jar;${location.org.eclipse.ant.ui}/bin;${location.org.eclipse.ant.ui}/antui.jar;${location.org.apache.ant}/bin;${location.org.apache.ant}/ant.jar;${location.org.apache.ant}/jakarta-ant-1.4.1-optional.jar;${location.org.apache.xerces}/bin;${location.org.apache.xerces}/xerces.jar;${location.org.eclipse.ant.core}/bin;${location.org.eclipse.ant.core}/antsupport.jar;${location.org.eclipse.core.resources}/bin;${location.org.eclipse.core.resources}/resources.jar;${location.org.eclipse.ui}/bin;${location.org.eclipse.ui}/workbench.jar;${location.org.eclipse.help}/bin;${location.org.eclipse.help}/help.jar;${location.org.apache.lucene}/bin;${location.org.apache.lucene}/lucene-1.2-rc2.jar;${location.org.apache.lucene}/lucenedemo.zip;${location.org.eclipse.swt}/bin;${location.org.eclipse.swt}/ws/${ws}/swt-pi.jar;${location.org.eclipse.swt}/ws/${ws}/swt.jar"/>
-		</ant>
-	</target>
-
-	<target name="build.jars" depends="init,antui.jar,lib/antuilib.jar">
-	</target>
-
-	<target name="build.zips" depends="init">
-	</target>
-
-	<target name="gather.sources" depends="init" if="destination">
-		<mkdir dir="${destination}/plugins/${plugin}/lib"/>
-		<copy file="${basedir}/lib/antuilibsrc.zip" todir="${destination}/plugins/${plugin}/lib"/>
-		<mkdir dir="${destination}/plugins/${plugin}"/>
-		<copy file="${basedir}/antuisrc.zip" todir="${destination}/plugins/${plugin}"/>
-	</target>
-
-	<target name="lib/antuilibsrc.zip" depends="init">
-		<ant antfile="${template}" target="src">
-			<property name="srcdir" value="${basedir}"/>
-			<property name="mapping" value="src_ant/"/>
-			<property name="dest" value="${basedir}/lib/antuilibsrc.zip"/>
-			<property name="excludes" value=""/>
-			<property name="includes" value="src_ant/**/*.java"/>
-		</ant>
-	</target>
-
-	<target name="antuisrc.zip" depends="init">
-		<ant antfile="${template}" target="src">
-			<property name="srcdir" value="${basedir}"/>
-			<property name="mapping" value="src/"/>
-			<property name="dest" value="${basedir}/antuisrc.zip"/>
-			<property name="excludes" value=""/>
-			<property name="includes" value="src/**/*.java"/>
-		</ant>
-	</target>
-
-	<target name="build.sources" depends="init,lib/antuilibsrc.zip,antuisrc.zip">
-	</target>
-
-	<target name="gather.logs" depends="init">
-		<mkdir dir="${destination}/plugins/${plugin}/lib"/>
-		<copy file="${basedir}/lib/antuilib.jar.bin.log" todir="${destination}/plugins/${plugin}/lib"/>
-		<mkdir dir="${destination}/plugins/${plugin}"/>
-		<copy file="${basedir}/antui.jar.bin.log" todir="${destination}/plugins/${plugin}"/>
-	</target>
-
-	<target name="clean" depends="init">
-		<delete>
-			<fileset dir="${basedir}" includes="*.bin"/>
-			<fileset dir="${basedir}" includes="**/*.log"/>
-			<fileset dir="${basedir}" includes="lib/antuilib.jar,antui.jar"/>
-			<fileset dir="${basedir}" includes="lib/antuilibsrc.zip,antuisrc.zip"/>
-			<fileset dir="${basedir}" includes="**/*.pdetemp"/>
-		</delete>
-		<delete file="${plugin}_${version}.jar"/>
-		<delete file="${plugin}_${version}.src.zip"/>
-		<delete file="${plugin}_${version}.log.zip"/>
-	</target>
-
-	<target name="properties">
-		<property name="plugin" value="org.eclipse.ant.ui"/>
-		<property name="version" value="2.0.2"/>
-		<pluginLocation plugin="org.eclipse.swt" property="location.org.eclipse.swt"/>
-		<pluginLocation plugin="org.apache.ant" property="location.org.apache.ant"/>
-		<pluginLocation plugin="org.eclipse.ant.core" property="location.org.eclipse.ant.core"/>
-		<pluginLocation plugin="org.eclipse.ant.ui" property="location.org.eclipse.ant.ui"/>
-		<pluginLocation plugin="org.eclipse.ui" property="location.org.eclipse.ui"/>
-		<pluginLocation plugin="org.eclipse.help" property="location.org.eclipse.help"/>
-		<pluginLocation plugin="org.eclipse.core.boot" property="location.org.eclipse.core.boot"/>
-		<pluginLocation plugin="org.apache.lucene" property="location.org.apache.lucene"/>
-		<pluginLocation plugin="org.eclipse.core.runtime" property="location.org.eclipse.core.runtime"/>
-		<pluginLocation plugin="org.apache.xerces" property="location.org.apache.xerces"/>
-		<pluginLocation plugin="org.eclipse.core.resources" property="location.org.eclipse.core.resources"/>
-		<property name="bin.includes" value="icons/,plugin.xml,*.jar,plugin.properties,about.html,lib/"/>
-		<property name="bin.excludes" value="src/,src_ant/"/>
-	</target>
-
-</project>
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/plugin.properties b/ant/org.eclipse.ant.ui/plugin.properties
deleted file mode 100644
index 0137810..0000000
--- a/ant/org.eclipse.ant.ui/plugin.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-antActionSetLabel = Ant
-antBuilderPropertyName=Tool Script Builders
-antConsole = Ant Console
-antConsolePreferences = Console
-antClasspathPreferences = Customize
-antLauncher = Ant Targets
-antPreferences = Ant
-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
-providerName = Object Technology International, Inc.
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/plugin.xml b/ant/org.eclipse.ant.ui/plugin.xml
deleted file mode 100644
index fc5169d..0000000
--- a/ant/org.eclipse.ant.ui/plugin.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<plugin
-  name = "%pluginName"
-  id="org.eclipse.ant.ui"
-  version = "2.1.1"
-  provider-name = "%providerName"
-  class="org.eclipse.ant.internal.ui.AntUIPlugin">
-
-  <requires>
-    <import plugin="org.apache.ant"/>
-    <import plugin="org.eclipse.ant.core"/>
-    <import plugin="org.eclipse.core.resources"/>
-    <import plugin="org.eclipse.ui"/>
-  </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>
-  	<page 
-  		id="org.eclipse.ant.ui.AntClasspathPreferences" 
-  		name="%antClasspathPreferences"
-  		class="org.eclipse.ant.internal.ui.CustomizeAntPreferencePage"
-  		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>
-  
-
-   <!-- Objects -->
-   <extension point="org.eclipse.ant.core.antObjects">
-      <antObject
-         name="org.eclipse.ant.internal.ui.ant.UIBuildLogger"
-         class="org.eclipse.ant.internal.ui.ant.UIBuildLogger"
-         library="lib/antuilib.jar">
-      </antObject>
-   </extension>
-
-</plugin>
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AddTaskDialog.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AddTaskDialog.java
deleted file mode 100644
index 263697b..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AddTaskDialog.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- * IBM - Initial API and implementation
- ******************************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import java.net.URL;
-
-import org.eclipse.ant.core.AntCorePlugin;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
-
-/**
- * Dialog to prompt the user to add a custom ant task or type.
- */
-public class AddTaskDialog extends Dialog {
-	protected String title;
-	protected String description;
-	
-	//task/type attributes
-	protected String taskName;
-	protected String className;
-	protected URL library;
-	
-	//widgets
-	protected Button okButton;
-	protected Text nameField;
-	protected Text classField;
-	protected Combo libraryField;
-	
-	protected URL[] libraryUrls;
-	
-/**
- * Creates a new task dialog with the given shell and title.
- */
-protected AddTaskDialog(Shell parentShell, String title, String description) {
-	super(parentShell);
-	this.title = title;
-	this.description = description;
-}
-/**
- * @see Window#configureShell(Shell)
- */
-protected void configureShell(Shell newShell) {
-	super.configureShell(newShell);
-	newShell.setText(title);
-}
-/**
- * @see Dialog#createButtonsForButtonBar(Composite)
- */
-protected void createButtonsForButtonBar(Composite parent) {
-	okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-	createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-	updateEnablement();
-}
-/**
- * @see Dialog#createDialogArea(Composite)
- */
-protected Control createDialogArea(Composite parent) {
-	Composite dialogArea = new Composite(parent, SWT.NONE);
-	GridLayout layout = new GridLayout();
-	layout.numColumns = 2;
-	layout.marginHeight = 10;
-	layout.marginWidth = 10;
-	dialogArea.setLayout(layout);
-	
-	Label label = new Label(dialogArea, SWT.NONE);
-	label.setText(description);
-	GridData data = new GridData(GridData.FILL_HORIZONTAL);
-	data.horizontalSpan = 2;
-	label.setLayoutData(data);
-	
-	label = new Label(dialogArea, SWT.NONE);
-	label.setText(Policy.bind("preferences.customize.addTaskDialogName"));
-	nameField = new Text(dialogArea, SWT.BORDER);
-	data = new GridData(GridData.FILL_HORIZONTAL);
-	data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-	nameField.setLayoutData(data);
-	nameField.addModifyListener(new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			updateEnablement();
-		}
-	});
-
-	label = new Label(dialogArea, SWT.NONE);
-	label.setText(Policy.bind("preferences.customize.addTaskDialogClass"));
-	classField = new Text(dialogArea, SWT.BORDER);
-	data = new GridData(GridData.FILL_HORIZONTAL);
-	data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-	classField.setLayoutData(data);
-	classField.addModifyListener(new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			updateEnablement();
-		}
-	});
-	
-	label = new Label(dialogArea, SWT.NONE);
-	label.setText(Policy.bind("preferences.customize.addTaskDialogLibrary"));
-	libraryField = new Combo(dialogArea, SWT.READ_ONLY | SWT.BORDER);
-	data = new GridData(GridData.FILL_HORIZONTAL);
-	data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-	libraryField.setLayoutData(data);
-	libraryField.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			updateEnablement();
-		}
-	});
-	
-	//populate library combo and select input library
-	libraryUrls = AntCorePlugin.getPlugin().getPreferences().getCustomURLs();
-	int selection = 0;
-	for (int i = 0; i < libraryUrls.length; i++) {
-		libraryField.add(libraryUrls[i].getFile());
-		if (libraryUrls[i].equals(library))
-			selection = i;
-	}
-		
-	//intialize fields
-	if (taskName != null)
-		nameField.setText(taskName);
-	if (className != null)
-		classField.setText(className);
-	if (libraryUrls.length >= 0)
-		libraryField.select(selection);
-	return dialogArea;
-}
-
-public String getClassName() {
-	return className;
-}
-public void setClassName(String className) {
-	this.className = className;
-}
-public URL getLibrary() {
-	return library;
-}
-/**
- * @see Dialog#okPressed()
- */
-protected void okPressed() {
-	className = classField.getText();
-	taskName = nameField.getText();
-	int selection = libraryField.getSelectionIndex();
-	if (selection >= 0)
-		library = libraryUrls[selection];
-	super.okPressed();
-}
-public void setLibrary(URL library) {
-	this.library = library;
-}
-public String getTaskName() {
-	return taskName;
-}
-public void setTaskName(String taskName) {
-	this.taskName = taskName;
-}
-protected void updateEnablement() {
-	if (okButton != null)
-		okButton.setEnabled(nameField.getText().length() > 0 && 
-			classField.getText().length() > 0 &&
-			libraryField.getSelectionIndex() >= 0);
-}
-}
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 d5c1d01..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntAction.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import java.io.File;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.ProjectHelper;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-
-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);
-			}
-		}
-	}
-	
-	Project 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 Project extractProject(IFile sourceFile) {
-	// create a project and initialize it
-	Project antProject = new Project();
-	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 1a7e9da..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 a2f0e79..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntConsolePreferencePage.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import org.eclipse.jface.preference.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * 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 f38c142..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntLaunchDropDownAction.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
- 
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.*;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * 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 ec4cab7..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 b213baf..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 afe102d..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 50a6b26..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 dc7d8a0..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntTreeContentProvider.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * 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 0eb5335..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntTreeLabelProvider.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-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 c0ac03e..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/AntUIPlugin.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-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.RGB;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * The plug-in runtime class for the AntUI plug-in.
- */
-public final class AntUIPlugin extends AbstractUIPlugin {
-	/**
-	 * 
-	 */
-	protected IProgressMonitor currentProgressMonitor;
-	
-	protected final HashMap imageDescriptors = new HashMap(30);
-
-	/**
-	 * 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";
-	public static final String IMG_JAR_FILE = "icons/full/eview16/jar_l_obj.gif";
-	public static final String IMG_CLASSPATH = "icons/full/eview16/classpath.gif";
-	public static final String IMG_TYPE = "icons/full/eview16/type.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 IProgressMonitor getCurrentProgressMonitor() {
-	return currentProgressMonitor;
-}
-
-public void setCurrentProgressMonitor(IProgressMonitor monitor) {
-	this.currentProgressMonitor = monitor;
-}
-
-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) {
-	ImageDescriptor desc = (ImageDescriptor)imageDescriptors.get(path);
-	if (desc != null)
-		return desc;
-	try {
-		URL installURL = getDescriptor().getInstallURL();
-		URL url = new URL(installURL,path);
-		desc = ImageDescriptor.createFromURL(url);
-		imageDescriptors.put(path, desc);
-		return desc;
-	} 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
-	
-}
-}
\ No newline at end of file
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 a69c995..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/BuildCanceledException.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-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/ClasspathPage.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/ClasspathPage.java
deleted file mode 100644
index 2f9def0..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/ClasspathPage.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- * IBM - Initial API and implementation
- ******************************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.*;
-
-/**
- * A widget group for the jars tab of the ant classpath preference page.
- */
-public class ClasspathPage extends CustomizeAntPage {
-	//button constants
-	protected static final int ADD_JAR_BUTTON = IDialogConstants.CLIENT_ID + 1;
-	protected static final int ADD_FOLDER_BUTTON = IDialogConstants.CLIENT_ID + 2;
-	protected static final int REMOVE_BUTTON = IDialogConstants.CLIENT_ID + 3;
-	
-public ClasspathPage() {
-}
-/**
- * @see CustomizeAntPage#addButtonsToButtonGroup(Composite)
- */
-protected void addButtonsToButtonGroup(Composite parent) {
-	createButton(parent, "preferences.customize.addJarButtonTitle", ADD_JAR_BUTTON);
-	createButton(parent, "preferences.customize.addFolderButtonTitle", ADD_FOLDER_BUTTON);
-	createSeparator(parent);
-	createButton(parent, "preferences.customize.removeButtonTitle", REMOVE_BUTTON);
-}
-protected void addFolderButtonPressed() {
-	DirectoryDialog dialog = new DirectoryDialog(tableViewer.getControl().getShell());
-	String result = dialog.open();
-	if (result != null) {
-		try {
-			URL url = new URL("file:" + result + "/");
-			contentProvider.add(url);
-		} catch (MalformedURLException e) {
-		}
-	}
-}
-protected void addJarButtonPressed() {
-	FileDialog dialog = new FileDialog(tableViewer.getControl().getShell());
-	dialog.setFilterExtensions(new String[] {"*.jar"});
-	String result = dialog.open();
-	if (result != null) {
-		try {
-			URL url = new URL("file:" + result);
-			contentProvider.add(url);
-		} catch (MalformedURLException e) {
-		}
-	}
-}
-/**
- * @see CustomizeAntPage#buttonPressed(int)
- */
-protected void buttonPressed(int buttonId) {
-	switch (buttonId) {
-		case ADD_JAR_BUTTON:
-			addJarButtonPressed();
-			break;
-		case ADD_FOLDER_BUTTON:
-			addFolderButtonPressed();
-			break;
-		case REMOVE_BUTTON:
-			removeButtonPressed();
-			break;
-	}
-}
-/**
- * Creates and returns a tab item that contains this widget group.
- */
-public TabItem createTabItem(TabFolder folder) {
-	TabItem item = new TabItem(folder, SWT.NONE);
-	item.setText(Policy.bind("preferences.customize.classpathPageTitle"));
-	final Image image = AntUIPlugin.getPlugin().getImageDescriptor(AntUIPlugin.IMG_CLASSPATH).createImage();
-	item.setImage(image);
-	item.setData(this);
-	item.setControl(createControl(folder));
-	item.addDisposeListener(new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			if (image != null)
-				image.dispose();
-		}
-	});
-
-	return item;
-}
-
-	
-
-
-
-
-
-
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntContentProvider.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntContentProvider.java
deleted file mode 100644
index 566c4bf..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntContentProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- * IBM - Initial API and implementation
- ******************************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.*;
-
-/**
- * Maintains a generic list of objects that are shown in a table viewer.
- */
-public class CustomizeAntContentProvider implements IStructuredContentProvider {
-	protected final ArrayList elements = new ArrayList();
-	protected TableViewer viewer;
-	
-void add(Object o) {
-	elements.add(o);
-	viewer.add(o);
-}
-public void dispose() {
-}
-public Object[] getElements(Object inputElement) {
-	return (Object[]) elements.toArray(new Object[elements.size()]);
-}
-public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	this.viewer = (TableViewer)viewer;
-	elements.clear();
-	if (newInput != null)
-		elements.addAll((List)newInput);
-}
-void remove(Object o) {
-	elements.remove(o);
-	viewer.remove(o);
-}
-}
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntLabelProvider.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntLabelProvider.java
deleted file mode 100644
index 646d447..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntLabelProvider.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- * IBM - Initial API and implementation
- ******************************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import java.net.URL;
-
-import org.eclipse.ant.internal.core.Task;
-import org.eclipse.ant.internal.core.Type;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Label provider for the items in the custmomize ant preference page: 
- * URLs, Tasks, and Types.
- */
-public class CustomizeAntLabelProvider extends LabelProvider implements ITableLabelProvider {
-	protected Image folderImage;
-	protected Image jarImage;
-	protected Image taskImage;
-	protected Image typeImage;
-	
-public CustomizeAntLabelProvider() {
-}
-public void dispose() {
-	//note: folder and task are shared images
-	folderImage = null;
-	taskImage = null;
-	if (jarImage != null) {
-		jarImage.dispose();
-		jarImage = null;
-	}
-	if (typeImage != null) {
-		typeImage.dispose();
-		typeImage = null;
-	}
-}
-public Image getColumnImage(Object element, int columnIndex) {
-	if (element instanceof URL) {
-		URL url = (URL)element;
-		if (url.getFile().endsWith("/")) {
-			return folderImage();
-		} else {
-			return jarImage();
-		}
-	}
-	if (element instanceof Task) {
-		return taskImage();
-	}
-	if (element instanceof Type) {
-		return typeImage();
-	}
-	return null;
-}
-public String getColumnText(Object element, int columnIndex) {
-	if (element instanceof URL) {
-		return ((URL)element).getFile();
-	}
-	if (element instanceof Task) {
-		Task task = (Task)element;
-		return task.getTaskName() + " (" + task.getLibrary().getFile()+ ": " + task.getClassName() + ")";
-	}
-	if (element instanceof Type) {
-		Type type = (Type)element;
-		return type.getTypeName() + " (" + type.getLibrary().getFile()+ ": " + type.getClassName() + ")";
-	}
-	return element.toString();
-}
-protected Image folderImage() {
-	if (folderImage != null)
-		return folderImage;
-	folderImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
-	return folderImage;
-}
-protected Image jarImage() {
-	if (jarImage != null)
-		return jarImage;
-	jarImage = AntUIPlugin.getPlugin().getImageDescriptor(AntUIPlugin.IMG_JAR_FILE).createImage();
-	return jarImage;
-}
-protected Image taskImage() {
-	if (taskImage != null)
-		return taskImage;
-	taskImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_TASK_TSK);
-	return taskImage;
-}
-protected Image typeImage() {
-	if (typeImage != null)
-		return typeImage;
-	typeImage = AntUIPlugin.getPlugin().getImageDescriptor(AntUIPlugin.IMG_TYPE).createImage();
-	return typeImage;
-}
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntPage.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntPage.java
deleted file mode 100644
index dd35dbf..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntPage.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- * IBM - Initial API and implementation
- ******************************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
-
-
-
-/**
- * Abstract superclass for all tabs that contribute to the ant classpath
- * preference page.
- */
-public abstract class CustomizeAntPage extends Object {
-	SelectionAdapter selectionAdapter = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			buttonPressed(((Integer) e.widget.getData()).intValue());
-		}
-	};
-	protected FontMetrics fontMetrics;
-	protected TableViewer tableViewer;
-	protected CustomizeAntContentProvider contentProvider;
-
-/**
- * This is where subclasses should add the buttons that are interesting for their page.
- */
-protected abstract void addButtonsToButtonGroup(Composite parent);
-/**
- * Should be overwritten by subclasses to handle button behaviour.
- */
-protected void buttonPressed(int buttonId) {
-}
-
-/**
- * Creates and returns a button with appropriate size and layout.
- * @param parent
- * @param labelKey The button text key, used to fetch the appropriate
- * message from the externalized catalog.
- */
-protected Button createButton(Composite parent, String labelKey, int buttonId) {
-	Button button = new Button(parent, SWT.PUSH);
-	button.setText(Policy.bind(labelKey));
-	GridData data = new GridData(GridData.FILL_HORIZONTAL);
-	int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_WIDTH);
-	data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
-	data.heightHint = Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_HEIGHT);
-	button.setLayoutData(data);
-	button.setData(new Integer(buttonId));
-	button.addSelectionListener(selectionAdapter);
-	return button;
-}
-protected void createButtonGroup(Composite top) {
-	Composite buttonGroup = new Composite(top, SWT.NONE);
-	GridLayout layout = new GridLayout();
-	layout.marginHeight = 0;
-	layout.marginWidth = 0;
-	buttonGroup.setLayout(layout);
-	buttonGroup.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-	
-	addButtonsToButtonGroup(buttonGroup);
-}
-
-protected Label createSeparator(Composite parent) {
-	Label separator= new Label(parent, SWT.NONE);
-	separator.setVisible(false);
-	GridData gd= new GridData();
-	gd.horizontalAlignment= gd.FILL;
-	gd.verticalAlignment= gd.BEGINNING;
-	gd.heightHint= 4;
-	separator.setLayoutData(gd);
-	return separator;
-}
-protected void createTable(Composite parent) {
-	Table table = new Table(parent, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
-	table.setLayoutData(new GridData(GridData.FILL_BOTH));
-	tableViewer = new TableViewer(table);
-	contentProvider = new CustomizeAntContentProvider();
-	tableViewer.setContentProvider(contentProvider);
-	tableViewer.setLabelProvider(new CustomizeAntLabelProvider());
-	tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-		public void selectionChanged(SelectionChangedEvent event) {
-			tableSelectionChanged((IStructuredSelection)event.getSelection());
-		}
-	});
-}
-
-/**
- * Returns the currently listed objects in the table.  Returns null
- * if this widget has not yet been created or has been disposed.
- */
-public List getContents() {
-	if (tableViewer == null || tableViewer.getControl().isDisposed())
-		return null;
-	Object[] elements = contentProvider.getElements(tableViewer.getInput());
-	return Arrays.asList(elements);
-}
-protected void removeButtonPressed() {
-	IStructuredSelection selection = (IStructuredSelection)tableViewer.getSelection();
-	Object[] selected = selection.toArray();
-	for (int i = 0; i < selected.length; i++) {
-		contentProvider.remove(selected[i]);
-	}
-}
-/**
- * Sets the contents of the table on this page.  Has no effect
- * if this widget has not yet been created or has been disposed.
- */
-public void setInput(List inputs) {
-	if (tableViewer == null || tableViewer.getControl().isDisposed())
-		return;
-	tableViewer.setInput(inputs);
-	tableSelectionChanged((IStructuredSelection)tableViewer.getSelection());
-}
-/**
- * Subclasses may override to add behaviour when table selection changes.
- */
-protected void tableSelectionChanged(IStructuredSelection newSelection) {
-}
-
-/**
- * Creates and returns a control that contains this widget group.
- */
-public Control createControl(Composite parent) {
-	Composite top = new Composite(parent, SWT.NONE);
-	GridLayout layout = new GridLayout();
-	layout.numColumns = 2;
-	layout.marginHeight = 2;
-	layout.marginWidth = 2;
-	top.setLayout(layout);
-	
-	//get font metrics for DLU -> pixel conversions
-	GC gc = new GC(top);
-	gc.setFont(top.getFont());
-	fontMetrics = gc.getFontMetrics();
-	gc.dispose();
-	
-	createTable(top);
-	createButtonGroup(top);
-	return top;
-}
-
-}
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntPreferencePage.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntPreferencePage.java
deleted file mode 100644
index a5c71e0..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/CustomizeAntPreferencePage.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- * IBM - Initial API and implementation
- ******************************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import java.net.URL;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.ant.core.AntCorePlugin;
-import org.eclipse.ant.internal.core.*;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-/**
- * A page to set the preferences for the classpath
- */
-public class CustomizeAntPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-		
-	protected ClasspathPage jarsPage;
-	protected TasksPage tasksPage;
-	protected TypesPage typesPage;
-/**
- * Create the console page.
- */
-public CustomizeAntPreferencePage() {
-	setDescription(Policy.bind("preferences.customize.description"));
-	IPreferenceStore store = AntUIPlugin.getPlugin().getPreferenceStore();
-	setPreferenceStore(store);
-}
-/**
- * @see IWorkbenchPreferencePage#init
- */
-public void init(IWorkbench workbench) {
-}
-protected Control createContents(Composite parent) {
-	TabFolder folder= new TabFolder(parent, SWT.NONE);
-	folder.setLayout(new GridLayout());	
-	folder.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-	jarsPage = new ClasspathPage();
-	jarsPage.createTabItem(folder);
-	tasksPage = new TasksPage();
-	tasksPage.createTabItem(folder);
-	typesPage = new TypesPage();
-	typesPage.createTabItem(folder);
-	
-	//set the page inputs
-	AntCorePreferences prefs = AntCorePlugin.getPlugin().getPreferences();
-	jarsPage.setInput(Arrays.asList(prefs.getCustomURLs()));
-	tasksPage.setInput(Arrays.asList(prefs.getCustomTasks()));
-	typesPage.setInput(Arrays.asList(prefs.getCustomTypes()));
-
-	return folder;
-}
-/**
- * @see PreferencePage#performDefaults()
- */
-protected void performDefaults() {
-	super.performDefaults();
-	AntCorePreferences prefs = AntCorePlugin.getPlugin().getPreferences();
-	jarsPage.setInput(Arrays.asList(prefs.getDefaultCustomURLs()));
-	tasksPage.setInput(Arrays.asList(prefs.getCustomTasks()));
-	typesPage.setInput(Arrays.asList(prefs.getCustomTypes()));
-}
-/**
- * @see IPreferencePage#performOk()
- */
-public boolean performOk() {
-	List contents = jarsPage.getContents();
-	if (contents != null) {
-		URL[] urls = (URL[]) contents.toArray(new URL[contents.size()]);
-		AntCorePlugin.getPlugin().getPreferences().setCustomURLs(urls);
-	}
-	contents = tasksPage.getContents();
-	if (contents != null) {
-		Task[] tasks= (Task[]) contents.toArray(new Task[contents.size()]);
-		AntCorePlugin.getPlugin().getPreferences().setCustomTasks(tasks);
-	}
-	contents = typesPage.getContents();
-	if (contents != null) {
-		Type[] types= (Type[]) contents.toArray(new Type[contents.size()]);
-		AntCorePlugin.getPlugin().getPreferences().setCustomTypes(types);
-	}
-	return super.performOk();
-}
-}
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 1bf9ec7..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/IAntPreferenceConstants.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-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 5865470..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/OutputStructureElement.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-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 b4578f7..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/Policy.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2000,2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import java.text.MessageFormat;
-import java.util.*;
-
-import org.eclipse.core.runtime.*;
-
-public class Policy {
-	private static ResourceBundle bundle = ResourceBundle.getBundle(AntUIPlugin.PROPERTIES_MESSAGES, Locale.getDefault());
-
-/**
- * Lookup the message with the given ID in this catalog 
- */
-public static String bind(String id) {
-	return bind(id, (String[])null);
-}
-/**
- * Lookup the message with the given ID in this catalog and bind its
- * substitution locations with the given string.
- */
-public static String bind(String id, String binding) {
-	return bind(id, new String[] {binding});
-}
-/**
- * Lookup the message with the given ID in this catalog and bind its
- * substitution locations with the given strings.
- */
-public static String bind(String id, String binding1, String binding2) {
-	return bind(id, new String[] {binding1, binding2});
-}
-
-/**
- * Lookup the message with the given ID in this catalog and bind its
- * substitution locations with the given string values.
- */
-public static String bind(String id, String[] bindings) {
-	if (id == null)
-		return "No message available";//$NON-NLS-1$
-	String message = null;
-	try {
-		message = 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;//$NON-NLS-1$
-	}
-	if (bindings == null)
-		return message;
-	return MessageFormat.format(message, bindings);
-}
-public static IProgressMonitor monitorFor(IProgressMonitor monitor) {
-	if (monitor == null)
-		return new NullProgressMonitor();
-	return monitor;
-}
-public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks) {
-	if (monitor == null)
-		return new NullProgressMonitor();
-	if (monitor instanceof NullProgressMonitor)
-		return monitor;
-	return new SubProgressMonitor(monitor, ticks);
-}
-public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks, int style) {
-	if (monitor == null)
-		return new NullProgressMonitor();
-	if (monitor instanceof NullProgressMonitor)
-		return monitor;
-	return new SubProgressMonitor(monitor, ticks, style);
-}
-}
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 fcb40e1..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/RunAntActionDelegate.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-
-public class RunAntActionDelegate implements IWorkbenchWindowActionDelegate {
-
-	private IFile selection;
-
-/*
- * @see IWorkbenchWindowActionDelegate
- */
-public void dispose() {
-}
-
-/*
- * @see IWorkbenchWindowActionDelegate
- */
-public void init(IWorkbenchWindow window) {
-}
-/*
- * @see IActionDelegate
- */
-public void run(IAction action) {
-	
-	new AntAction(selection).run();
-}
-/*
- * @see IWorkbenchActionDelegate
- */
-public void selectionChanged(IAction action, ISelection selection) {
-	this.selection = null;
-	if (selection instanceof IStructuredSelection) {
-		IStructuredSelection structuredSelection = (IStructuredSelection)selection;
-		if (structuredSelection.size() == 1) {
-			Object selectedResource = structuredSelection.getFirstElement();
-			if (selectedResource instanceof IFile)
-				this.selection = (IFile)selectedResource;
-		}
-	}
-}
-
-/**
- * Sets the file for the wizard.
- * 
- * @param the file to parse
- */
-public void setFile(IFile file) {
-	selection = file;
-}
-
-}
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 c769148..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TargetsListContentProvider.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import org.apache.tools.ant.Project;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Content provider for the Ant dialog: it provides the ListViewer with the targets defined in the xml file.
- */
-
-public class TargetsListContentProvider implements IStructuredContentProvider {
-	
-	private static TargetsListContentProvider instance;
-	
-	static {
-		instance = new TargetsListContentProvider();
-	}
-	
-// private to ensure that it remains a singleton
-private TargetsListContentProvider() {
-	super();
-}
-
-public static TargetsListContentProvider getInstance() {
-	return instance;
-}
-
-/**
- * Returns the targets found in the xml file after parsing.
- * 
- * @param groupName the name of the group
- * @return the array of the targets found
- */
-public Object[] getElements(Object inputElement) {
-	Project project = (Project)inputElement;
-	return project.getTargets().values().toArray();
-}
-
-public void dispose() {
-}
-
-public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-}
-
-}
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 da5c64b..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/TasksPage.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TasksPage.java
deleted file mode 100644
index 04286b4..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TasksPage.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- * IBM - Initial API and implementation
- ******************************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import org.eclipse.ant.internal.core.Task;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A widget group for the tasks tab of the ant classpath preference page.
- */
-public class TasksPage extends CustomizeAntPage {
-	protected Button editButton;
-	protected Button removeButton;
-
-	//button constants
-	protected static final int ADD_TASK_BUTTON= IDialogConstants.CLIENT_ID + 1;
-	protected static final int EDIT_TASK_BUTTON = IDialogConstants.CLIENT_ID + 2;
-	protected static final int REMOVE_BUTTON = IDialogConstants.CLIENT_ID + 3;
-
-public TasksPage() {
-}
-protected void addButtonsToButtonGroup(Composite parent) {
-	createButton(parent, "preferences.customize.addTaskButtonTitle", ADD_TASK_BUTTON);
-	editButton = createButton(parent, "preferences.customize.editTaskButtonTitle", EDIT_TASK_BUTTON);
-	createSeparator(parent);
-	removeButton = createButton(parent, "preferences.customize.removeButtonTitle", REMOVE_BUTTON);
-}
-protected void addTaskButtonPressed() {
-	String title = Policy.bind("preferences.customize.addTaskDialogTitle");
-	String msg = Policy.bind("preferences.customize.addTaskDialogDescription");
-	AddTaskDialog dialog = new AddTaskDialog(tableViewer.getControl().getShell(), title, msg);
-	if (dialog.open() == Dialog.CANCEL)
-		return;
-		
-	Task task = new Task();
-	task.setTaskName(dialog.getTaskName());
-	task.setClassName(dialog.getClassName());
-	task.setLibrary(dialog.getLibrary());
-	contentProvider.add(task);	
-}
-protected void buttonPressed(int buttonId) {
-	switch (buttonId) {
-		case ADD_TASK_BUTTON:
-			addTaskButtonPressed();
-			break;
-		case EDIT_TASK_BUTTON:
-			editTaskButtonPressed();
-			break;
-		case REMOVE_BUTTON:
-			removeButtonPressed();
-			break;
-	}
-}
-/**
- * Creates and returns a tab item that contains this widget group.
- */
-public TabItem createTabItem(TabFolder folder) {
-	TabItem item = new TabItem(folder, SWT.NONE);
-	item.setText(Policy.bind("preferences.customize.tasksPageTitle"));
-	item.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_TASK_TSK));
-	item.setData(this);
-	item.setControl(createControl(folder));
-	return item;
-}
-protected void editTaskButtonPressed() {
-	String title = Policy.bind("preferences.customize.editTaskDialogTitle");
-	String msg = Policy.bind("preferences.customize.editTaskDialogDescription");
-	AddTaskDialog dialog = new AddTaskDialog(tableViewer.getControl().getShell(), title, msg);
-	IStructuredSelection selection = (IStructuredSelection)tableViewer.getSelection();
-	if (selection.isEmpty())
-		return;
-	Task task = (Task)selection.getFirstElement();
-	dialog.setClassName(task.getClassName());
-	dialog.setTaskName(task.getTaskName());
-	dialog.setLibrary(task.getLibrary());
-	if (dialog.open() == Dialog.CANCEL)
-		return;
-		
-	task.setTaskName(dialog.getTaskName());
-	task.setClassName(dialog.getClassName());
-	task.setLibrary(dialog.getLibrary());
-	tableViewer.update(task, null);
-}
-/**
- * @see CustomizeAntPage#tableSelectionChanged(ISelection)
- */
-protected void tableSelectionChanged(IStructuredSelection newSelection) {
-	int size = newSelection.size();
-	editButton.setEnabled(size == 1);
-	removeButton.setEnabled(size > 0);
-}
-
-}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TypesPage.java b/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TypesPage.java
deleted file mode 100644
index a04d5be..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/TypesPage.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- * IBM - Initial API and implementation
- ******************************************************************************/
-package org.eclipse.ant.internal.ui;
-
-import org.eclipse.ant.internal.core.Type;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.*;
-
-/**
- * A widget group for the types tab of the ant classpath preference page.
- */
-public class TypesPage extends CustomizeAntPage {
-	protected Button editButton;
-	protected Button removeButton;
-
-	//button constants
-	protected static final int ADD_TYPE_BUTTON= IDialogConstants.CLIENT_ID + 1;
-	protected static final int EDIT_TYPE_BUTTON = IDialogConstants.CLIENT_ID + 2;
-	protected static final int REMOVE_BUTTON = IDialogConstants.CLIENT_ID + 3;
-
-public TypesPage() {
-}
-protected void addButtonsToButtonGroup(Composite parent) {
-	createButton(parent, "preferences.customize.addTypeButtonTitle", ADD_TYPE_BUTTON);
-	editButton = createButton(parent, "preferences.customize.editTypeButtonTitle", EDIT_TYPE_BUTTON);
-	createSeparator(parent);
-	removeButton = createButton(parent, "preferences.customize.removeButtonTitle", REMOVE_BUTTON);
-}
-protected void addTypeButtonPressed() {
-	String title = Policy.bind("preferences.customize.addTypeDialogTitle");
-	String msg = Policy.bind("preferences.customize.addTypeDialogDescription");
-	AddTaskDialog dialog = new AddTaskDialog(tableViewer.getControl().getShell(), title, msg);
-	if (dialog.open() == Dialog.CANCEL)
-		return;
-		
-	Type type = new Type();
-	type.setTypeName(dialog.getTaskName());
-	type.setClassName(dialog.getClassName());
-	type.setLibrary(dialog.getLibrary());
-	contentProvider.add(type);	
-}
-protected void buttonPressed(int buttonId) {
-	switch (buttonId) {
-		case ADD_TYPE_BUTTON:
-			addTypeButtonPressed();
-			break;
-		case EDIT_TYPE_BUTTON:
-			editTypeButtonPressed();
-			break;
-		case REMOVE_BUTTON:
-			removeButtonPressed();
-			break;
-	}
-}
-public TabItem createTabItem(TabFolder folder) {
-	TabItem item = new TabItem(folder, SWT.NONE);
-	item.setText(Policy.bind("preferences.customize.typesPageTitle"));
-	final Image image = AntUIPlugin.getPlugin().getImageDescriptor(AntUIPlugin.IMG_TYPE).createImage();
-	item.setImage(image);
-	item.setData(this);
-	item.setControl(createControl(folder));
-	item.addDisposeListener(new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			if (image != null)
-				image.dispose();
-		}
-	});
-	return item;
-}
-protected void editTypeButtonPressed() {
-	String title = Policy.bind("preferences.customize.editTypeDialogTitle");
-	String msg = Policy.bind("preferences.customize.editTypeDialogDescription");
-	AddTaskDialog dialog = new AddTaskDialog(tableViewer.getControl().getShell(), title, msg);
-	IStructuredSelection selection = (IStructuredSelection)tableViewer.getSelection();
-	if (selection.isEmpty())
-		return;
-	Type type= (Type)selection.getFirstElement();
-	dialog.setClassName(type.getClassName());
-	dialog.setTaskName(type.getTypeName());
-	dialog.setLibrary(type.getLibrary());
-	if (dialog.open() == Dialog.CANCEL)
-		return;
-		
-	type.setTypeName(dialog.getTaskName());
-	type.setClassName(dialog.getClassName());
-	type.setLibrary(dialog.getLibrary());
-	tableViewer.update(type, null);
-}
-/**
- * @see CustomizeAntPage#tableSelectionChanged(ISelection)
- */
-protected void tableSelectionChanged(IStructuredSelection newSelection) {
-	int size = newSelection.size();
-	editButton.setEnabled(size == 1);
-	removeButton.setEnabled(size > 0);
-}
-}
\ No newline at end of file
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 73921b7..0000000
--- a/ant/org.eclipse.ant.ui/src/org/eclipse/ant/internal/ui/messages.properties
+++ /dev/null
@@ -1,114 +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:
-
-preferences.customize.description = Customize the classpath, tasks and types used when running Ant scripts from Eclipse.
-preferences.customize.classpathPageTitle = Classpath
-preferences.customize.tasksPageTitle = Tasks
-preferences.customize.typesPageTitle = Types
-preferences.customize.addFolderButtonTitle = Add &Folder...
-preferences.customize.addJarButtonTitle = Add &Jar...
-preferences.customize.defaultButtonTitle = Restore &Defaults
-preferences.customize.removeButtonTitle = &Remove
-preferences.customize.addTypeButtonTitle = &Add Type
-preferences.customize.editTypeButtonTitle = &Edit Type
-preferences.customize.addTaskButtonTitle = &Add Task
-preferences.customize.editTaskButtonTitle = &Edit Task
-preferences.customize.addTaskDialogName = &Name
-preferences.customize.addTaskDialogClass = &Class
-preferences.customize.addTaskDialogLibrary = &Library
-preferences.customize.addTaskDialogDescription = Enter a name, java class, and library for your custom task.
-preferences.customize.addTaskDialogTitle = Add Task
-preferences.customize.editTaskDialogDescription = Modify the name, java class, and library of your custom task
-preferences.customize.editTaskDialogTitle = Edit Task
-preferences.customize.addTypeDialogDescription = Enter a name, java class, and library for your custom type.
-preferences.customize.addTypeDialogTitle = Add Type
-preferences.customize.editTypeDialogDescription = Modify the name, java class, and library of your custom type
-preferences.customize.editTypeDialogTitle = Edit Type
-
-### 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/ant/org.eclipse.ant.ui/src_ant/org/eclipse/ant/internal/ui/ant/UIBuildLogger.java b/ant/org.eclipse.ant.ui/src_ant/org/eclipse/ant/internal/ui/ant/UIBuildLogger.java
deleted file mode 100644
index 99e718a..0000000
--- a/ant/org.eclipse.ant.ui/src_ant/org/eclipse/ant/internal/ui/ant/UIBuildLogger.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ant.internal.ui.ant;
-
-import java.io.PrintStream;
-import java.util.Iterator;
-import java.util.Vector;
-
-import org.apache.tools.ant.*;
-import org.eclipse.ant.internal.ui.*;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.widgets.Display;
-
-public class UIBuildLogger implements BuildLogger {
-
-	protected int priorityFilter = Project.MSG_INFO;
-	protected IProgressMonitor monitor;
-	private int logLength = 0;
-	private int lastTargetEndIndex = 0;
-
-public UIBuildLogger() {
-	AntUIPlugin plugin = AntUIPlugin.getPlugin();
-	this.monitor = Policy.monitorFor(plugin.getCurrentProgressMonitor());
-}
-
-/**
- * @see BuildListener#buildStarted(BuildEvent)
- */
-public void buildStarted(BuildEvent event) {
-	checkCanceled();
-}
-
-/**
- * @see BuildListener#buildFinished(BuildEvent)
- */
-public void buildFinished(BuildEvent event) {
-	checkCanceled();
-	monitor.done();
-	handleException(event);
-}
-
-protected void handleException(BuildEvent event) {
-	Throwable exception = event.getException();
-	if (exception == null)
-		return;
-	logMessage(Policy.bind("exception.buildException", exception.toString()), Project.MSG_ERR);
-}
-
-/**
- * @see BuildListener#targetStarted(BuildEvent)
- */
-public void targetStarted(BuildEvent event) {
-	checkCanceled();
-	createNewOutputStructureElement(event.getTarget().getName(), logLength);	
-}
-
-protected void refreshConsoleTrees() {
-	final Vector consoles = AntConsole.getInstances();
-	if (consoles.size() == 0)
-		return;
-	// we get the display from the console #0 (that exists for sure because consoles!=null)
-	Display display = ((AntConsole) consoles.get(0)).getSite().getShell().getDisplay();
-	// create a new thread for synchronizing all the refresh operations
-	display.syncExec(new Runnable() {
-		public void run() {
-			for (Iterator iterator = consoles.iterator(); iterator.hasNext();) {
-				AntConsole console = (AntConsole) iterator.next();
-				console.refreshTree();
-			}
-		}
-	});
-}
-
-protected void createNewOutputStructureElement(String name, int index) {
-	for (Iterator iterator = AntConsole.getInstances().iterator(); iterator.hasNext();) {
-		AntConsole console = (AntConsole) iterator.next();
-		OutputStructureElement newElement = new OutputStructureElement(name, console.getCurrentOutputStructureElement(), index);
-		console.setCurrentOutputStructureElement(newElement);
-	}
-}
-
-/**
- * @see BuildListener#targetFinished(BuildEvent)
- */
-public void targetFinished(BuildEvent event) {
-	checkCanceled();
-	monitor.worked(1);
-	handleException(event);
-	finishCurrentOutputStructureElement();
-	// store the end index of this target's log (so that we can use it later)
-	lastTargetEndIndex = logLength;
-	refreshConsoleTrees();
-}
-
-/**
- * @see BuildListener#taskStarted(BuildEvent)
- */
-public void taskStarted(BuildEvent event) {
-	checkCanceled();
-	createNewOutputStructureElement(event.getTask().getTaskName());
-}
-
-/**
- * @see BuildListener#taskFinished(BuildEvent)
- */
-public void taskFinished(BuildEvent event) {
-	checkCanceled();
-	handleException(event);
-	finishCurrentOutputStructureElement();
-	refreshConsoleTrees();
-}
-
-/**
- * @see BuildListener#messageLogged(BuildEvent)
- */
-public void messageLogged(BuildEvent event) {
-	checkCanceled();
-	logMessage(event.getMessage(), event.getPriority());
-}
-
-protected void logMessage(String message, int priority) {
-	if (priority > priorityFilter)
-		return;
-	message += '\n';
-	for (Iterator iterator = AntConsole.getInstances().iterator(); iterator.hasNext();) {
-		AntConsole console = (AntConsole) iterator.next();
-		console.append(message, priority);
-	}
-	logLength += message.length();
-}
-
-protected void finishCurrentOutputStructureElement() {
-	for (Iterator iterator = AntConsole.getInstances().iterator(); iterator.hasNext();) {
-		AntConsole console = (AntConsole) iterator.next();
-	    // sets the index that indicates the end of the log part linked to this element
-	    OutputStructureElement output = console.getCurrentOutputStructureElement();
-		output.setEndIndex(logLength);
-		// and sets the current element to the parent of the element
-		console.setCurrentOutputStructureElement(output.getParent());
-	}
-}
-
-protected void checkCanceled() {
-	if (monitor == null)
-		return;
-	if (monitor.isCanceled())
-		throw new BuildCanceledException();
-}
-
-protected void createNewOutputStructureElement(String name) {
-	createNewOutputStructureElement(name, logLength);
-}
-
-public void setMessageOutputLevel(int level) {
-	this.priorityFilter = level;
-}
-
-public void setEmacsMode(boolean emacsMode) {
-}
-
-public void setErrorPrintStream(PrintStream err) {
-}
-
-public void setOutputPrintStream(PrintStream output) {
-}
-}
\ No newline at end of file
diff --git a/platform/org.eclipse.sdk/.cvsignore b/platform/org.eclipse.sdk/.cvsignore
deleted file mode 100644
index 3a4edf6..0000000
--- a/platform/org.eclipse.sdk/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-.project
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 ca35fca..0000000
--- a/platform/org.eclipse.sdk/welcome.xml
+++ /dev/null
@@ -1,50 +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. 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.
-
-To open the Java perspective choose Window > Open Perspective > 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 Window > Show View. 
-To reset the perspective to its original state, choose <action pluginId="org.eclipse.ui"  class="org.eclipse.ui.internal.ResetPerspectiveAction">Window > Reset Perspective</action>. 
-
-Once you have arranged your perspective, you can save it using Window > Save Perspective As.... 
-You can customize the views, perspectives and New menu operations that show up for 
-your perspective. To do this choose <action pluginId="org.eclipse.ui"  class="org.eclipse.ui.internal.EditActionSetsAction">Window > Customize Perspective...</action> .  A view can
-additionally be converted into a Fast View by dragging it to the shortcut bar (at the 
-far left of the window). </item> 
-
-<item><b>Join a CVS team</b>
-To join a CVS development team, open the <action pluginId="org.eclipse.team.cvs.ui" class="org.eclipse.team.internal.ccvs.ui.actions.ShowCVSPerspectiveAction">CVS Perspective</action>. Next, specify the location of
-your CVS repository. To do this choose <action pluginId="org.eclipse.team.cvs.ui" class="org.eclipse.team.internal.ccvs.ui.actions.NewCVSRepositoryAction">New > 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. </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.core/src/org/eclipse/update/core/Site.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/Site.java
index 037c0aa..ba6ded3 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/core/Site.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/Site.java
@@ -29,7 +29,7 @@
 	 * 
 	 * @since 2.0
 	 */
-	public static final String DEFAULT_INSTALLED_FEATURE_PATH = "install/features/";
+	public static final String DEFAULT_INSTALLED_FEATURE_PATH = "features/";
 	//$NON-NLS-1$
 
 	/**
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/Version.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/Version.java
deleted file mode 100644
index 67b486a..0000000
--- a/update/org.eclipse.update.core/src/org/eclipse/update/core/Version.java
+++ /dev/null
@@ -1,282 +0,0 @@
-package org.eclipse.update.core;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-/**
- * Version identifier. In its string representation, 
- * it consists of up to 4 tokens separated by decimal point.
- * The first 3 tokens are positive integer numbers, the last token
- * is an uninterpreted string.
- * For example, the following are valid version identifiers 
- * (as strings):
- * <ul>
- *   <li><code>0.0.0</code></li>
- *   <li><code>1.0.127564</code></li>
- *   <li><code>3.7.2.build-127J</code></li>
- *   <li><code>1.9</code> (interpreted as <code>1.9.0</code>)</li>
- *   <li><code>3</code> (interpreted as <code>3.0.0</code>)</li>
- * </ul>
- * </p>
- * <p>
- * The version identifier can be decomposed into a major, minor, 
- * service and qualifier components. A difference in the major 
- * component is interpreted as an incompatible version change. 
- * A difference in the minor (and not the major) component is 
- * interpreted as a compatible version change. The service
- * level component is interpreted as a cumulative 
- * and compatible service update of the minor version component.
- * The qualifier is not interpreted, other than in version
- * comparisons. The qualifiers are compared using lexicographical
- * string comparison.
- * @see java.lang.String#compareTo 
- * </p>
- * <p>
- * Clients may instantiate; not intended to be subclassed by clients.
- */
-public final class Version {
-
-	private int major = 0;
-	private int minor = 0;
-	private int service = 0;
-	private String qualifier = null;
-
-	private static final String SEPARATOR = "."; //$NON-NLS-1$
-
-	private Version() {
-	}
-
-	/**
-	 * Creates a version identifier from its components.
-	 * 
-	 * @param major major component of the version identifier
-	 * @param minor minor component of the version identifier
-	 * @param service service update component of the version identifier
-	 * @since 2.0 
-	 */
-	public Version(int major, int minor, int service) {
-		this(major, minor, service, null);
-	}
-
-	/**
-	 * Creates a version identifier from its components.
-	 * 
-	 * @param major major component of the version identifier
-	 * @param minor minor component of the version identifier
-	 * @param service service update component of the version identifier
-	 * @param qualifier component of the version identifier. Qualifier
-	 * characters that are not a letter or a digit are replaced.
-	 * @since 2.0 
-	 */
-	public Version(int major, int minor, int service, String qualifier) {
-
-		if (major < 0)
-			major = 0;
-		if (minor < 0)
-			minor = 0;
-		if (service < 0)
-			service = 0;
-		if (qualifier == null)
-			qualifier = ""; //$NON-NLS-1$
-
-		this.major = major;
-		this.minor = minor;
-		this.service = service;
-		this.qualifier = verifyQualifier(qualifier);
-	}
-
-	/**
-	 * Creates a version identifier from the given string.
-	 * The string represenation consists of up to 4 tokens 
-	 * separated by decimal point.
-	 * For example, the following are valid version identifiers 
-	 * (as strings):
-	 * <ul>
-	 *   <li><code>0.0.0</code></li>
-	 *   <li><code>1.0.127564</code></li>
-	 *   <li><code>3.7.2.build-127J</code></li>
-	 *   <li><code>1.9</code> (interpreted as <code>1.9.0</code>)</li>
-	 *   <li><code>3</code> (interpreted as <code>3.0.0</code>)</li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @param versionId string representation of the version identifier.
-	 * Qualifier characters that are not a letter or a digit are replaced.
-	 * @since 2.0 
-	 */
-	public Version(String versionId) {
-
-		// set up default values
-		this.major = 0;
-		this.minor = 0;
-		this.service = 0;
-		this.qualifier = ""; //$NON-NLS-1$
-
-		// parse string value
-		try {
-			if (versionId == null)
-				versionId = "0.0.0"; //$NON-NLS-1$
-
-			String s = versionId.trim();
-
-			StringTokenizer st = new StringTokenizer(s, SEPARATOR);
-			Vector elements = new Vector(4);
-
-			while (st.hasMoreTokens()) {
-				elements.addElement(st.nextToken());
-			}
-
-			if (elements.size() >= 1)
-				this.major = (new Integer((String) elements.elementAt(0))).intValue();
-			if (elements.size() >= 2)
-				this.minor = (new Integer((String) elements.elementAt(1))).intValue();
-			if (elements.size() >= 3)
-				this.service = (new Integer((String) elements.elementAt(2))).intValue();
-			if (elements.size() >= 4)
-				this.qualifier = verifyQualifier((String) elements.elementAt(3));
-
-		} catch (Exception e) { // use default version 0.0.0
-		}
-
-	}
-	
-	/**
-	 * Compare two version identifiers for equality. Identifiers are
-	 * equal if all of their components are equal.
-	 *
-	 * @param object an object to compare
-	 * @return <code>true</code> if the objects are equal, 
-	 * <code>false</code> otherwise
-	 * @since 2.0 
-	 */
-	public boolean equals(Object object) {
-		if (!(object instanceof Version))
-			return false;
-		Version v = (Version) object;
-		return v.getMajorComponent() == major
-			&& v.getMinorComponent() == minor
-			&& v.getServiceComponent() == service
-			&& v.getQualifierComponent().equals(qualifier);
-	}
-	
-	/**
-	 * Returns the major (incompatible) component of this 
-	 * version identifier.
-	 *
-	 * @return the major version
-	 * @since 2.0 
-	 */
-	public int getMajorComponent() {
-		return major;
-	}
-	
-	/**
-	 * Returns the minor (compatible) component of this 
-	 * version identifier.
-	 *
-	 * @return the minor version
-	 * @since 2.0 
-	 */
-	public int getMinorComponent() {
-		return minor;
-	}
-
-	/**
-	 * Returns the service level component of this 
-	 * version identifier.
-	 *
-	 * @return the service level
-	 * @since 2.0 
-	 */
-	public int getServiceComponent() {
-		return service;
-	}
-
-	/**
-	 * Returns the qualifier component of this 
-	 * version identifier.
-	 *
-	 * @return the qualifier
-	 * @since 2.0 
-	 */
-	public String getQualifierComponent() {
-		return qualifier;
-	}
-
-	/**
-	 * Compares two version identifiers for order using multi-decimal
-	 * comparison for the first 3 components (major, minor, service)
-	 * and lexicographic string comparison for the qualifier component
-	 * 
-	 * @see java.lang.String#compareTo 
-	 * @param versionId the other version identifier
-	 * @return -1 if this version is smaller than the argument
-	 * version, 0 if it is equal and 1 if this version is greater than the argument
-	 * version.
-	 * @since 2.0 
-	 */
-	public int compare(Version id) {
-
-		if (id == null)
-			return 1;
-
-		if (major > id.getMajorComponent())
-			return 1;
-		if (major < id.getMajorComponent())
-			return -1;
-		if (minor > id.getMinorComponent())
-			return 1;
-		if (minor < id.getMinorComponent())
-			return -1;
-		if (service > id.getServiceComponent())
-			return 1;
-		if (service < id.getServiceComponent())
-			return -1;
-		return compareQualifiers(qualifier, id.getQualifierComponent());
-	}
-	
-	/**
-	 * Returns the string representation of this version identifier. 
-	 * The result satisfies
-	 * <code>vi.equals(new PluginVersionIdentifier(vi.toString()))</code>.
-	 *
-	 * @return the string representation of this version identifier. The 
-	 * individual components of the version are separated  by a period
-	 * (M.m.s.Q). Qualifier characters other than letters and digits
-	 * are replaced with a substitution character.
-	 * @since 2.0 
-	 */
-	public String toString() {
-		String s = major + SEPARATOR + minor + SEPARATOR + service;
-		if (!qualifier.equals("")) //$NON-NLS-1$
-			s += SEPARATOR + qualifier;
-		return s;
-	}
-
-	private String verifyQualifier(String s) {
-		char[] chars = s.trim().toCharArray();
-		boolean whitespace = false;
-		for (int i = 0; i < chars.length; i++) {
-			if (!Character.isLetterOrDigit(chars[i])) {
-				chars[i] = '-';
-				whitespace = true;
-			}
-		}
-		return whitespace ? new String(chars) : s;
-	}
-
-	private int compareQualifiers(String q1, String q2) {
-		int result = q1.compareTo(q2);
-		if (result < 0)
-			return -1;
-		else if (result > 0)
-			return 1;
-		else
-			return 0;
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/core/VersionedIdentifier.java b/update/org.eclipse.update.core/src/org/eclipse/update/core/VersionedIdentifier.java
index a33630f..4c4f9d1 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/core/VersionedIdentifier.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/core/VersionedIdentifier.java
@@ -4,6 +4,7 @@
  * All Rights Reserved.
  */
 
+import org.eclipse.core.runtime.PluginVersionIdentifier;
 import org.eclipse.update.internal.core.Policy;
 
 /**
@@ -17,7 +18,7 @@
  */
 public class VersionedIdentifier {
 	private String id;
-	private Version version;
+	private PluginVersionIdentifier version;
 	private static final String SEPARATOR = "_"; //$NON-NLS-1$
 
 	/**
@@ -32,17 +33,17 @@
 		if (idWithVersion == null
 			|| (idWithVersion = idWithVersion.trim()).equals("")) { //$NON-NLS-1$
 			this.id = ""; //$NON-NLS-1$
-			this.version = new Version(0, 0, 0);
+			this.version = new PluginVersionIdentifier(0, 0, 0);
 		}
 
 		int loc = idWithVersion.lastIndexOf(SEPARATOR);
 		if (loc != -1) {
 			id = idWithVersion.substring(0, loc);
 			String versionName = idWithVersion.substring(loc + 1);
-			version = new Version(versionName);
+			version = new PluginVersionIdentifier(versionName);
 		} else {
 			this.id = ""; //$NON-NLS-1$
-			version = new Version(0, 0, 0);
+			version = new PluginVersionIdentifier(0, 0, 0);
 		}
 	}
 
@@ -63,7 +64,7 @@
 				Policy.bind("VersionedIdentifier.IdOrVersionNull", id, versionName));
 		//$NON-NLS-1$
 		this.id = id;
-		this.version = new Version(versionName);
+		this.version = new PluginVersionIdentifier(versionName);
 	}
 
 	/**
@@ -82,7 +83,7 @@
 	 * @return version
 	 * @since 2.0
 	 */
-	public Version getVersion() {
+	public PluginVersionIdentifier getVersion() {
 		return version;
 	}
 
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteFileFactory.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteFileFactory.java
index 00f018f..767f237 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteFileFactory.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteFileFactory.java
@@ -36,7 +36,7 @@
 			return null;
 		}
 
-		public Version getVersion() {
+		public PluginVersionIdentifier getVersion() {
 			if (id != null)
 				return id.getVersion();
 			return null;
@@ -69,12 +69,10 @@
 			String path = url.getFile();
 			File siteLocation = new File(path);
 			if (siteLocation.isDirectory()) {
-				// need to add '/' if it is not there
-				if (!(path.endsWith("/") || path.endsWith(File.separator))) { //$NON-NLS-1$
-					url =
-						new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getFile() + "/");
-					//$NON-NLS-1$
-				}
+				path = siteLocation.getAbsolutePath().replace(File.separatorChar,'/');
+				if (!path.endsWith("/"))
+					path += "/";
+				url = new URL("file:" + path); //$NON-NLS-1$
 
 				if (new File(siteLocation, Site.SITE_XML).exists()) {
 					siteStream = new FileInputStream(new File(siteLocation, Site.SITE_XML));
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteLocal.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteLocal.java
index 49adc2d..1537065 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteLocal.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/SiteLocal.java
@@ -876,9 +876,9 @@
 	}
 
 	/**
-	 * compare 2 feature references
+	 * compare two feature references
 	 * returns 0 if the feature are different
-	 * returns 1 if the version of feature 1 is > version of feature 2
+	 * returns 1 if the version of feature 1 is greater than version of feature 2
 	 * returns 2 if opposite
 	 */
 	private int compare(
@@ -904,14 +904,14 @@
 
 		if (id1.getIdentifier() != null
 			&& id1.getIdentifier().equals(id2.getIdentifier())) {
-			Version version1 = id1.getVersion();
-			Version version2 = id2.getVersion();
+			PluginVersionIdentifier version1 = id1.getVersion();
+			PluginVersionIdentifier version2 = id2.getVersion();
 			if (version1 != null) {
-				int result = (version1.compare(version2));
-				if (result == -1) {
-					return 2;
-				} else {
+				boolean greaterOrEqual = (version1.isGreaterOrEqualTo(version2));
+				if (greaterOrEqual) {
 					return 1;
+				} else {
+					return 2;
 				}
 			} else {
 				return 2;
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/messages.properties b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/messages.properties
index a12efa7..dc6303a 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/messages.properties
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/core/messages.properties
@@ -188,7 +188,6 @@
 JarVerifier.UnableToAccessJar= Unable to access JAR file {0}.
 JarVerifier.InvalidFile= The File {0} is not a valid JAR file. It does not contain a Manifest
 
-
 JarVerificationResult.ValidBetween= Valid between {0} and {1}.
 JarVerificationResult.ExpiredCertificate= * EXPIRED CERTIFICATE *
 JarVerificationResult.CertificateNotYetValid= * CERTIFICATE NOT YET VALID *
diff --git a/update/org.eclipse.update.core/src/org/eclipse/update/internal/security/JarVerificationResult.java b/update/org.eclipse.update.core/src/org/eclipse/update/internal/security/JarVerificationResult.java
index f8528be..6a64c9a 100644
--- a/update/org.eclipse.update.core/src/org/eclipse/update/internal/security/JarVerificationResult.java
+++ b/update/org.eclipse.update.core/src/org/eclipse/update/internal/security/JarVerificationResult.java
@@ -6,6 +6,7 @@
 
 import java.security.Principal;
 import java.security.cert.*;
+import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -246,8 +247,7 @@
 	 * 
 	 */
 	private String dateString(Date date) {
-		SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMM d, yyyyy");
-		return formatter.format(date);
+		return DateFormat.getDateInstance().format(date);
 	}
 
 	/*
diff --git a/update/org.eclipse.update.examples/.classpath b/update/org.eclipse.update.examples/.classpath
deleted file mode 100644
index b48fe2a..0000000
--- a/update/org.eclipse.update.examples/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src/"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="src" path="/org.eclipse.update.core"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update.examples/.cvsignore b/update/org.eclipse.update.examples/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/update/org.eclipse.update.examples/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/update/org.eclipse.update.examples/.project b/update/org.eclipse.update.examples/.project
deleted file mode 100644
index 39cb54a..0000000
--- a/update/org.eclipse.update.examples/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.examples</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.xerces</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.update.core</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ui.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ui.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.ui.PluginNature</nature>
-		<nature>org.eclipse.team.cvs.core.cvsnature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.examples/Scrapbook2.jpage b/update/org.eclipse.update.examples/Scrapbook2.jpage
deleted file mode 100644
index b5da99a..0000000
--- a/update/org.eclipse.update.examples/Scrapbook2.jpage
+++ /dev/null
@@ -1,111 +0,0 @@
-SiteManager.getSite(URL)throws CoreException
-  String type = getTypeForprotocol(URL.getprotocol);
-  try {
-    if (type != null){
-	attemptCreationSite(type,URL);
-    } else {
-	attemptCreationSite("http",URL);
-    }
-  } catch (CoreException e){
-    throw new CoreException("Cannot create site",e.getMessage());
-  }
-
-SiteManager.attemptCreationSite(type,URL)throws CoreException
-  try {
-    createSite(type,URL);
-  } catch (InvalidTypeException e){
-    try {
-      createSite(e.getRealType(),URL);
-    } catch (InvalidSiteExeption e){
-      throw new CoreException("Wrong site type");
-    }
-  }
-
-SiteManager.createSite(type,URL) throws CoreExeption, InvalidSiteTypeException
-
-
-try {
-			
-	factory.createSite(url, forceCreation);
-	
-} catch (IOException e) {
-	// if the URL is pointing to either a file 
-// or a directory, without reference			
-if (url.getRef() != null) {
-	// 4 nothing we can do
-	throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e.getMessage(),e);
-} else if (url.getFile().endsWith("/")) {
-	// 1 try to add site.xml
-	try {
-		url = new URL(url,Site.SITE_XML);
-	} catch (MalformedURLException e1){
-		throw newCoreException("Cannot create URL:"+url.toExternalForm()+"+"+Site.SITE_XML,e1);
-	}
-	try {
-		site = factory.createSite(url, forceCreation);
-	} catch (ParsingException e1){
-		throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e1.getMessage(),e1);					
-	} catch (IOException e1){
-		throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e1.getMessage(),e1);					
-	}
-} else if (url.getFile().endsWith(Site.SITE_XML)) {
-	// 3 nothing we can do
-	throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e.getMessage(),e);
-} else {
-	// 2 try to add /site.xml
-	try {
-		url = new URL(url.getProtocol(),url.getHost(), url.getPort(), url.getFile()+"/"+Site.SITE_XML);
-	} catch (MalformedURLException e1){
-		throw newCoreException("Cannot create URL:"+url.toExternalForm()+"+"+Site.SITE_XML,e1);
-	}
-	
-	try {
-		site = factory.createSite(url, forceCreation);
-	} catch (ParsingException e1){
-		throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e1.getMessage()+"\r\nPrevious Input/Output Error:"+e.getMessage(),e1);					
-	} catch (IOException e1){
-		throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e1.getMessage()+"\r\nPrevious Input/Output Error:"+e.getMessage(),e1);					
-				}				
-			}
-
-		} catch (ParsingException e) {
-			
-			// if the URL is pointing to either a file 
-// or a directory, without reference			
-if (url.getRef() != null) {
-	// 4 nothing we can do
-	throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e.getMessage(),e);
-} else if (url.getFile().endsWith("/")) {
-	// 1 try to add site.xml
-	try {
-		url = new URL(url,Site.SITE_XML);
-	} catch (MalformedURLException e1){
-		throw newCoreException("Cannot create URL:"+url.toExternalForm()+"+"+Site.SITE_XML,e1);
-	}
-	try {
-		site = factory.createSite(url, forceCreation);
-	} catch (ParsingException e1){
-		throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e1.getMessage(),e1);					
-	} catch (IOException e1){
-		throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e1.getMessage(),e1);
-				}				
-
-			} else if (url.getFile().endsWith(Site.SITE_XML)) {
-				// 3 nothing we can do
-	throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e.getMessage(),e);					
-} else {
-	// 2 try to add /site.xml
-	
-	try {
-		url = new URL(url.getProtocol(),url.getHost(), url.getPort(), url.getFile()+"/"+Site.SITE_XML);
-	} catch (MalformedURLException e1){
-		throw newCoreException("Cannot create URL:"+url.toExternalForm()+"+"+Site.SITE_XML,e1);
-	}
-	try {
-		site = factory.createSite(url, forceCreation);
-	} catch (ParsingException e1){
-		throw newCoreException("Error parsing URL:"+url.toExternalForm()+"\r\n"+e1.getMessage()+"\r\nPrevious Parsing error:"+e.getMessage(),e1);					
-	} catch (IOException e1){
-		throw newCoreException("Error accessing url:"+url.toExternalForm()+"\r\n"+e1.getMessage()+"\r\nPrevious Parsing error:"+e.getMessage(),e1);
-	
-
diff --git a/update/org.eclipse.update.examples/about.html b/update/org.eclipse.update.examples/about.html
deleted file mode 100644
index 768324e..0000000
--- a/update/org.eclipse.update.examples/about.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<head>
-<title>About</title>
-<style type="text/css">
-p, table, td, th { font-family: arial, helvetica, geneva; font-size: 10pt}
-pre { font-family: "Courier New", Courier, mono; font-size: 10pt}
-h2 { font-family: arial, helvetica, geneva; font-size: 18pt; font-weight: bold ; line-height: 14px}
-code { font-family: "Courier New", Courier, mono; font-size: 10pt}
-sup { font-family: arial,helvetica,geneva; font-size: 10px}
-h3 { font-family: arial, helvetica, geneva; font-size: 14pt; font-weight: bold}
-li { font-family: arial, helvetica, geneva; font-size: 10pt}
-h1 { font-family: arial, helvetica, geneva; font-size: 28px; font-weight: bold}
-body { font-family: arial, helvetica, geneva; font-size: 10pt; clip: rect(   ); margin-top: 5mm; margin-left: 3mm}
-</style>
-</head>
-<body lang="EN-US" link="blue" vlink="purple">
-<table border="0" cellspacing="5" cellpadding="2" width="100%" >
-  <tr> 
-    <td align="LEFT" valign="TOP" colspan="2" bgcolor="#0080C0"><b><font color="#FFFFFF">About This Content</font></b></td>
-  </tr>
-  <tr> 
-    <td> 
-<p>11th December, 2001</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in &quot;Content&quot;.  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-<a href="http://www.eclipse.org/legal/cpl-v05.html">Common Public License Version 0.5</a> &quot;CPL&quot;.  For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL &quot;Other License&quot;, any modifications, enhancements and/or
-other code and/or documentation &quot;Modifications&quot; uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.examples/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.examples/build.properties b/update/org.eclipse.update.examples/build.properties
deleted file mode 100644
index 4205e15..0000000
--- a/update/org.eclipse.update.examples/build.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-source.updateexamplescore.jar = src/
-bin.includes=plugin.xml,plugin.properties,*.jar,about.html
diff --git a/update/org.eclipse.update.examples/plugin.properties b/update/org.eclipse.update.examples/plugin.properties
deleted file mode 100644
index c6c5caa..0000000
--- a/update/org.eclipse.update.examples/plugin.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-
-name = Install/Update BuildZip Example
-provider-name = International Business Machines Corp.
\ No newline at end of file
diff --git a/update/org.eclipse.update.examples/plugin.xml b/update/org.eclipse.update.examples/plugin.xml
deleted file mode 100644
index 8d4780f..0000000
--- a/update/org.eclipse.update.examples/plugin.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- File written by PDE 1.0 -->
-<plugin
-   id="org.eclipse.update.examples"
-   name="%name"
-   version="2.0.0"
-   provider-name="%provider-name">
-<requires>
-   <import plugin="org.eclipse.core.runtime"/>
-   <import plugin="org.apache.xerces"/>
-   <import plugin="org.eclipse.core.boot"/>
-   <import plugin="org.eclipse.update.core"/>
-</requires>
-
-<runtime>
-   <library name="updateexamples.jar">
-      <export name="*"/>
-   </library>
-</runtime>
-
-<extension
-      id="zip"
-      point="org.eclipse.update.core.featureTypes">
-   <feature-factory
-         class="org.eclipse.update.examples.buildzip.BuildZipFeatureFactory">
-   </feature-factory>
-</extension>
-
-<extension 	
-	id="site.zip" 
-	point="org.eclipse.update.core.siteTypes">
-	<site-factory 
-		class="org.eclipse.update.examples.buildzip.BuildZipSiteFactory">
-	</site-factory>
-</extension>
-
-<extension 	
-	id="site.freeform" 
-	point="org.eclipse.update.core.siteTypes">
-	<site-factory 
-		class="org.eclipse.update.examples.freeform.FreeFormSiteFactory">
-	</site-factory>
-</extension>
-
-</plugin>
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipConverter.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipConverter.java
deleted file mode 100644
index 3b0108f..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipConverter.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
- 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringBufferInputStream;
-import java.net.URL;
-import java.util.Properties;
-import java.util.jar.JarEntry;
-import java.util.jar.JarOutputStream;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.ContentReference;
-import org.eclipse.update.core.IFeature;
-import org.eclipse.update.core.IFeatureContentProvider;
-import org.eclipse.update.core.IPluginEntry;
-import org.eclipse.update.core.JarContentReference;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-
-/**
- * Converts eclipse build .zip files into packaged feature
- */
-public class BuildZipConverter {
-
-	public static void main(String[] args) {
-		if (args.length <=0) {
-			System.out.println("Usage:     BuildZipConverter <path to the zip file>.\r\nExample: BuildZipConverter d:/download/integration-eclipse-SDK-20020109-win32.zip");
-			return;
-		}
-		try {
-			URL buildzip = new URL(("file:"+args[0]).replace(File.separatorChar, '/'));
-			BuildZipFeatureFactory factory = new BuildZipFeatureFactory();
-			IFeature feature = factory.createFeature(buildzip, null);
-			IFeatureContentProvider provider = feature.getFeatureContentProvider();
-			
-			ContentReference[] refs = provider.getFeatureEntryContentReferences(null);
-			
-			File site = new File((args[0]+".packaged/").replace('/',File.separatorChar));
-			site.mkdirs();
-			File featuresDir = new File(site,"features");
-			featuresDir.mkdirs();
-			File pluginsDir = new File(site, "plugins");
-			pluginsDir.mkdirs();
-			
-			File jarFile = new File(featuresDir,feature.getVersionedIdentifier()+".jar");
-			System.out.println("writing feature archive: "+feature.getVersionedIdentifier()+".jar");
-			writeJar(jarFile, refs, feature, null, null);
-			JarContentReference jar = new JarContentReference("build.zip",buildzip);
-			Properties manifest = getBuildManifest(jar);
-			
-			IPluginEntry[] plugins = feature.getPluginEntries();
-			for (int i=0; i<plugins.length; i++) {
-				refs = provider.getPluginEntryContentReferences(plugins[i], null);
-				jarFile = new File(pluginsDir,plugins[i].getVersionedIdentifier()+".jar");
-				System.out.println("writing plugin archive: "+plugins[i].getVersionedIdentifier()+".jar");
-				writeJar(jarFile, refs, feature, plugins[i].getVersionedIdentifier().getIdentifier(), manifest);
-			}
-			
-			writeSiteManifest(site, feature);
-		} catch(Exception e) {
-			e.printStackTrace();
-		}
-	}
-	
-	public static void writeJar(File jarFile,ContentReference[] refs, IFeature feature, String pluginId, Properties manifest) {
-			
-		JarOutputStream jos = null;
-		FileOutputStream os = null;
-		InputStream is = null;
-		
-		try {
-			os = new FileOutputStream(jarFile);
-			jos = new JarOutputStream(os);
-			JarEntry entry = null;
-			String buf = null;
-			StringBufferInputStream sbis = null;
-			
-			// write jar manifest (first entry in output stream)
-			buf = "Manifest-Version: 1.0\nCreated-By: 2.0.0 (www.eclipse.org Feature Packager)\n";
-			sbis = new StringBufferInputStream(buf);
-			entry = new JarEntry("META-INF/MANIFEST.MF");
-			jos.putNextEntry(entry);
-			Utilities.copy(sbis,jos,null);
-			sbis.close();
-			
-			// jar up the references
-			for (int i=0; i<refs.length; i++) {
-				String id = refs[i].getIdentifier();
-				entry = new JarEntry(id);
-				jos.putNextEntry(entry);
-				is = refs[i].getInputStream();
-				Utilities.copy(is,jos,null);
-				is.close(); is = null;
-			}
-			
-			// for plugin jars, write build manifest
-			if (pluginId != null && manifest != null) {
-				String key = "plugin@"+pluginId;
-				String value = manifest.getProperty(key);
-				if (value != null) {
-					if (value.equals("HEAD")) {
-						value += "-" + feature.getVersionedIdentifier().getVersion().getMajorComponent();
-					}
-					buf = key + "=" + value;
-					sbis = new StringBufferInputStream(buf);
-					entry = new JarEntry("buildmanifest.properties");
-					jos.putNextEntry(entry);
-					Utilities.copy(sbis,jos,null);
-					sbis.close();
-				}
-			}
-			
-			// close jar
-			jos.close(); jos = null; os = null;
-		} catch(Exception e) {
-			e.printStackTrace();
-		} finally {
-			if (is != null) 
-				try {is.close();} catch(IOException e) {}
-				
-			if (jos != null) 
-				try {jos.close();} catch(IOException e) {}
-			else if (os != null)
-				try {os.close();} catch(IOException e) {}
-		}		
-	}
-	
-	public static void writeSiteManifest(File site, IFeature feature) throws IOException {
-		File manifest = new File(site, "site.xml");
-		FileOutputStream os = new FileOutputStream(manifest);
-		String siteXML = "<site>\n   <feature url=\"features/"+feature.getVersionedIdentifier().toString()+".jar\"/>\n</site>";
-		StringBufferInputStream sbis = new StringBufferInputStream(siteXML);
-		Utilities.copy(sbis,os,null);
-		os.close();
-		sbis.close();
-	}
-	
-	public static Properties getBuildManifest(JarContentReference jar) throws IOException {
-		ContentReference manifestEntry = jar.peek("eclipse/buildmanifest.properties",null/*ContentSelector*/, null/*ProgressMonitor*/);
-		InputStream is = null;
-		Properties props = null;
-		try {
-			props = new Properties();
-			is = manifestEntry.getInputStream();
-			props.load(is);
-		} finally {
-			if (is != null) try{ is.close(); } catch(IOException e) {}
-		}
-		return props;
-	}
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureContentProvider.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureContentProvider.java
deleted file mode 100644
index faa301b..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureContentProvider.java
+++ /dev/null
@@ -1,257 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.jar.JarEntry;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.ContentReference;
-import org.eclipse.update.core.FeatureContentProvider;
-import org.eclipse.update.core.IFeatureContentProvider;
-import org.eclipse.update.core.INonPluginEntry;
-import org.eclipse.update.core.IPluginEntry;
-import org.eclipse.update.core.IVerifier;
-import org.eclipse.update.core.InstallMonitor;
-import org.eclipse.update.core.JarContentReference;
-import org.eclipse.update.core.JarContentReference.ContentSelector;
-import org.eclipse.update.core.model.FeatureModel;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-
-/**
- * An example feature content provider. It handles features packaged as
- * build zip's using the format used for integration and stable builds
- * posted on the downloads pages at www.eclipse.org
- * </p>
- * @since 2.0
- */
-
-public class BuildZipFeatureContentProvider extends FeatureContentProvider implements IFeatureContentProvider {
-
-	private JarContentReference baseReference;
-	private ContentReference generatedFeatureManifest;	
-	private ContentReference[] featureEntryContentReferences;
-	private IPluginEntry currentPluginEntry;
-	private INonPluginEntry currentNonPluginEntry;
-	
-	public BuildZipFeatureContentProvider(URL base) {
-		super(base);
-		this.baseReference = new JarContentReference("build.zip",base);
-	}
-	
-	/*
-	 * @see IFeatureContentProvider#getFeatureManifest()
-	 */
-	public ContentReference getFeatureManifestReference(InstallMonitor monitor) throws CoreException {
-		if (generatedFeatureManifest == null) {
-			throw newCoreException("Feature manifest is not available",null);
-		}
-		else
-			return generatedFeatureManifest;
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getArchiveReferences()
-	 */
-	public ContentReference[] getArchiveReferences(InstallMonitor monitor) {
-		// the feature and all its plugins files are packaged in a single archive
-		return new ContentReference[] { baseReference };
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getFeatureEntryArchiveReferences()
-	 */
-	public ContentReference[] getFeatureEntryArchiveReferences(InstallMonitor monitor) {
-		// the feature and all its plugins files are packaged in a single archive
-		return new ContentReference[] { baseReference };
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getPluginEntryArchiveReferences(IPluginEntry)
-	 */
-	public ContentReference[] getPluginEntryArchiveReferences(IPluginEntry pluginEntry, InstallMonitor monitor) {
-		// the feature and all its plugins files are packaged in a single archive
-		return new ContentReference[] { baseReference };
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getNonPluginEntryArchiveReferences(INonPluginEntry)
-	 */
-	public ContentReference[] getNonPluginEntryArchiveReferences(INonPluginEntry nonPluginEntry, InstallMonitor monitor) 
-		throws CoreException {
-		try {
-			return peekNonPluginEntryContent(nonPluginEntry,monitor);
-		} catch(IOException e) {
-			throw newCoreException("Unable to return content for non plugin entry "+nonPluginEntry.getIdentifier(),e);
-		}
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getFeatureEntryContentReferences()
-	 */
-	public ContentReference[] getFeatureEntryContentReferences(InstallMonitor monitor) {
-		if (featureEntryContentReferences == null)
-			return new ContentReference[0];
-		else
-			return  featureEntryContentReferences;
-	}
-
-	/*
-	 * @see IFeatureContentProvider#getPluginEntryContentReferences(IPluginEntry)
-	 */
-	public ContentReference[] getPluginEntryContentReferences(IPluginEntry pluginEntry, InstallMonitor monitor)
-		throws CoreException {
-		try {
-			return peekPluginEntryContent(pluginEntry, monitor);
-		} catch(IOException e) {
-			throw newCoreException("Unable to return content for plugin entry "+pluginEntry.getVersionedIdentifier(),e);
-		}
-	}
-	
-	public URL getFeatureBaseURL() throws IOException {
-		return getWorkingDirectory().toURL();
-			
-	}
-
-	ContentReference getFeatureBuildManifest() throws Exception {
-		return baseReference.peek("eclipse/buildmanifest.properties",null/*ContentSelector*/, null/*ProgressMonitor*/);
-	}
-
-	ContentReference getPluginManifest(String pluginId, boolean isFragment) throws Exception {			
-		String manifestName = "eclipse/plugins/" + pluginId + "/" + (isFragment ? "fragment.xml" : "plugin.xml");
-		return baseReference.peek(manifestName, null/*ContentSelector*/, null/*ProgressMonitor*/);
-	}
-	
-	void unpackFeatureEntryContent(FeatureModel feature, InstallMonitor monitor) throws IOException {
-			
-		// define selector for feature entry files
-		ContentSelector selector = new ContentSelector() {
-			public boolean include(JarEntry jarEntry) {
-				if (jarEntry.isDirectory())
-					return false;					
-				String entry = jarEntry.getName();
-				if (entry.startsWith("eclipse/readme/"))
-					return true;
-				else if (entry.startsWith("eclipse/splash/"))
-					return true;
-				else if (entry.startsWith("eclipse/") && entry.indexOf("/",8)==-1 && entry.endsWith(".html"))
-					return true;
-				else
-					return false;	
-			}
-			public String defineIdentifier(JarEntry jarEntry) {
-				String entry = jarEntry.getName();
-				if (entry.startsWith("eclipse/"))
-					return entry.substring(8);
-				else
-					return entry;
-			}
-		};
-		
-		// unpack feature entry files
-		File tmpDir = getWorkingDirectory();
-		ContentReference[] refs = baseReference.unpack(tmpDir, selector, monitor);
-		
-		// write out feature manifest (feature.xml);
-		File manifest = Utilities.createLocalFile(tmpDir, null/*key*/,"feature.xml");
-		ContentReference manifestReference = new ContentReference("feature.xml", manifest);
-		DefaultModelWriter w = new DefaultModelWriter(feature);
-		FileOutputStream os = null;
-		try {
-			os = new FileOutputStream(manifest);
-			w.writeFeatureManifest(os);
-		} finally {
-			if (os != null) try { os.close(); } catch(IOException e) {}
-		}
-		this.generatedFeatureManifest = manifestReference;
-		
-		// save references (newly-written feature.xml plus rest of selected feature files)
-		ContentReference[] allRefs = new ContentReference[refs.length+1];
-		allRefs[0] = manifestReference;
-		System.arraycopy(refs,0,allRefs,1,refs.length);
-		featureEntryContentReferences = allRefs;
-	}
-		
-	ContentReference[] peekPluginEntryContent(IPluginEntry plugin, InstallMonitor monitor) throws IOException {
-		
-		// define selector for plugin entry files
-		ContentSelector selector = new ContentSelector() {
-			public boolean include(JarEntry jarEntry) {
-				if (jarEntry.isDirectory())
-					return false;
-				String entry = jarEntry.getName();
-				String id = currentPluginEntry.getVersionedIdentifier().getIdentifier();
-				if (id==null)
-					return false;
-				else if (entry.startsWith("eclipse/plugins/"+id+"/"))
-					return true;
-				else
-					return false;	
-			}
-			public String defineIdentifier(JarEntry jarEntry) {
-				String entry = jarEntry.getName();
-				int ix = entry.indexOf("/",16);
-				if (ix != -1) {
-					return entry.substring(ix+1);
-				} else {
-					return entry;
-				}
-			}
-		};
-		
-		// unpack plugin entry files
-		currentPluginEntry = plugin;
-		return baseReference.peek(selector, monitor);
-	}
-		
-	ContentReference[] peekNonPluginEntryContent(INonPluginEntry data, InstallMonitor monitor) throws IOException {
-		
-		// define selector for non plugin entry files
-		ContentSelector selector = new ContentSelector() {
-			public boolean include(JarEntry jarEntry) {
-				if (jarEntry.isDirectory())
-					return false;
-				String entry = jarEntry.getName();
-				String id = currentNonPluginEntry.getIdentifier();
-				if (!id.equals("root"))
-					return false;
-				else if (!entry.startsWith("eclipse/plugins/"))
-					return true;
-				else
-					return false;	
-			}
-			public String defineIdentifier(JarEntry jarEntry) {
-				String entry = jarEntry.getName();
-				if (entry.startsWith("eclipse/"))
-					return entry.substring(8);
-				else
-					return entry;
-			}
-		};
-		
-		// unpack non plugin entry files
-		currentNonPluginEntry = data;
-		return baseReference.peek(selector, monitor);
-	}
-	
-	private CoreException newCoreException(String s, Throwable e) throws CoreException {
-		return new CoreException(new Status(IStatus.ERROR,"org.eclipse.update.examples",0,s,e));
-	}
-	/*
-	 * @see IFeatureContentProvider#getVerifier()
-	 */
-	public IVerifier getVerifier() throws CoreException {
-		return null;
-	}
-
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureFactory.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureFactory.java
deleted file mode 100644
index df11a78..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.update.core.BaseFeatureFactory;
-import org.eclipse.update.core.Feature;
-import org.eclipse.update.core.IFeature;
-import org.eclipse.update.core.IFeatureFactory;
-import org.eclipse.update.core.ISite;
-import org.eclipse.update.core.model.FeatureModel;
-
-/**
- * An example feature factory based on the packaging 
- * format used for integration and stable builds
- * posted on the downloads pages at www.eclipse.org
- * </p>
- * @since 2.0
- */
-
-public class BuildZipFeatureFactory
-	extends BaseFeatureFactory
-	implements IFeatureFactory {
-
-	/*
-	 * @see IFeatureFactory#createFeature(URL, ISite)
-	 */
-	public IFeature createFeature(URL url, ISite site) throws CoreException {
-		try {
-			// create content provider for feature
-			BuildZipFeatureContentProvider cp = new BuildZipFeatureContentProvider(url);
-			Feature feature = null;
-			
-			// parse the feature
-			feature = (Feature) parseFeature(cp);
-			
-			// initialize feature
-			feature.setFeatureContentProvider(cp);
-			feature.setSite(site);
-			feature.resolve(cp.getFeatureBaseURL(), null); 
-			feature.markReadOnly();
-			return feature;
-		} catch (Exception e) {
-			throw new CoreException(new Status(IStatus.ERROR,"org.eclipse.update.examples.buildzip",0,"Unable to create feature",e));
-		}
-	}
-
-	/*
-	 * parse the build zip to reconstruct a feature model
-	 */
-	public FeatureModel parseFeature(BuildZipFeatureContentProvider cp) throws Exception {
-		return (new BuildZipFeatureParser(this)).parse(cp);
-	}
-
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureParser.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureParser.java
deleted file mode 100644
index f81e490..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipFeatureParser.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
- 
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URLDecoder;
-import java.util.Enumeration;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.PluginVersionIdentifier;
-import org.eclipse.update.core.ContentReference;
-import org.eclipse.update.core.model.FeatureModel;
-import org.eclipse.update.core.model.NonPluginEntryModel;
-import org.eclipse.update.core.model.PluginEntryModel;
-import org.eclipse.update.core.model.URLEntryModel;
-
-/**
- * An example feature parser. It handles features packaged as
- * build zip's using the format used for integration and stable builds
- * posted on the downloads pages at www.eclipse.org
- * </p>
- * @since 2.0
- */
-
-public class BuildZipFeatureParser {	
-	
-	private BuildZipFeatureFactory factory;
-	private BuildZipPluginParser pluginParser;
-	
-	public BuildZipFeatureParser(BuildZipFeatureFactory factory) {
-		this.factory = factory;
-	}
-	
-	public FeatureModel parse(BuildZipFeatureContentProvider cp) throws Exception {				
-		return parseFeature(cp);
-	}
-	
-	private FeatureModel parseFeature(BuildZipFeatureContentProvider cp) throws Exception {		
-		
-		// get reference to the build manifest
-		ContentReference manifestRef = cp.getFeatureBuildManifest();
-		InputStream is = manifestRef.getInputStream();		
-		
-		// load buildmanifest.properties
-		Properties manifest = new Properties();
-		try {
-			manifest.load(is);
-		} finally {
-			if (is!=null) try { is.close(); } catch(IOException e) {}
-		}
-		
-		// populate feature model
-		FeatureModel feature = factory.createFeatureModel();
-		parseFeatureEntry(cp, feature, manifest);
-		
-		// parse plugin entries
-		parsePluginEntries(cp, feature, manifest); 
-		
-		// parse non-plugin entries
-		parseNonPluginEntries(cp, feature, manifest);
-		
-		// unpack feature entry content
-		cp.unpackFeatureEntryContent(feature, null/*IProgressMonitor*/);
-		
-		return feature;
-	}
-	
-	private void parseFeatureEntry(BuildZipFeatureContentProvider cp, FeatureModel feature, Properties manifest) throws Exception {
-		
-		// parse out build zip file name. It is assumed to be in the
-		// form <package identifier>-<build date>-<target platform>.zip,
-		// where
-		//		<package identifier> is hyphen (-) separaterd token list
-		//		<build date> is single all-numeric token
-		//		<target platform> is hyphen (-) separaterd token list
-		
-		String pkgId = "";
-		String target = "";
-		String build = "";
-		String state = "ID";
-		boolean firstToken = true;
-		String zipName = URLDecoder.decode(cp.getURL().getFile());
-		int ix = zipName.lastIndexOf("/");
-		if (ix != -1)
-			zipName = zipName.substring(ix+1);
-		if (zipName.endsWith(".zip")) {
-			zipName = zipName.substring(0,zipName.length()-4);
-		}
-		StringTokenizer tokenizer = new StringTokenizer(zipName,"-",false);
-		String token;
-		while(tokenizer.hasMoreTokens()) {
-			token = tokenizer.nextToken();
-			try {
-				Long.parseLong(token);
-				state = "TARGET";
-				target = "";
-				firstToken = true;
-				build = token+".0.0";
-			} catch (NumberFormatException e) {
-				if (state.equals("ID")) {
-					pkgId += (firstToken ? "" : " ") + token;
-				} else {
-					target += (firstToken ? "" : " ") + token;
-				}
-				firstToken = false;
-			}
-		}
-		
-		// generate base feature attributes
-		feature.setFeatureIdentifier(pkgId.replace(' ','.'));
-		feature.setFeatureVersion(build);
-		feature.setLabel(pkgId.substring(0,1).toUpperCase() + pkgId.substring(1) + " for " + target);
-		feature.setProvider("www.eclipse.org");
-		feature.setImageURLString("splash/splash_full.bmp");
-		feature.setOS(target.replace(' ','-'));	
-		
-		// add description
-		URLEntryModel description = factory.createURLEntryModel();
-		description.setURLString("readme/readme.html");
-		description.setAnnotation("x");
-		feature.setDescriptionModel(description);
-		
-		// add license
-		URLEntryModel license = factory.createURLEntryModel();
-		license.setURLString("about.html");
-		license.setAnnotation("You must view the full license by following the \"License\" link in the feature preview.\nSelecting \"Accept\" indicates that you have viewed and accepted the feature license.");
-		feature.setLicenseModel(license);
-		
-		// add copyright
-		URLEntryModel copyright = factory.createURLEntryModel();
-		copyright.setURLString("notice.html");
-		copyright.setAnnotation("x");
-		feature.setCopyrightModel(copyright);
-	}	
-	
-	private void parsePluginEntries(BuildZipFeatureContentProvider cp, FeatureModel feature, Properties manifest) throws Exception {
-		
-		Enumeration entries = manifest.keys();
-		String plugin;
-		String pluginId;
-		String pluginVersion;
-		String pluginBuildVersion;
-		PluginEntryModel pluginEntry;
-		while(entries.hasMoreElements()) {
-			plugin = (String) entries.nextElement();
-			if (plugin.startsWith("plugin@")) {
-				pluginId = plugin.substring(7);
-				pluginBuildVersion = manifest.getProperty(plugin);
-				if (pluginBuildVersion.equals("HEAD")) {
-					String featureVersion = feature.getFeatureVersion();
-					int ix = featureVersion.indexOf(".");
-					String featureMajor = ix==-1 ? featureVersion : featureVersion.substring(0,ix);
-					pluginBuildVersion += "-" + featureMajor;
-				}
-				pluginEntry = factory.createPluginEntryModel();
-				pluginVersion = parsePluginVersionInManifest(cp, pluginId, pluginEntry);
-				if (pluginVersion != null) {
-					pluginEntry.setPluginIdentifier(pluginId);
-					pluginEntry.setPluginVersion((new PluginVersionIdentifier(pluginVersion)).toString()+"."+pluginBuildVersion);
-					feature.addPluginEntryModel(pluginEntry);
-				}
-			}
-		}		
-	}
-	
-	private void parseNonPluginEntries(BuildZipFeatureContentProvider cp, FeatureModel feature, Properties manifest) throws Exception {
-	//	NonPluginEntryModel nonPluginEntry = factory.createNonPluginEntryModel();
-	//	nonPluginEntry.setIdentifier("root");
-	//	feature.addNonPluginEntryModel(nonPluginEntry);
-	}
-	
-	private String parsePluginVersionInManifest(BuildZipFeatureContentProvider cp, String pluginId, PluginEntryModel pluginEntry) {
-
-		if (pluginParser == null)
-			pluginParser = new BuildZipPluginParser();
-				
-		InputStream is = null;				
-		ContentReference pluginManifest;
-		try {
-			// try plugin.xml
-			pluginManifest  = cp.getPluginManifest(pluginId, false);
-			is = pluginManifest.getInputStream();
-			return pluginParser.parse(is);
-		} catch (Exception e) {
-			try {
-				// retry with feature.xml
-				pluginManifest  = cp.getPluginManifest(pluginId, true);
-				is = pluginManifest.getInputStream();
-				String result = pluginParser.parse(is);
-				pluginEntry.isFragment(true);
-				return result;
-			} catch (Exception e2) {
-				return null;
-			}
-		} finally {
-			if (is != null) try { is.close(); } catch (IOException e) {}
-		}
-	}
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipPluginParser.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipPluginParser.java
deleted file mode 100644
index 90e1d1f..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipPluginParser.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.xerces.parsers.SAXParser;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Parse default feature.xml
- */
-
-public class BuildZipPluginParser extends DefaultHandler {
-
-	private SAXParser parser;
-	private String version;
-	
-	private static final String PLUGIN = "plugin";
-	private static final String FRAGMENT = "fragment";
-	private static final String ID = "id";
-	private static final String VERSION = "version";	
-	
-	private class ParseCompleteException extends SAXException {
-		public ParseCompleteException(String arg0) {
-			super(arg0);
-		}
-	}
-
-	/**
-	 * Constructor for DefaultFeatureParser
-	 */
-	public BuildZipPluginParser() {
-		super();
-		this.parser = new SAXParser();
-		this.parser.setContentHandler(this);
-	}
-	
-	/**
-	 * @since 2.0
-	 */
-	public synchronized String parse(InputStream in) throws SAXException, IOException {
-		try {
-			version = null;
-			parser.parse(new InputSource(in));
-		} catch(ParseCompleteException e) {
-		}
-		return version;
-	}
-	
-	/**
-	 * @see DefaultHandler#startElement(String, String, String, Attributes)
-	 */
-	public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
-		
-		String tag = localName.trim();
-	
-		if (tag.equalsIgnoreCase(PLUGIN)) {
-			processPlugin(attributes);
-			return;
-		}
-	
-		if (tag.equalsIgnoreCase(FRAGMENT)) {
-			processPlugin(attributes);
-			return;
-		}
-	}
-	
-	/** 
-	 * process plugin entry info
-	 */
-	private void processPlugin(Attributes attributes) throws ParseCompleteException {
-		version = attributes.getValue("version");
-		throw new ParseCompleteException("");
-	}
-}
-
-
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteContentProvider.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteContentProvider.java
deleted file mode 100644
index 05ec032..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteContentProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.SiteContentProvider;
-
-public class BuildZipSiteContentProvider extends SiteContentProvider {
-
-	/**
-	 * Constructor for SiteContentProvider.
-	 */
-	public BuildZipSiteContentProvider(URL url) {
-		super(url);
-	}
-	
-	/*
-	 * @see ISiteContentProvider#getArchiveReference(String)
-	 */
-	public URL getArchiveReference(String id) throws CoreException {
-		// build zip features do not have associated archives
-		// the zip file also contains the archives files
-		return null;
-	}
-
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteFactory.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteFactory.java
deleted file mode 100644
index c59ad05..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/BuildZipSiteFactory.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.BaseSiteFactory;
-import org.eclipse.update.core.ISite;
-import org.eclipse.update.core.Site;
-import org.eclipse.update.core.model.FeatureReferenceModel;
-import org.eclipse.update.core.model.InvalidSiteTypeException;
-import org.eclipse.update.core.model.CategoryModel;
-
-public class BuildZipSiteFactory extends BaseSiteFactory {
-
-	/*
-	 * @see ISiteFactory#createSite(URL)
-	 */
-	public ISite createSite(URL url) throws CoreException,InvalidSiteTypeException {
-
-		Site site = null;
-
-		// create site and add category
-		site = (Site) createSiteMapModel();
-		CategoryModel category = createSiteCategoryModel();
-		category.setName("eclipse-builds");
-		category.setLabel("Eclipse Builds");
-		site.addCategoryModel(category);
-
-		// set content provider
-		BuildZipSiteContentProvider contentProvider = new BuildZipSiteContentProvider(url);
-		site.setSiteContentProvider(contentProvider);
-
-		// get all matching zip files on the site
-		FileFilter filter = new FileFilter() {
-			public boolean accept(File file) {
-				if (file.getName().endsWith(".zip")) {
-					try {
-						ZipFile zip = new ZipFile(file);
-						ZipEntry entry = zip.getEntry("eclipse/buildmanifest.properties");
-						if (entry == null)
-							return false;
-						else
-							return true;
-					} catch (IOException e) {
-						return false;
-					}
-				} else
-					return false;
-			}
-		};
-		File file = new File(URLDecoder.decode(url.getFile()));
-		File[] zips = file.listFiles(filter);
-
-		// create a reference for each matching zip
-		FeatureReferenceModel ref = null;
-		for (int i = 0; zips != null && i < zips.length; i++) {
-			ref = createFeatureReferenceModel();
-			ref.setType("org.eclipse.update.examples.zip");
-			ref.setSiteModel(site);
-			ref.setURLString("file:" + zips[i].getAbsolutePath());
-			ref.setCategoryNames(new String[] { "eclipse-builds" });
-			site.addFeatureReferenceModel(ref);
-		}
-		try {
-			site.resolve(url, null); // resolve any URLs relative to the site
-		} catch (MalformedURLException e){
-			throw Utilities.newCoreException("",e);
-		}
-
-		return site;
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/DefaultModelWriter.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/DefaultModelWriter.java
deleted file mode 100644
index 60b1eef..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/DefaultModelWriter.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
- 
-import java.io.OutputStream;
-import java.io.PrintWriter;
-
-import org.eclipse.update.core.model.*;
-
-/**
- * Write standard feature manifest (feature.xml) from model.
- * </p>
- * @since 2.0
- */
-
-public class DefaultModelWriter {
-	
-	private FeatureModel feature;
-	
-	/**
-	 * @since 2.0
-	 */
-	public DefaultModelWriter(FeatureModel feature) {
-		this.feature = feature;
-	}
-	
-	/**
-	 * @since 2.0
-	 */
-	public void writeFeatureManifest(OutputStream os) {
-		PrintWriter w = new PrintWriter(os);
-		writeFeature(w,0,feature);
-		w.flush();
-	}
-	
-	private void writeFeature(PrintWriter w, int level, FeatureModel feature) {
-		if (feature == null) return;
-		
-		String in = getIndent(level);
-		w.println(in+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-		
-		w.println(in+"<feature");
-		if (feature.getFeatureIdentifier()!=null)
-			w.println(in+"   "+"id=\""+feature.getFeatureIdentifier()+"\"");
-		if (feature.getFeatureVersion()!=null)
-			w.println(in+"   "+"version=\""+feature.getFeatureVersion()+"\"");
-		if (feature.getLabelNonLocalized()!=null)
-			w.println(in+"   "+"label=\""+feature.getLabelNonLocalized()+"\"");
-		if (feature.getProviderNonLocalized()!=null)
-			w.println(in+"   "+"provider-name=\""+feature.getProviderNonLocalized()+"\"");
-		if (feature.getImageURLString()!=null)
-			w.println(in+"   "+"image=\""+feature.getImageURLString()+"\"");
-		if (feature.getOS()!=null)
-			w.println(in+"   "+"os=\""+feature.getOS()+"\"");
-		if (feature.getWS()!=null)
-			w.println(in+"   "+"ws=\""+feature.getWS()+"\"");
-		if (feature.getNL()!=null)
-			w.println(in+"   "+"nl=\""+feature.getNL()+"\"");
-		if (feature.getApplication()!=null)
-			w.println(in+"   "+"application=\""+feature.getApplication()+"\"");
-		w.println(in+"   "+">");
-		
-		writeDescription(w, level+1, feature.getDescriptionModel());
-		writeCopyright(w, level+1, feature.getCopyrightModel());
-		writeLicense(w, level+1, feature.getLicenseModel());
-		writeURLs(w, level+1, feature);
-		writePrereqs(w, level+1, feature);
-		writePluginEntries(w, level+1, feature);
-		writeNonPluginEntries(w, level+1, feature);
-         
-        w.println("");
-        w.println(in+"</feature>");
-	}
-	
-	private void writeDescription(PrintWriter w, int level, URLEntryModel ue) {
-		writeDescriptionEntry(w,level, ue, "description");
-	}
-	
-	private void writeCopyright(PrintWriter w, int level, URLEntryModel ue) {
-		writeDescriptionEntry(w,level, ue, "copyright");
-	}
-	
-	private void writeLicense(PrintWriter w, int level, URLEntryModel ue) {
-		writeDescriptionEntry(w,level, ue, "license");
-	}
-	
-	private void writeDescriptionEntry(PrintWriter w, int level, URLEntryModel ue, String tag) {
-		if (ue == null) return;
-		String url = ue.getURLString();
-		String txt = ue.getAnnotationNonLocalized();
-		if (url==null && txt==null) return;
-		
-		String in = getIndent(level);
-		w.println("");
-		if (url==null)
-			w.println(in+"<"+tag+">");
-		else {
-			w.print(in+"<"+tag+" url=\""+ue.getURLString()+"\"");
-			if (txt==null)
-				w.println("/>");
-			else
-				w.println(">");
-		}
-		if (txt!=null) {
-			w.println(in + txt);
-			w.println(in+"</"+tag+">");
-		}
-	}
-	
-	private void writeURLs(PrintWriter w, int level, FeatureModel feature) {	
-		URLEntryModel update = feature.getUpdateSiteEntryModel();
-		URLEntryModel[] discovery = feature.getDiscoverySiteEntryModels();		
-		if (update == null && (discovery == null || discovery.length==0)) return;
-		
-		String in = getIndent(level);
-		String in2 = getIndent(level+1);		
-		w.println("");
-		w.println(in+"<url>");
-		
-		if (update != null) {
-			w.println(in2+"<update");
-			if (update.getURLString()!=null)
-				w.println(in2+"   "+"url=\""+update.getURLString()+"\"");
-			if (update.getAnnotationNonLocalized()!=null)
-				w.println(in2+"   "+"label=\""+update.getAnnotationNonLocalized()+"\"");
-			w.println(in2+"   "+"/>");
-		}
-		
-		for (int i=0; discovery!=null && i<discovery.length; i++) {
-			w.println(in2+"<discovery");
-			if (discovery[i].getURLString()!=null)	
-				w.println(in2+"   "+"url=\""+discovery[i].getURLString()+"\"");
-			if (discovery[i].getAnnotationNonLocalized()!=null)
-				w.println(in2+"   "+"label=\""+discovery[i].getAnnotationNonLocalized()+"\"");
-			w.println(in2+"   "+"/>");
-		}
-		
-		w.println(in+"</url>");
-	}
-	
-	private void writePrereqs(PrintWriter w, int level, FeatureModel feature) {	
-		ImportModel[] imp = feature.getImportModels();	
-		if (imp == null || imp.length == 0) return;
-		
-		String in = getIndent(level);
-		String in2 = getIndent(level+1);
-		w.println("");
-		w.println(in+"<requires>");
-		
-		for (int i=0; imp!=null && i<imp.length; i++) {
-			w.println(in2+"<import");
-			if (imp[i].getPluginIdentifier()!=null)
-				w.println(in2+"   "+"plugin=\""+imp[i].getPluginIdentifier()+"\"");
-			if (imp[i].getPluginVersion()!=null)
-				w.println(in2+"   "+"version=\""+imp[i].getPluginVersion()+"\"");
-			if (imp[i].getMatchingRuleName()!=null)
-				w.println(in2+"   "+"match=\""+imp[i].getMatchingRuleName()+"\"");
-			w.println(in2+"   "+"/>");
-		}
-		
-		w.println(in+"</requires>");
-	}
-	
-	private void writePluginEntries(PrintWriter w, int level, FeatureModel feature) {
-		PluginEntryModel[] plugin = feature.getPluginEntryModels();
-		if (plugin == null || plugin.length == 0) return;
-		
-		String in = getIndent(level);
-		w.println("");
-		
-		for (int i=0; i<plugin.length; i++) {
-			w.println(in+"<plugin");
-			if (plugin[i].getPluginIdentifier()!=null)
-				w.println(in+"   "+"id=\""+plugin[i].getPluginIdentifier()+"\"");
-			if (plugin[i].getPluginVersion()!=null)
-				w.println(in+"   "+"version=\""+plugin[i].getPluginVersion()+"\"");
-			if (plugin[i].isFragment())
-				w.println(in+"   "+"fragment=\""+plugin[i].isFragment()+"\"");
-			if (plugin[i].getOS()!=null)
-				w.println(in+"   "+"os=\""+plugin[i].getOS()+"\"");
-			if (plugin[i].getWS()!=null)
-				w.println(in+"   "+"ws=\""+plugin[i].getWS()+"\"");
-			if (plugin[i].getNL()!=null)
-				w.println(in+"   "+"nl=\""+plugin[i].getNL()+"\"");
-			if (plugin[i].getDownloadSize()!=ContentEntryModel.UNKNOWN_SIZE)
-				w.println(in+"   "+"download-size=\""+plugin[i].getDownloadSize()+"\"");
-			if (plugin[i].getInstallSize()!=ContentEntryModel.UNKNOWN_SIZE)
-				w.println(in+"   "+"install-size=\""+plugin[i].getInstallSize()+"\"");
-			w.println(in+"   "+"/>");
-		}
-	}
-	
-	private void writeNonPluginEntries(PrintWriter w, int level, FeatureModel feature) {
-		NonPluginEntryModel[] data = feature.getNonPluginEntryModels();
-		if (data == null || data.length == 0) return;
-		
-		String in = getIndent(level);
-		w.println("");
-		
-		for (int i=0; i<data.length; i++) {
-			w.println(in+"<data");
-			if (data[i].getIdentifier()!=null)
-				w.println(in+"   "+"id=\""+data[i].getIdentifier()+"\"");
-			if (data[i].getOS()!=null)
-				w.println(in+"   "+"os=\""+data[i].getOS()+"\"");
-			if (data[i].getWS()!=null)
-				w.println(in+"   "+"ws=\""+data[i].getWS()+"\"");
-			if (data[i].getNL()!=null)
-				w.println(in+"   "+"nl=\""+data[i].getNL()+"\"");
-			if (data[i].getDownloadSize()!=ContentEntryModel.UNKNOWN_SIZE)
-				w.println(in+"   "+"download-size=\""+data[i].getDownloadSize()+"\"");
-			if (data[i].getInstallSize()!=ContentEntryModel.UNKNOWN_SIZE)
-				w.println(in+"   "+"install-size=\""+data[i].getInstallSize()+"\"");
-			w.println(in+"   "+"/>");
-		}
-	}
-	
-	
-	private String getIndent(int level) {
-		String indent = "";
-		for (int i=0; i<level; i++) 
-			indent += "   ";
-		return indent;
-	}
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/Test.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/Test.java
deleted file mode 100644
index 1e189df..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/Test.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.eclipse.update.examples.buildzip;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */ 
-
-import java.net.URL;
-
-import org.eclipse.update.core.*;
- 
-/**
- * unit test harness
- */
-
-public class Test {
-
-	public static void main(String[] args) {
-		
-		try {
-			URL url = new URL("file:d:/downloads/eclipse 2.0/integration-eclipse-SDK-20020109-win32.zip");
-			BuildZipFeatureFactory factory = new BuildZipFeatureFactory();
-			Feature feature = (Feature) factory.createFeature(url,null/*ISite*/);
-			DefaultModelWriter w = new DefaultModelWriter(feature);
-			w.writeFeatureManifest(System.out);
-			
-			System.out.println("");
-			System.out.println("Feature entry references");
-			ContentReference[] refs = feature.getFeatureContentProvider().getFeatureEntryContentReferences(null);
-			for (int i=0; i< refs.length; i++) {
-				System.out.println("   "+refs[i].getIdentifier());
-			}
-			
-			System.out.println("");
-			System.out.println("Plug-in entry references");
-			IPluginEntry[] entry = feature.getPluginEntries();
-			refs = feature.getFeatureContentProvider().getPluginEntryContentReferences(entry[0], null);
-			for (int i=0; i< refs.length; i++) {
-				System.out.println("   "+refs[i].getIdentifier());
-			}			
-			
-			System.out.println("");
-			System.out.println("Non-plug-in entry references");
-			INonPluginEntry[] data = feature.getNonPluginEntries();
-			refs = feature.getFeatureContentProvider().getNonPluginEntryArchiveReferences(data[0], null);
-			for (int i=0; i< refs.length; i++) {
-				System.out.println("   "+refs[i].getIdentifier());
-			}			
-			
-			System.out.println("Done ...");
-		} catch (Exception e) {
-			e.printStackTrace();
-		}		
-	}
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/java.page.jpage b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/java.page.jpage
deleted file mode 100644
index 8b3ca30..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/buildzip/java.page.jpage
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteContentProvider.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteContentProvider.java
deleted file mode 100644
index 2cbeab4..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteContentProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.eclipse.update.examples.freeform;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.update.core.SiteContentProvider;
-
-public class FreeFormSiteContentProvider extends SiteContentProvider {
-
-	/**
-	 * Constructor for SiteContentProvider.
-	 */
-	public FreeFormSiteContentProvider(URL url) {
-		super(url);
-	}
-	
-	/*
-	 * @see ISiteContentProvider#getArchiveReference(String)
-	 */
-	public URL getArchiveReference(String id) throws CoreException {
-		try {
-			return new URL(getURL(),id);
-		} catch(MalformedURLException e) {
-			throw newCoreException("Unable to return archive URL",e);
-		}
-	}
-	
-	private CoreException newCoreException(String s, Throwable e) throws CoreException {
-		return new CoreException(new Status(IStatus.ERROR,"org.eclipse.update.examples",0,s,e));
-	}
-
-}
diff --git a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteFactory.java b/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteFactory.java
deleted file mode 100644
index cb3c7fc..0000000
--- a/update/org.eclipse.update.examples/src/org/eclipse/update/examples/freeform/FreeFormSiteFactory.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.update.examples.freeform;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.BaseSiteFactory;
-import org.eclipse.update.core.ISite;
-import org.eclipse.update.core.Site;
-import org.eclipse.update.core.model.InvalidSiteTypeException;
-import org.eclipse.update.core.model.URLEntryModel;
-
-public class FreeFormSiteFactory extends BaseSiteFactory {
-
-	/*
-	 * @see ISiteFactory#createSite(URL)
-	 */
-	public ISite createSite(URL url)
-		throws CoreException, InvalidSiteTypeException {
-
-		// Create site
-		Site site = null;
-		InputStream is = null;
-		try {
-			is = url.openStream();
-			site = (Site) parseSite(is);
-
-			URLEntryModel realSiteRef = site.getDescriptionModel();
-			if (realSiteRef == null)
-				throw Utilities.newCoreException(
-					"Unable to obtain update site reference",
-					null);
-			String siteURLString = realSiteRef.getURLString();
-			if (siteURLString == null)
-				throw Utilities.newCoreException(
-					"Unable to obtain update site reference",
-					null);
-			URL siteURL = new URL(siteURLString);
-			FreeFormSiteContentProvider contentProvider =
-				new FreeFormSiteContentProvider(siteURL);
-			site.setSiteContentProvider(contentProvider);
-			site.resolve(siteURL, null); // resolve any URLs relative to the site
-
-		} catch (MalformedURLException e){
-			throw Utilities.newCoreException("Unable to create URL",e);
-		} catch (IOException e){
-			throw Utilities.newCoreException("Unable to access URL",e);
-		} finally {
-			if (is != null)
-				try {
-					is.close();
-				} catch (IOException e) {
-				}
-		}
-
-		return site;
-	}
-
-	/*
-	 * @see SiteModelFactory#canParseSiteType(String)
-	 */
-	public boolean canParseSiteType(String type) {
-		return type != null
-			&& type.equals("org.eclipse.update.examples.site.freeform");
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/.classpath b/update/org.eclipse.update.tests.core/.classpath
deleted file mode 100644
index 98c6705..0000000
--- a/update/org.eclipse.update.tests.core/.classpath
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src/"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.junit"/>
-    <classpathentry kind="src" path="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.core.resources"/>
-    <classpathentry kind="src" path="/org.eclipse.update.core"/>
-    <classpathentry kind="src" path="/org.eclipse.help"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update.tests.core/.cvsignore b/update/org.eclipse.update.tests.core/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/update/org.eclipse.update.tests.core/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/.project b/update/org.eclipse.update.tests.core/.project
deleted file mode 100644
index cf6e950..0000000
--- a/update/org.eclipse.update.tests.core/.project
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.tests.core</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.xerces</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.help</project>
-		<project>org.eclipse.update.core</project>
-		<project>org.junit</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ui.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ui.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.ui.PluginNature</nature>
-		<nature>org.eclipse.team.cvs.core.cvsnature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.tests.core/about.html b/update/org.eclipse.update.tests.core/about.html
deleted file mode 100644
index 768324e..0000000
--- a/update/org.eclipse.update.tests.core/about.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<head>
-<title>About</title>
-<style type="text/css">
-p, table, td, th { font-family: arial, helvetica, geneva; font-size: 10pt}
-pre { font-family: "Courier New", Courier, mono; font-size: 10pt}
-h2 { font-family: arial, helvetica, geneva; font-size: 18pt; font-weight: bold ; line-height: 14px}
-code { font-family: "Courier New", Courier, mono; font-size: 10pt}
-sup { font-family: arial,helvetica,geneva; font-size: 10px}
-h3 { font-family: arial, helvetica, geneva; font-size: 14pt; font-weight: bold}
-li { font-family: arial, helvetica, geneva; font-size: 10pt}
-h1 { font-family: arial, helvetica, geneva; font-size: 28px; font-weight: bold}
-body { font-family: arial, helvetica, geneva; font-size: 10pt; clip: rect(   ); margin-top: 5mm; margin-left: 3mm}
-</style>
-</head>
-<body lang="EN-US" link="blue" vlink="purple">
-<table border="0" cellspacing="5" cellpadding="2" width="100%" >
-  <tr> 
-    <td align="LEFT" valign="TOP" colspan="2" bgcolor="#0080C0"><b><font color="#FFFFFF">About This Content</font></b></td>
-  </tr>
-  <tr> 
-    <td> 
-<p>11th December, 2001</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in &quot;Content&quot;.  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-<a href="http://www.eclipse.org/legal/cpl-v05.html">Common Public License Version 0.5</a> &quot;CPL&quot;.  For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL &quot;Other License&quot;, any modifications, enhancements and/or
-other code and/or documentation &quot;Modifications&quot; uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/build.properties b/update/org.eclipse.update.tests.core/build.properties
deleted file mode 100644
index a403b4b..0000000
--- a/update/org.eclipse.update.tests.core/build.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-source.updatetests.jar=src/
-bin.includes=*.jar,about.html,test.xml,plugin.xml,data/,webserver/
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/features/helpFeature.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/features/helpFeature.jar
deleted file mode 100644
index 9809713..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/features/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/features/org.eclipse.pde.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/features/org.eclipse.pde.feature_1.0.0.jar
deleted file mode 100644
index 62e46d6..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/features/org.eclipse.pde.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/install/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/install/features/feature3/feature.xml
deleted file mode 100644
index 760a926..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/install/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.core.tests.feature1.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="3.5.6" ws="WS_WIN32"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/Pde_core.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/help.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/junit_3.7.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index 7f05d82..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/helpFeature.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/helpFeature.jar
deleted file mode 100644
index 9809713..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/org.eclipse.pde.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/org.eclipse.pde.feature_1.0.0.jar
deleted file mode 100644
index 844a4d7..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/features/org.eclipse.pde.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/siteInfo.html b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/install/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/install/features/feature3/feature.xml
deleted file mode 100644
index 9722798..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/install/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="1.1.1" ws="WS_WIN32"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/Pde_core.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/help.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/junit_3.7.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index 7f05d82..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/site.xml b/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/site.xml
deleted file mode 100644
index 38e3575..0000000
--- a/update/org.eclipse.update.tests.core/data/ExecutableFeaturePackagedSite/data2/site.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="features/helpFeature.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features/org.eclipse.pde.feature_1.0.0.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <feature url="install/features/feature3/">
-    <category name="eclipse"/>
-  </feature>
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins/junit_3.7.jar"/>
-  <archive path="plugins/org.eclipse.update.plugin1_1.1.1.jar" url="plugins/org.eclipse.update.plugin1_1.1.1"/>  
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FTPLikeSite/site.xml b/update/org.eclipse.update.tests.core/data/FTPLikeSite/site.xml
deleted file mode 100644
index da62e2e..0000000
--- a/update/org.eclipse.update.tests.core/data/FTPLikeSite/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.tests.core.ftp">
-  <feature url="features/feature3/features2.jarfile"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/features/feature3/feature.xml
deleted file mode 100644
index 7832ef8..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0">
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="1.1.1" ws="WS_WIN32"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/site.xml b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/site.xml
deleted file mode 100644
index 486d119..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site1/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-  <feature url="features/feature3" type="org.eclipse.update.tests.core.feature1"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/features/feature3/features2.jarfile b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/features/feature3/features2.jarfile
deleted file mode 100644
index e8d004d..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/features/feature3/features2.jarfile
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/site.xml b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/site.xml
deleted file mode 100644
index fb5fe0e..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site2/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-  <feature url="features/feature3/features2.jarfile" type="org.eclipse.update.core.packaged"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/features/feature3/features2.jarfile b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/features/feature3/features2.jarfile
deleted file mode 100644
index e8d004d..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/features/feature3/features2.jarfile
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/site.xml b/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/site.xml
deleted file mode 100644
index daf372d..0000000
--- a/update/org.eclipse.update.tests.core/data/FeatureTypeExamples/site3/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-  <feature url="features/feature3/features2.jarfile" type="org.eclipse.update.core.unknowntype.jar"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/features space/helpFeature.jar b/update/org.eclipse.update.tests.core/data/Site with space/features space/helpFeature.jar
deleted file mode 100644
index 9809713..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/features space/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/features space/space feature.jar b/update/org.eclipse.update.tests.core/data/Site with space/features space/space feature.jar
deleted file mode 100644
index e5cb2d5..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/features space/space feature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/data/Site with space/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/data/Site with space/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/info/siteInfo.html b/update/org.eclipse.update.tests.core/data/Site with space/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/install/features space/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/Site with space/install/features space/feature3/feature.xml
deleted file mode 100644
index 9722798..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/install/features space/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="1.1.1" ws="WS_WIN32"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/Pde_core.jar b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/help.jar b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/junit_3.7.jar b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index 7f05d82..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/plugins space/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/Site with space/site.xml b/update/org.eclipse.update.tests.core/data/Site with space/site.xml
deleted file mode 100644
index 54928fb..0000000
--- a/update/org.eclipse.update.tests.core/data/Site with space/site.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="features space/helpFeature.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features space/space feature.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <feature url="install/features space/feature3/">
-    <category name="eclipse"/>
-  </feature>
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins space/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins space/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins space/junit_3.7.jar"/>
-  <archive path="plugins/org.eclipse.update.plugin1_1.1.1.jar" url="plugins space/org.eclipse.update.plugin1_1.1.1"/>  
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/features/feature3/features2.jarfile b/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/features/feature3/features2.jarfile
deleted file mode 100644
index e8d004d..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/features/feature3/features2.jarfile
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/site.xml b/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/site.xml
deleted file mode 100644
index 6f7165a..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteTypeExamples/site1/site.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.http">
-  <feature url="features/feature3/features2.jarfile"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/helpFeature.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/helpFeature.jar
deleted file mode 100644
index 9809713..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/org.eclipse.pde.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/org.eclipse.pde.feature_1.0.0.jar
deleted file mode 100644
index f592c1d..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/features/org.eclipse.pde.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/Pde_core.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/help.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/junit_3.7.jar b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/artifacts/plugins/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/siteInfo.html b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/site.xml b/update/org.eclipse.update.tests.core/data/SiteURLTest/data/site.xml
deleted file mode 100644
index e3ea684..0000000
--- a/update/org.eclipse.update.tests.core/data/SiteURLTest/data/site.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site url = "artifacts/">
-<description url="info/siteInfo.html"/>
-  <feature url="features/helpFeature.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features/org.eclipse.pde.feature_1.0.0.jar" type="org.eclipse.update.core.packaged">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins/junit_3.7.jar"/>
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/file1.zip b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/file1.zip
deleted file mode 100644
index 1a70b7e..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/file1.zip
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/install/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/install/features/feature3/feature.xml
deleted file mode 100644
index 6b454ec..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/install/features/feature3/feature.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0">
-	<install-handler handler="org.eclipse.update.core.DefaultInstallHandler"/>
-  	<data download-size="1500" id="file.zip" install-size="1000"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/site.xml b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/site.xml
deleted file mode 100644
index c41f21d..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site1/site.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="install/features/feature3">
-  </feature>
-  <archive path="features/org.eclipse.update.core.tests.feature3_1.0.0/file.zip" url="file1.zip"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/features/features3.jar b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/features/features3.jar
deleted file mode 100644
index 74c6eca..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/features/features3.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/non data/another file.zip b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/non data/another file.zip
deleted file mode 100644
index 1a70b7e..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/non data/another file.zip
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/site.xml b/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/site.xml
deleted file mode 100644
index 040943c..0000000
--- a/update/org.eclipse.update.tests.core/data/dataEntrySiteTest/site2/site.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="features/features3.jar" type="org.eclipse.update.core.packaged">
-  </feature>
-  <archive path="features/org.eclipse.update.core.tests.feature3_1.0.0/file.zip" url="non data/another file.zip"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/features/features2.jar b/update/org.eclipse.update.tests.core/data/features/features2.jar
deleted file mode 100644
index e8d004d..0000000
--- a/update/org.eclipse.update.tests.core/data/features/features2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/features/org.eclipse.test.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/data/features/org.eclipse.test.feature_1.0.0.jar
deleted file mode 100644
index 870a70d..0000000
--- a/update/org.eclipse.update.tests.core/data/features/org.eclipse.test.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/features/org.eclipse.update.core.tests.feature1_1.0.4.jar b/update/org.eclipse.update.tests.core/data/features/org.eclipse.update.core.tests.feature1_1.0.4.jar
deleted file mode 100644
index 9dc9463..0000000
--- a/update/org.eclipse.update.tests.core/data/features/org.eclipse.update.core.tests.feature1_1.0.4.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/features/org.eclipse_test_feature.jar b/update/org.eclipse.update.tests.core/data/features/org.eclipse_test_feature.jar
deleted file mode 100644
index 938ddc4..0000000
--- a/update/org.eclipse.update.tests.core/data/features/org.eclipse_test_feature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/install/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/install/features/feature3/feature.xml
deleted file mode 100644
index 987c818..0000000
--- a/update/org.eclipse.update.tests.core/data/install/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="1.1.1" ws="WS_WIN32"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/feature1.xml b/update/org.eclipse.update.tests.core/data/parsertests/feature1.xml
deleted file mode 100644
index 73d8b31..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/feature1.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-   id="org.eclipse.platform"
-   version="2.0.0"
-   label="Eclipse Platform"
-   provider-name="www.eclipse.org"
-   image="splash/splash_full.bmp"
-   >
-
-   <description>
-   Eclipse platform feature.
-   </description>
-
-   <copyright url="notice.html">
-   x
-	
-   <license url="about.html">
-   x
-   </license>
-
-   <url>
-      <update url="file:/D:/" label="Eclipse Update Site"/>
-   </url>
-
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/reddot.xml b/update/org.eclipse.update.tests.core/data/parsertests/reddot.xml
deleted file mode 100644
index b2e943f..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/reddot.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<site url="info/siteInfo.html">
-<feature url="features/reddot_1.0.0.jar"> 
-<category name="reddot"/>
-</feature>
-<feature url="features/reddot_2.0.0.jar">
-<category name="reddot"/>
-</feature>
-<archive path="com.reddot.redot_1.0.0" url="plugins/com.reddot.reddot_1.0.0.jar"/>
-<archive path="com.reddot.redot_2.0.0" url="plugins/com.reddot.reddot_2.0.0.jar"/>
-<category-def label="Red Dot Versions" name="reddot">
-<description url="RedDotVersions.html">
-This category contains all of the &lt;currently&gt; available versions of Red Dot feature.
-<![CDATA[<greeting>Hello, world!</greeting>]]>
-</description>
-</category-def>
-</site>
-
-
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/reddot1.xml b/update/org.eclipse.update.tests.core/data/parsertests/reddot1.xml
deleted file mode 100644
index 63fc6d9..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/reddot1.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<site url="info/siteInfo.html">
-<feature url="features/reddot_1.0.0.jar"> 
-<category name="reddot"/>
-</feature>
-<feature url="features/reddot_2.0.0.jar">
-<category name="reddot"/>
-</feature>
-<archive path="com.reddot.redot_1.0.0" url="plugins/com.reddot.reddot_1.0.0.jar"/>
-<archive path="com.reddot.redot_2.0.0" url="plugins/com.reddot.reddot_2.0.0.jar"/>
-<category-def label="Red Dot Versions" name="reddot">
-<description url="RedDotVersions.html">
-This category contains all of the &lt;currently&gt; available versions of Red Dot feature.
-</description>
-</category-def>
-</site>
-
-
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site.properties b/update/org.eclipse.update.tests.core/data/parsertests/site.properties
deleted file mode 100644
index 211986b..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-drivers=Required Drivers
-security=Security Fixes
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site.xml b/update/org.eclipse.update.tests.core/data/parsertests/site.xml
deleted file mode 100644
index b40d831..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site id="org.eclipse.update.core.tests" name="Tests" version="0.0.1" type="org.eclipse.update.core.file">
-  <handler>
-  	<boo class ="unknown"/>
-  </handler>
-  
-  <feature url="features/org.eclipse.test.feature_1.0.0.jar">
-    <category name="category1"/>
-  </feature>
-  
-  <feature url="features/features2.jar">
-    <category name="category1/subcat1"/>
-    <category name="category2"/>
-  </feature>
-  
-  <feature url="features/org.eclipse.update.core.tests.feature1_1.0.4.jar">
-    <category name="category1"/>
-    <category name="category2"/>
-    <blah/>
-  </feature>
-  
-  <feature url="features/org.eclipse_test_feature.jar"/>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-    <category name="category1"/>
-  </feature>
-  
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-  </feature>
-  
-  <archive path="plugins/hello" >
-  	<default/>
-  </archive>
-
-  <category-def name="category2" label="%security"/>
-  <category-def name="category1/subcat1" label="Special Fix"/>
-  <category-def name="category1" label="%drivers"/>  
-
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site2.xml b/update/org.eclipse.update.tests.core/data/parsertests/site2.xml
deleted file mode 100644
index 6ce133d..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site2.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-  <feature id="com.ibm.jdt" url="www.eclipse.org/feature3" version="1.0.0">
-    
-  </feature>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/site3.xml b/update/org.eclipse.update.tests.core/data/parsertests/site3.xml
deleted file mode 100644
index dbbb682..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/site3.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-  <feature id="com.ibm.jdt" url="feature3/feature.jar" version="1.0.0">
-        <category name="unknown"/>
-  </feature>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/parsertests/siteftp.xml b/update/org.eclipse.update.tests.core/data/parsertests/siteftp.xml
deleted file mode 100644
index f883ec0..0000000
--- a/update/org.eclipse.update.tests.core/data/parsertests/siteftp.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.tests.core.ftp">
-  <feature url="features/feature3/features2.jarfile"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar
deleted file mode 100644
index 0c995d5..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar
deleted file mode 100644
index 0c995d5..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar
deleted file mode 100644
index 78f193d..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
deleted file mode 100644
index 2275ade..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
deleted file mode 100644
index ea958c7..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index 7f05d82..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/install/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/install/features/feature3/feature.xml
deleted file mode 100644
index 3141af8..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/install/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="1.1.1" ws="WS_WIN32"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml b/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
deleted file mode 100644
index e01846c..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/src.jar b/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site1/plugins/org.eclipse.update.plugin1_1.1.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/install/features/feature3/feature.xml b/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/install/features/feature3/feature.xml
deleted file mode 100644
index 9c707ff..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/install/features/feature3/feature.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.core" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="2.0.0" ws="WS_WIN32"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/plugin.xml b/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/plugin.xml
deleted file mode 100644
index e01846c..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin1" version="3.5.6" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/src.jar b/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/reconciliationSites/site2/plugins/org.eclipse.update.core_2.0.0/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/resources.properties b/update/org.eclipse.update.tests.core/data/resources.properties
deleted file mode 100644
index 63efcee..0000000
--- a/update/org.eclipse.update.tests.core/data/resources.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-HTTP_PATH_1=/org.eclipse.update.tests.core.updatetests/UpdateManager2/
-HTTP_PATH_2=/org.eclipse.update.tests.core.updatetests/UpdateManager/
-HTTP_PATH_3=/org.eclipse.update.tests.core.updatetests/Site with space/
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/site.xml b/update/org.eclipse.update.tests.core/data/site.xml
deleted file mode 100644
index 76053b5..0000000
--- a/update/org.eclipse.update.tests.core/data/site.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site type="org.eclipse.update.core.file">
-<description url="info/siteInfo.html"/>
-  <feature url="install/features/feature3">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="http://www.eclipse.org/feature2">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <feature url="http://www.eclipse.org/feature1">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <archive path="plugins/org.eclipse.update.plugin1_1.1.1.jar" url="plugins/org.eclipse.update.plugin1_1.1.1"/>    
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>
-  <category-def label="Eclipse Tools" name="eclipse"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/site2/site.xml b/update/org.eclipse.update.tests.core/data/site2/site.xml
deleted file mode 100644
index 39d1c11..0000000
--- a/update/org.eclipse.update.tests.core/data/site2/site.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site url="Info.html" type="org.eclipse.update.core.file">
-  <feature url="features/feature1"/>
-  <archive path="org.eclipse.update.plugin1" url="plugins/plugin1"/>
-  <archive path="org.eclipse.update.archive2" url="plugins/plugin2"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/plugin.xml b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/plugin.xml
deleted file mode 100644
index 7f81c46..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin2" version="5.0.0" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/src.jar b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.0/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/plugin.xml b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/plugin.xml
deleted file mode 100644
index efb3c26..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/plugin.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin name="JUnit Test Framework" id="org.eclipse.update.core.tests.feature1.plugin2" version="5.0.1" vendor-name="junit.org">
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-    </library>
-  </runtime>
-</plugin>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/src.jar b/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/src.jar
deleted file mode 100644
index 2d4d609..0000000
--- a/update/org.eclipse.update.tests.core/data/siteTestLocalSite/plugins/feature1_plugin2_5.0.1/src.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse.test.feature_1.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse.test.feature_1.0.0/feature.xml
deleted file mode 100644
index 1511800..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse.test.feature_1.0.0/feature.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.test1.ident1" label="Feature One" nl="en_us,fr,de" os="OS_WIN32,OS_LINUX" provider-name="Object Technology International" version="1.0.0" ws="WS_WIN32,WS_MOTIF,WS_GTK">
-  <description>Test feature for testIdentifier test</description>
-  <copyright>Copyright (c) the company</copyright>
-  <license>Do you accept the license ?</license>
-  <url>
-    <update label="URL to update teh feature" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.core.tests.feature1.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="3.5.6" ws="WS_WIN32"/>
-  <plugin download-size="1200" id="org.eclipse.update.core.tests.feature1.plugin2" install-size="978" fragment="false" version="5.0.0"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse_test_feature/feature.xml b/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse_test_feature/feature.xml
deleted file mode 100644
index 9f05cda..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/apitests/org.eclipse_test_feature/feature.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.test1.ident2" label="Feature One" nl="en_us,fr,de" os="OS_WIN32,OS_LINUX" provider-name="Object Technology International" version="1.0.0" ws="WS_WIN32,WS_MOTIF,WS_GTK">
-  <description>Test feature for testIdentifier test</description>
-  <copyright>Copyright (c) the company</copyright>
-  <license>Do you accept the license ?</license>
-  <url>
-    <update label="URL to update teh feature" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" url="org.eclipse.update.core.tests.feature1.plugin1" id="org.eclipse.update.core.tests.feature1.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="3.5.6" ws="WS_WIN32"/>
-  <plugin download-size="1200" id="org.eclipse.update.core.tests.feature1.plugin2" install-size="978" fragment="false" version="5.0.0"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature.xml b/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature.xml
deleted file mode 100644
index c4ee139..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature1" image="feature1.gif" label="Feature One" nl="en,fr,de" os="OS_WIN32,OS_LINUX" provider-name="Object Technology International" version="1.0.4" ws="WS_WIN32,WS_MOTIF,WS_GTK">
-  <description>I believe this is the description of feature 1, well, feature 1 is an exceptional feature that you should install right NOW on your machine... try it.</description>
-  <copyright>Ok, now, this is a very very complex Copyright  not prepared by a lawyer Copyright (c) the company</copyright>
-  <license>#1 Do you accept it #2 you do nto accept it ...Do you accpt it ?</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-  <plugin download-size="1500" id="org.eclipse.update.core.tests.feature1.plugin1" install-size="1000" fragment="false" nl="us" os="OS_WIN32" version="3.5.6" ws="WS_WIN32"/>
-  <plugin download-size="1200" id="org.eclipse.update.core.tests.feature1.plugin2" install-size="978" fragment="false" version="5.0.0"/>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature1.gif b/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature1.gif
deleted file mode 100644
index 03e30a2..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/feature_1.0.0/feature1.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/data/xmls/site1/site.xml b/update/org.eclipse.update.tests.core/data/xmls/site1/site.xml
deleted file mode 100644
index 62c8a65..0000000
--- a/update/org.eclipse.update.tests.core/data/xmls/site1/site.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site url="info/siteInfo.html" type="org.eclipse.update.core.file">
-  <feature id="org.isv.feature3" url="www.eclipse.org/feature3" version="3.4.5">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature id="org.eclipse.update.core.tests.feature2" url="www.eclipse.org/feature2" version="3.4.6">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <feature id="org.eclipse.update.core.tests.fature1" url="www.eclipse.org/feature1" version="2.3.5">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <archive path="org.eclipse.update.plugin1" url="www.eclipse.org/pluign1"/>
-  <archive path="org.eclipse.update.archive2" url="www.eclipse.org/plugin2"/>
-  <archive path="org.eclipse.update.plugin3" url="www.eclipse.org/plugin3"/>
-  <archive path="org.eclipse.unknown.plugin" url="www.eclipse.org/plugins/plugin4"/>
-  <archive path="org.eclipse.update.core.tests.feature1.foo1" url="www.eclipse.org/plugin1"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>
-  <category-def label="Eclipse tools" name="eclipse"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/plugin.properties b/update/org.eclipse.update.tests.core/plugin.properties
deleted file mode 100644
index 5f37ffc..0000000
--- a/update/org.eclipse.update.tests.core/plugin.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-
-name = Install/Update Core Tests
-provider-name = International Business Machines Corp.
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/plugin.xml b/update/org.eclipse.update.tests.core/plugin.xml
deleted file mode 100644
index 277ca00..0000000
--- a/update/org.eclipse.update.tests.core/plugin.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.update.tests.core"
-   name="%name"
-   version="0.0.1"
-   provider-name="%provider-name"
-   class="org.eclipse.update.tests.UpdateTestsPlugin">
-
-<runtime>
-   <library name="updatetests.jar">
-      <export name="*"/>
-   </library>
-</runtime>
-<requires>
-   <import plugin="org.eclipse.core.runtime"/>
-   <import plugin="org.junit"/> 
-   <import plugin="org.apache.xerces"/>
-   <import plugin="org.eclipse.core.resources"/>
-   <import plugin="org.eclipse.update.core"/>
-   <import plugin="org.eclipse.help"/>
-</requires>
-
-
-<extension
-      id="feature1"
-      point="org.eclipse.update.core.featureTypes">
-   <feature-factory
-         class="org.eclipse.update.internal.core.FeatureExecutableFactory">
-   </feature-factory>
-</extension>
-<extension
-      id="ftp"
-      point="org.eclipse.update.core.siteTypes">
-   <site-factory
-         class="org.eclipse.update.tests.implementation.SiteFTPFactory">
-   </site-factory>
-</extension>
-
-</plugin>
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/AllTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/AllTests.java
deleted file mode 100644
index ef83c65..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/AllTests.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.eclipse.update.tests;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.eclipse.update.tests.api.AllAPITests;
-import org.eclipse.update.tests.configurations.AllConfigurationsTests;
-import org.eclipse.update.tests.core.boot.AllPlatformConfigurationTests;
-import org.eclipse.update.tests.model.AllModelTests;
-import org.eclipse.update.tests.parser.AllParserTests;
-import org.eclipse.update.tests.reconciliation.AllReconciliationTests;
-import org.eclipse.update.tests.regularInstall.AllRegularInstallTests;
-import org.eclipse.update.tests.regularRemove.AllRegularRemoveTests;
-import org.eclipse.update.tests.types.AllTypesTests;
-import org.eclipse.update.tests.uivalues.AllCoreUITests;
-
-public class AllTests extends TestSuite {
-	public AllTests(String name) {
-		super(name);
-	}
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("All Update Manager Tests");
-		suite.addTest(AllPlatformConfigurationTests.suite());
-		suite.addTest(AllRegularInstallTests.suite());
-		suite.addTest(AllAPITests.suite());
-		suite.addTest(AllModelTests.suite());
-		suite.addTest(AllParserTests.suite());
-		suite.addTest(AllCoreUITests.suite());
-		suite.addTest(AllConfigurationsTests.suite());
-		suite.addTest(AllTypesTests.suite());
-		suite.addTest(AllRegularRemoveTests.suite());	
-		//suite.addTest(AllReconciliationTests.suite());					
-		return suite;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateManagerTestCase.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateManagerTestCase.java
deleted file mode 100644
index 3731f82..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateManagerTestCase.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package org.eclipse.update.tests;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.File;
-import java.io.IOException;
-import java.net.*;
-import java.util.*;
-
-import junit.framework.TestCase;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.update.internal.core.UpdateManagerPlugin;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-/**
- * All Help System Test cases must subclass this base Testcase.
- * See SampleTestCase.java for a template.
- */
-
-public abstract class UpdateManagerTestCase extends TestCase {
-
-	protected static ResourceBundle bundle;
-	protected static String dataPath;
-
-	protected static URL SOURCE_FILE_SITE;
-	protected static URL SOURCE_HTTP_SITE;
-	protected static URL TARGET_FILE_SITE;
-
-	private static final String DATA_PATH = "data/";
-
-	/**
-	 * Default Constructor
-	 */
-	public UpdateManagerTestCase(String name) {
-		super(name);
-		try {
-			init();
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-	}
-
-	protected static void init() throws MissingResourceException, IOException, MalformedURLException {
-
-		IPluginDescriptor dataDesc = Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.update.tests.core");
-		URL resolvedURL = Platform.resolve(dataDesc.getInstallURL());
-		URL dataURL = new URL(resolvedURL,DATA_PATH);
-		dataPath = dataURL.getFile();
-		String homePath = (System.getProperty("user.home")).replace(File.separatorChar,'/');
-
-		if (bundle == null) {
-			ClassLoader l = new URLClassLoader(new URL[] { dataURL }, null);
-			bundle = ResourceBundle.getBundle("resources", Locale.getDefault(), l);
-		}
-
-		try {
-			SOURCE_FILE_SITE = new File(dataPath).toURL();
-			SOURCE_HTTP_SITE = new URL("http", getHttpHost(),getHttpPort(), bundle.getString("HTTP_PATH_1"));
-			TARGET_FILE_SITE = new URL("file",null, homePath +"/target/");
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-
-		//cleanup target 
-		File target = new File(homePath + "/target/");
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-	}
-
-	/**
-	 * Simple implementation of setUp. Subclasses are prevented 
-	 * from overriding this method to maintain logging consistency.
-	 * umSetUp() should be overriden instead.
-	 */
-	protected final void setUp() throws Exception {
-		System.out.println("----- " + this.getName());
-		System.out.println(this.getName() + ": setUp...");
-		umSetUp();
-	}
-
-	/**
-	 * Sets up the fixture, for example, open a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected void umSetUp() throws Exception {
-		// do nothing.
-	}
-
-	/**
-	 * Simple implementation of tearDown.  Subclasses are prevented 
-	 * from overriding this method to maintain logging consistency.
-	 * umTearDown() should be overriden instead.
-	 */
-	protected final void tearDown() throws Exception {
-		System.out.println(this.getName() + ": tearDown...\n");
-		umTearDown();
-	}
-
-	/**
-	 * Tears down the fixture, for example, close a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected void umTearDown() throws Exception {
-		// do nothing.
-	}
-
-	protected static String getHttpHost(){
-		return UpdateTestsPlugin.getWebAppServerHost();
-	}
-
-	protected static int getHttpPort(){
-		return UpdateTestsPlugin.getWebAppServerPort();
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateTestsPlugin.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateTestsPlugin.java
deleted file mode 100644
index 08dea26..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/UpdateTestsPlugin.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.eclipse.update.tests;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.core.runtime.*;
-import org.eclipse.help.AppServer;
-import org.eclipse.help.IAppServer;
-import org.eclipse.update.internal.core.UpdateManagerPlugin;
-
-/**
- * manages the startuo and shutown of the 
- * web server
- */
-public class UpdateTestsPlugin extends Plugin {
-
-	private static String appServerHost = null;
-	private static int appServerPort = 0;
-	private static UpdateTestsPlugin plugin;
-
-	public UpdateTestsPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		plugin = this;
-	}
-
-	public static UpdateTestsPlugin getPlugin(){
-		return plugin;
-	}
-
-	/**
-	 * Called by Platform after loading the plugin
-	 */
-	public void startup() throws CoreException {
-		boolean result = AppServer.add("org.eclipse.update.tests.core.updatetests", "org.eclipse.update.tests.core", "webserver");		
-		appServerHost = AppServer.getHost();
-		appServerPort = AppServer.getPort();
-		
-		String text = "The webServer ";
-		text += (result)?"did":"didn't";
-		text+= " start ip:"+getWebAppServerHost()+":"+getWebAppServerPort();
-		
-		System.out.println(text);
-		if (!result) {
-			IStatus status = new Status(IStatus.ERROR,"org.eclipse.update.tests.core",IStatus.OK,"WebServer not started. Update Tests results are invalid",null);
-			throw new CoreException(status);
-		}
-	}
-
-	/**
-	 * Shuts down this plug-in and discards all plug-in state.
-	 * @exception CoreException if this method fails to shut down
-	 *   this plug-in 
-	 */
-	public void shutdown() throws CoreException {
-		AppServer.remove("updatetests", "org.eclipse.update.tests.core");				
-		super.shutdown();		
-	}
-
-	/**
-	 * Returns the host identifier for the web app server
-	 */
-	public static String getWebAppServerHost() {
-		return appServerHost;
-	}
-
-	/**
-	 * Returns the port identifier for the web app server
-	 */
-	public static int getWebAppServerPort() {
-		return appServerPort;
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/AllAPITests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/AllAPITests.java
deleted file mode 100644
index 96ec32d..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/AllAPITests.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.update.core.SiteManager;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import java.io.File;
-import junit.framework.*;
-
-/**
- * Manages the API tests
- */
-public class AllAPITests extends UpdateManagerTestCase {
-	/**
-	 * Constructor
-	 */
-	public AllAPITests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * List of API tests
-	 */
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("API Tests");
-
-		suite.addTest(new TestSuite(TestSiteAPI.class));
-		suite.addTest(new TestSuite(TestLocalSiteAPI.class));		
-		suite.addTest(new TestSuite(TestUpdateManagerUtilsAPI.class));		
-		suite.addTest(new TestSuite(TestDefaultExecutableFeatureAPI.class));
-		suite.addTest(new TestSuite(TestDefaultPackageFeatureAPI.class));
-		suite.addTest(new TestSuite(TestPluginContainerAPI.class));
-		suite.addTest(new TestSuite(TestSiteManagerAPI.class));		
-
-		return suite;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/DefaultFeature.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/DefaultFeature.java
deleted file mode 100644
index 51c26d5..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/DefaultFeature.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.internal.core.FeatureExecutableContentProvider;
-/**
- * Abstract Class that implements most of the behavior of a feature
- * A feature ALWAYS belongs to an ISite
- */
-public class DefaultFeature extends Feature {
-
-
-	/**
-	 * Copy constructor
-	 */
-	public DefaultFeature(IFeature sourceFeature, ISite targetSite) throws CoreException {
-		this(targetSite);
-		this.setFeatureContentProvider(sourceFeature.getFeatureContentProvider());
-		this.setIdentifier(sourceFeature.getVersionedIdentifier());
-		this.setLabel(sourceFeature.getLabel());
-		this.setUpdateSiteEntry(sourceFeature.getUpdateSiteEntry());
-		this.setDiscoverySiteEntries(sourceFeature.getDiscoverySiteEntries());
-		this.setProvider(sourceFeature.getProvider());
-		this.setDescription(sourceFeature.getDescription());
-		this.setCopyright(sourceFeature.getCopyright());
-		this.setLicense(sourceFeature.getLicense());
-		this.setPluginEntries(sourceFeature.getPluginEntries());
-		this.setImage(sourceFeature.getImage());
-	}
-	
-	/**
-	 * Constructor
-	 */
-	public DefaultFeature(ISite targetSite) throws CoreException {
-		super();
-		this.setSite(targetSite);		
-	}	
-	
-	
-	/**
-	 * Sets the identifier
-	 * @param identifier The identifier to set
-	 */
-	public void setIdentifier(VersionedIdentifier identifier) {
-		setFeatureIdentifier(identifier.getIdentifier());
-		setFeatureVersion(identifier.getVersion().toString());
-	}
-
-	/**
-	 * Sets the discoverySiteEntries
-	 * @param discoveryInfos The discoveryInfos to set
-	 */
-	public void setDiscoverySiteEntries(IURLEntry[] discoveryInfos) {
-		setDiscoverySiteEntryModels((URLEntryModel[]) discoveryInfos);
-	}
-
-	/**
-	 * Sets the updateSiteEntry
-	 * @param updateInfo The updateInfo to set
-	 */
-	public void setUpdateSiteEntry(IURLEntry updateInfo) {
-		setUpdateSiteEntryModel((URLEntryModel) updateInfo);
-	}
-
-	/**
-	 * Adds a discoveryInfo
-	 * @param discoveryInfo The discoveryInfo to add
-	 */
-	public void addDiscoverySiteEntry(IURLEntry discoveryInfo) {
-		addDiscoverySiteEntryModel((URLEntryModel) discoveryInfo);
-	}
-
-	/**
-	 * Sets the description
-	 * @param description The description to set
-	 */
-	public void setDescription(IURLEntry description) {
-		setDescriptionModel((URLEntryModel) description);
-	}
-
-	/**
-	 * Sets the copyright
-	 * @param copyright The copyright to set
-	 */
-	public void setCopyright(IURLEntry copyright) {
-		setCopyrightModel((URLEntryModel) copyright);
-	}
-
-	/**
-	 * Sets the license
-	 * @param license The license to set
-	 */
-	public void setLicense(IURLEntry license) {
-		setLicenseModel((URLEntryModel) license);
-	}
-
-	/**
-	 * Sets the image
-	 * @param image The image to set
-	 */
-	public void setImage(URL image) {
-		setImageURLString(image.toExternalForm());
-	}
-
-	/**
-	 * Adds an import
-	 * @param anImport The import to add
-	 */
-	public void addImport(IImport anImport) {
-		if (anImport != null) {
-			addImportModel((ImportModel) anImport);
-		}
-	}
-
-
-	/**
-	 * Sets the pluginEntries
-	 * @param pluginEntries The pluginEntries to set
-	 */
-	public void setPluginEntries(IPluginEntry[] pluginEntries) {
-		if (pluginEntries != null) {
-			for (int i = 0; i < pluginEntries.length; i++) {
-				addPluginEntry(pluginEntries[i]);
-			}
-		}
-	}
-
-
-	/**
-	 * sets teh URL isf not already present
-	 */
-	public void setURL(URL url) throws CoreException{
-		//if (getFeatureContentProvider()==null){
-			FeatureContentProvider contentProvider = new FeatureExecutableContentProvider(url);
-			this.setFeatureContentProvider(contentProvider);
-			contentProvider.setFeature(this);
-		//}
-	}
-	
-	
-	/*
-	 * @see IPluginContainer#addPluginEntry(IPluginEntry)
-	 */
-	public void addPluginEntry(IPluginEntry pluginEntry) {
-		if (pluginEntry != null) {
-			addPluginEntryModel((PluginEntryModel) pluginEntry);
-		}
-	}
-
-	/*
-	 * @see IFeature#addNonPluginEntry(INonPluginEntry)
-	 */
-	public void addNonPluginEntry(INonPluginEntry dataEntry) {
-		if (dataEntry != null) {
-			addNonPluginEntryModel((NonPluginEntryModel) dataEntry);
-		}
-	}	
-
-	}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/MyURLEntry.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/MyURLEntry.java
deleted file mode 100644
index 3b6de73..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/MyURLEntry.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.update.core.URLEntry;
-
-/**
- * Wrapper around URLEntry
- */
-public class MyURLEntry extends URLEntry {
-	
-	public MyURLEntry(String annotation, URL url) throws MalformedURLException {
-		super();
-		setAnnotation(annotation);
-		if (url!=null) {
-			setURLString(url.toExternalForm());
-			resolve(null,null);
-		}
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultExecutableFeatureAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultExecutableFeatureAPI.java
deleted file mode 100644
index 23c54b3..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultExecutableFeatureAPI.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.FeatureReference;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-
-public class TestDefaultExecutableFeatureAPI extends UpdateManagerTestCase {
-	
-	private DefaultFeature remoteFeature=null;
-	
-	/**
-	 * Test the testFeatures()
-	 */
-	public TestDefaultExecutableFeatureAPI(String arg0) {
-		super(arg0);
-	}
-	
-	/**
-	 * the feature to test
-	 */
-	private DefaultFeature getFeature() throws MalformedURLException, CoreException {
-		if (remoteFeature == null){
-
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE);
-		URL url = UpdateManagerUtils.getURL(site.getURL(),Site.DEFAULT_INSTALLED_FEATURE_PATH+"feature3/",null);
-		FeatureReference ref = new FeatureReference();
-		ref.setSite(site);
-		ref.setURL(url);
-		IFeature feature = ref.getFeature();
-		remoteFeature = new DefaultFeature(feature,site);
-
-		}
-		return remoteFeature;
-	}
-	
-	/**
-	 * @see IFeature#testIdentifier()
-	 */
-	public void testIdentifier() throws CoreException, MalformedURLException {
-		String id1 = "xmls/apitests/org.eclipse.test.feature_1.0.0/";
-		String id2 = "xmls/apitests/org.eclipse_test_feature";
-		VersionedIdentifier ident1 = new VersionedIdentifier("org.test1.ident1","1.0.0");
-		VersionedIdentifier ident2 = new VersionedIdentifier("org.test1.ident2","1.0.0");		
-		
-
-			ISite site = SiteManager.getSite(SOURCE_FILE_SITE);
-			
-			URL url1 = UpdateManagerUtils.getURL(site.getURL(),id1,null);			
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(url1);
-			remoteFeature.setIdentifier(ident1);
-			assertEquals(ident1.toString(),remoteFeature.getVersionedIdentifier().toString());
-	 	
-			 URL url2 = UpdateManagerUtils.getURL(site.getURL(),id2,null);		
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(url2);
-			remoteFeature.setIdentifier(ident2);
-			assertEquals(ident2.toString(),remoteFeature.getVersionedIdentifier().toString());
-		
-
-	}
-
-
-	/**
-	 * @see IFeature#testSite()
-	 */
-	public void testSite() throws MalformedURLException, CoreException{
-		String ident1 = Site.DEFAULT_INSTALLED_FEATURE_PATH+"feature3/";		
-
-			ISite site = SiteManager.getSite(SOURCE_FILE_SITE);
-			
-			URL id = UpdateManagerUtils.getURL(site.getURL(),ident1,null);			
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(id);
-			assertEquals(site,remoteFeature.getSite());
-
-	}
-
-
-	/**
-	 * @see IFeature#testLabel()
-	 */
-	public void testLabel() throws CoreException,MalformedURLException {
-		String label = "dummy label";
-		Feature feature = getFeature();
-		feature.setLabel(label);
-		assertEquals(label,feature.getLabel());
-	}
-
-
-	/**
-	 * @see IFeature#testUpdateURL()
-	 */
-	public void testUpdateURL() throws CoreException,MalformedURLException {
-		URL url = null;
-		String label = "OTI Site";
-		try {
-			url = new URL("http://www.oti.com/");
-			
-		} catch (java.net.MalformedURLException e){} // impossible eh !
-		DefaultFeature feature = getFeature();
-		feature.setUpdateSiteEntry(new MyURLEntry(label, url));
-		assertEquals(url,feature.getUpdateSiteEntry().getURL());
-		assertEquals(label,feature.getUpdateSiteEntry().getAnnotation());
-
-	} 
-
-
-	
-	/**
-	 * @see IFeature#testDiscoveryURLs()
-	 */
-	public void testDiscoveryURLs() throws CoreException,MalformedURLException {
-		IURLEntry[] urlInfo = new MyURLEntry[2];
-		URL[] url = new URL[2];
-		String[] label = new String[2];
-		try {
-			url[0] = new URL("http://www.oti.com/");
-			url[1] = new URL("http://eclipse.org/");
-			label[0] = "OTI Site";
-			label[1] = "Eclipse Site";
-		} catch (java.net.MalformedURLException e){} // impossible eh !
-		DefaultFeature feature = getFeature();
-		for (int i=0;i<2;i++){
-				urlInfo[i] = new MyURLEntry(label[i],url[i]);
-		}
-		feature.setDiscoverySiteEntries(urlInfo);
-		for (int i=0; i<feature.getDiscoverySiteEntries().length;i++){
-			assertEquals(urlInfo[i],feature.getDiscoverySiteEntries()[i]);
-		}
-
-	}
-
-
-	/**
-	 * @see IFeature#testProvider()
-	 */
-	public void testProvider() throws CoreException,MalformedURLException {
-		String provider = "not so dummy provider";
-		IFeature feature = getFeature();
-		((Feature)feature).setProvider(provider);
-		assertEquals(provider,feature.getProvider());
-	}
-
-
-	/**
-	 * @see IFeature#testDescription()
-	 */
-	public void testDescription() throws CoreException,MalformedURLException {
-		String desc = "pretty long description as a string with \r\n and \t and \n";
-		IURLEntry info = new MyURLEntry(desc,null);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(desc,feature.getDescription().getAnnotation());
-	}
-	
-	/**
-	 * @see IFeature#testDescription()
-	 */
-	public void testDescription1() throws CoreException, MalformedURLException {
-		URL url = null;
-		try {
-			url = new URL("http://www.oti.com");
-		} catch (MalformedURLException e){/*pretty impossible*/}
-		IURLEntry info = new MyURLEntry(null,url);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(url,feature.getDescription().getURL());
-	}	
-	
-	/**
-	 * @see IFeature#testDescription()
-	 */
-	public void testDescription2() throws CoreException, MalformedURLException {
-		
- 	 URL url = null;
-		try {
-			url = new URL("http://www.oti.com");
-		} catch (MalformedURLException e){/*pretty impossible*/}
-		String desc = "pretty long description as a string with \r\n and \t and \n";
-		IURLEntry info = new MyURLEntry(desc,url);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		String result = feature.getDescription().getAnnotation();
-		assertEquals(desc,result);
-		assertEquals(url,feature.getDescription().getURL());
-	}	
-
-
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultPackageFeatureAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultPackageFeatureAPI.java
deleted file mode 100644
index 214f28d..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestDefaultPackageFeatureAPI.java
+++ /dev/null
@@ -1,195 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-
-
-public class TestDefaultPackageFeatureAPI extends UpdateManagerTestCase {
-	
-	private	DefaultFeature remoteFeature=null;
-	
-	/**
-	 * Test the testFeatures()
-	 */
-	public TestDefaultPackageFeatureAPI(String arg0) {
-		super(arg0);
-	}
-	
-	/**
-	 * the feature to test
-	 */
-	private DefaultFeature getFeature() throws MalformedURLException, CoreException {
-		if (remoteFeature == null){
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE);
-		URL id = UpdateManagerUtils.getURL(site.getURL(),"org.eclipse.update.core.feature1_1.0.0.jar",null);	
-		remoteFeature = new DefaultFeature(site);
-		remoteFeature.setURL(id);
-		}
-		return remoteFeature;
-	}
-	
-	/**
-	 * @see IFeature#testIdentifier()
-	 */
-	public void testIdentifier() throws CoreException, MalformedURLException {
-		
-		String id1 = "features/org.eclipse.test.feature_1.0.0.jar";
-		String id2 = "features/org.eclipse_test_feature.jar";
-		VersionedIdentifier ident1 = new VersionedIdentifier("org.test1.ident1","1.0.0");
-		VersionedIdentifier ident2 = new VersionedIdentifier("org.test1.ident2","1.0.0");		
-		
-
-			ISite site = SiteManager.getSite(SOURCE_FILE_SITE);
-			
-			URL url1 = UpdateManagerUtils.getURL(site.getURL(),id1,null);			
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(url1);
-			remoteFeature.setIdentifier(ident1);
-			assertEquals(ident1.toString(),remoteFeature.getVersionedIdentifier().toString());
-		
-			 URL url2 = UpdateManagerUtils.getURL(site.getURL(),id2,null);		
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(url2);
-			remoteFeature.setIdentifier(ident2);			
-			assertEquals(ident2.toString(),remoteFeature.getVersionedIdentifier().toString());
-	}
-
-
-	/**
-	 * @see IFeature#testSite()
-	 */
-	public void testSite() throws MalformedURLException, CoreException {
-		String ident1 = "org.eclipse.test.feature_1.0.0.jar";		
-
-			ISite site = SiteManager.getSite(SOURCE_FILE_SITE);
-			
-			URL id = UpdateManagerUtils.getURL(site.getURL(),ident1,null);		
-			remoteFeature = new DefaultFeature(site);
-			remoteFeature.setURL(id);	
-			assertEquals(site,remoteFeature.getSite());
-
-	}
-
-
-	/**
-	 * @see IFeature#testLabel()
-	 */
-	public void testLabel() throws CoreException, MalformedURLException {
-		String label = "dummy label";
-		Feature feature = getFeature();
-		feature.setLabel(label);
-		assertEquals(label,feature.getLabel());
-	}
-
-
-	/**
-	 * @see IFeature#testUpdateURL()
-	 */
-	public void testUpdateURL() throws CoreException, MalformedURLException {
-		URL url = null;
-		String label = "OTI Site";
-		try {
-			url = new URL("http://www.oti.com/");
-			
-		} catch (java.net.MalformedURLException e){} // impossible eh !
-		DefaultFeature feature = getFeature();
-		feature.setUpdateSiteEntry(new MyURLEntry(label, url));
-		assertEquals(url,feature.getUpdateSiteEntry().getURL());
-		assertEquals(label,feature.getUpdateSiteEntry().getAnnotation());
-
-	} 
-
-
-	
-	/**
-	 * @see IFeature#testDiscoveryURLs()
-	 */
-	public void testDiscoveryURLs() throws CoreException, MalformedURLException {
-		IURLEntry[] urlInfo = new URLEntry[2];
-		URL[] url = new URL[2];
-		String[] label = new String[2];
-		try {
-			url[0] = new URL("http://www.oti.com/");
-			url[1] = new URL("http://eclipse.org/");
-			label[0] = "OTI Site";
-			label[1] = "Eclipse Site";
-		} catch (java.net.MalformedURLException e){} // impossible eh !
-		DefaultFeature feature = getFeature();
-		for (int i=0;i<2;i++){
-				urlInfo[i] = new MyURLEntry(label[i],url[i]);
-		}
-		feature.setDiscoverySiteEntries(urlInfo);
-		for (int i=0; i<feature.getDiscoverySiteEntries().length;i++){
-			assertEquals(urlInfo[i],feature.getDiscoverySiteEntries()[i]);
-		}
-
-
-	}
-
-
-	/**
-	 * @see IFeature#testProvider()
-	 */
-	public void testProvider() throws CoreException, MalformedURLException {
-		String provider = "not so dummy provider";
-		Feature feature = getFeature();
-		feature.setProvider(provider);
-		assertEquals(provider,feature.getProvider());
-	}
-
-
-	/**
-	 * @see IFeature#testDescription()
-	 */
-	public void testDescription() throws CoreException, MalformedURLException {
-		String desc = "pretty long description as a string with \r\n and \t and \n";
-		IURLEntry info = new MyURLEntry(desc,null);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(desc,feature.getDescription().getAnnotation());
-	}
-	
-	/**
-	 * @see IFeature#testDescription()
-	 */
-	public void testDescription1() throws CoreException, MalformedURLException {
-		URL url = null;
-		try {
-			url = new URL("http://www.oti.com");
-		} catch (MalformedURLException e){/*pretty impossible*/}
-		IURLEntry info = new MyURLEntry(null,url);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(url,feature.getDescription().getURL());
-	}	
-	
-	/**
-	 * @see IFeature#testDescription()
-	 */
-	public void testDescription2() throws CoreException, MalformedURLException {
-		
-		URL url = null;
-		try {
-			url = new URL("http://www.oti.com");
-		} catch (MalformedURLException e){/*pretty impossible*/}
-		String desc = "pretty long description as a string with \r\n and \t and \n";
-		IURLEntry info = new MyURLEntry(desc,url);
-		DefaultFeature feature = getFeature();
-		feature.setDescription(info);
-		assertEquals(desc,feature.getDescription().getAnnotation());
-		assertEquals(url,feature.getDescription().getURL());
-	}
-
-
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestLocalSiteAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestLocalSiteAPI.java
deleted file mode 100644
index 3cf093b..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestLocalSiteAPI.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.ICategory;
-import org.eclipse.update.core.Category;
-import org.eclipse.update.core.model.CategoryModel;
-import org.eclipse.update.core.model.SiteModel;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.core.FeatureReference;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestLocalSiteAPI extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestLocalSiteAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testFileParsing() throws Exception {
-
-		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE,"siteTestLocalSite/"));
-		IArchiveReference[] info = site.getArchives();
-		
-		if (info.length<=0){
-			fail("no plugins in site: "+site.getURL().toExternalForm());
-		}
-		 
-		boolean found1 = false;
-		boolean found2 = false;
-		String name1= "plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar";
-		String name2 = "plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.1.jar";
-		
-		for (int i =0; i<info.length; i++){
-			if (info[i].getPath().equals(name1)) found1 = true;
-			if (info[i].getPath().equals(name2)) found2 = true;
-		}
-		
-		if (!found1 || !found2){
-			fail("Cannot find plugin : org.eclipse.update.core.tests.feature1.plugin2 version 5.0.0 and 5.0.1 on the site, by parsing file system");
-		}
-		
-
-	}
-	
-	
-	public void testCategories() throws Exception {
-
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE);
-		
-		ICategory category = new Category("category","Label of category");
-		
-		((SiteModel)site).addCategoryModel((CategoryModel)category);
-		
-		ICategory[] categories = site.getCategories();
-		boolean found = false;
-		for (int index = 0; index < categories.length; index++) {
-			ICategory element = categories[index];
-			if (element.getName().equals("category")) found = true;
-		}
-		if (!found) fail("cannot find category 'category' in site");
-
-		IFeatureReference ref = new FeatureReference();
-		ref.setSite(site);
-		ref.addCategory(category);		
-		categories = ref.getCategories();
-		found = false;
-		for (int index = 0; index < categories.length; index++) {
-			ICategory element = categories[index];
-			if (element.getName().equals("category")) found = true;
-		}
-		if (!found) fail("cannot find category 'category' in feature");
-		
-			}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestPluginContainerAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestPluginContainerAPI.java
deleted file mode 100644
index 988363c..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestPluginContainerAPI.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestPluginContainerAPI extends UpdateManagerTestCase {
-
-	private Site site;
-	private DefaultFeature feature;
-
-	/**
-	 * the Site to test
-	 */
-	private Site getSite() throws CoreException {
-		if (site == null) {
-
-			site = (Site)SiteManager.getSite(SOURCE_FILE_SITE);
-
-		}
-		return site;
-	}
-
-	/**
-	 * the feature to test
-	 */
-	private DefaultFeature getFeature() throws MalformedURLException, CoreException {
-		if (feature == null) {
-			ISite site = getSite();
-			URL id = UpdateManagerUtils.getURL(site.getURL(),"org.eclipse.update.core.feature1_1.0.0.jar",null);						
-			feature = new DefaultFeature(site);
-			feature.setURL(id);	
-		}
-		return feature;
-	}
-
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestPluginContainerAPI(String arg0) throws CoreException {
-		super(arg0);
-	}
-
-	public void testAbstractFeature() throws CoreException, MalformedURLException {
-		PluginEntry pluginEntry = new PluginEntry();
-		pluginEntry.setVersionedIdentifier(new VersionedIdentifier("id", "ver"));
-		Feature _feature = getFeature();
-		((DefaultFeature)_feature).addPluginEntry(pluginEntry);
-		assertEquals(_feature.getPluginEntryCount(), 1);
-		assertEquals(_feature.getPluginEntries()[0], pluginEntry);
-
-	}
-
-	public void testAbstactSite() throws CoreException {
-		PluginEntry pluginEntry = new PluginEntry();
-		pluginEntry.setVersionedIdentifier(new VersionedIdentifier("id", "ver"));
-		Site _site = getSite();
-		_site.addPluginEntry(pluginEntry);
-		assertEquals(_site.getPluginEntryCount(), 1);
-		assertEquals(_site.getPluginEntries()[0], pluginEntry);
-
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteAPI.java
deleted file mode 100644
index 94c5632..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteAPI.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.update.core.ISite;
-import org.eclipse.update.core.SiteManager;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestSiteAPI extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestSiteAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testURL() throws Exception {
-
-		ISite site = SiteManager.getSite(SOURCE_FILE_SITE);
-		assertEquals(site.getURL(),SOURCE_FILE_SITE);
-		
-		ISite site2 = SiteManager.getSite(SOURCE_HTTP_SITE);
-		assertEquals(site2.getURL(),new URL("http", getHttpHost(),getHttpPort(), bundle.getString("HTTP_PATH_1")+"site.xml"));
-
-	}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteManagerAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteManagerAPI.java
deleted file mode 100644
index e636308..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestSiteManagerAPI.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestSiteManagerAPI extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestSiteManagerAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testFile() throws Exception {
-		ISite fileSite = SiteManager.getSite(TARGET_FILE_SITE);
-		String site = fileSite.getURL().toExternalForm();		
-		assertEquals(TARGET_FILE_SITE.toExternalForm(), site);
-	}
-	
-	public void testUnknown() throws Exception {
-		URL url = new URL("ftp://255.255.255.255/");
-		try {
-		SiteManager.getSite(url);
-		// FIXME apparently works !!!!!
-		//fail("Connected to ftp://255.255.255.255/, should not happen");
-		} catch (CoreException e){
-			// expected
-		}
-	}
-	
-	public void testLocalSite() throws Exception {
-		
-		ILocalSite site = SiteManager.getLocalSite();
-		IConfiguredSite[] instSites = site.getCurrentConfiguration().getConfiguredSites();
-		assertTrue(instSites.length>0);
-		System.out.println("Local Site:"+instSites[0].getSite().getURL().toExternalForm());
-		
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE);
-		IFeature remoteFeature = remoteSite.getFeatureReferences()[0].getFeature();
-		instSites[0].getSite().install(remoteFeature,null,null);
-		
-		IFeatureReference[] features = site.getCurrentConfiguration().getConfiguredSites()[0].getSite().getFeatureReferences();
-		assertTrue(features.length>0);
-
-		//cleanup
-		File file = new File(instSites[0].getSite().getURL().getFile()+File.separator+Site.DEFAULT_INSTALLED_FEATURE_PATH+remoteFeature.getVersionedIdentifier());
-		UpdateManagerUtils.removeFromFileSystem(file);
-		file = new File(instSites[0].getSite().getURL().getFile()+File.separator+Site.DEFAULT_PLUGIN_PATH+"org.eclipse.update.plugin1_1.1.1");
-		UpdateManagerUtils.removeFromFileSystem(file);		
-		File localFile = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)site.getCurrentConfiguration()).getURL().getFile()));				
-		
-
-	}
-	
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestUpdateManagerUtilsAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestUpdateManagerUtilsAPI.java
deleted file mode 100644
index ade0fcd..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/api/TestUpdateManagerUtilsAPI.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package org.eclipse.update.tests.api;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.ISite;
-import org.eclipse.update.core.SiteManager;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestUpdateManagerUtilsAPI extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestUpdateManagerUtilsAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testgetURL() throws Exception {
-		URL url1 = new URL("http://www.eclipse.org");
-		URL url2 = new URL("file://c:/hello");
-		URL url3 = new URL("file:/home/eclipse/");
-		URL url4 = new URL("ftp:/host:8080/path/");
-		URL url5 = new URL("jar:file:/tmp/100100!/");
-		
-		String default1 = "default1/default";
-		String default2 = "/default2/";
-		
-		String str1 = "http://dev.eclipse.org";
-		String str2 = "relative1/path/";
-		String str3 = "/relative2/path";
-		
-		String result1=null;
-		String result2=null;
-		
-		//****************************************************************************************
-		// 1.0
-		result1 = UpdateManagerUtils.getURL(url1,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("1.0",result2,result1);
-		
-		// 1.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("1.1",result2,result1);
-		
-		// 1.2
-		 result1 = UpdateManagerUtils.getURL(url1,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("1.2",result2,result1);
-		
-		// 1.3
-		 result1 = UpdateManagerUtils.getURL(url1,str2,default1).toExternalForm();
-		 result2 = "http://www.eclipse.org/relative1/path/";
-		assertEquals("1.3",result2,result1);
-		
-		// 1.4
-		 result1 = UpdateManagerUtils.getURL(url1,str3,default1).toExternalForm();
-		 result2 = "http://www.eclipse.org/relative2/path";
-		assertEquals("1.4",result2,result1);
-		
-		// 1.5
-		 result1 = UpdateManagerUtils.getURL(url1,null,default1).toExternalForm();
-		 result2 = "http://www.eclipse.org/default1/default";
-		assertEquals("1.5",result2,result1);
-		
-		// 1.6
-		 result1 = UpdateManagerUtils.getURL(url1,null,default2).toExternalForm();
-		 result2 = "http://www.eclipse.org/default2/";
-		assertEquals("1.6",result2,result1);
-		
-		//****************************************************************************************
-		// 2.0
-		 result1 = UpdateManagerUtils.getURL(url2,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("2.0",result2,result1);
-		
-		// 2.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("2.1",result2,result1);
-		
-		// 2.2
-		 result1 = UpdateManagerUtils.getURL(url2,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("2.2",result2,result1);
-		
-		// 2.3
-		 result1 = UpdateManagerUtils.getURL(url2,str2,default1).toExternalForm();
-		 result2 = "file://c:/relative1/path/";
-		assertEquals("2.3",result2,result1);
-		
-		// 2.4
-		 result1 = UpdateManagerUtils.getURL(url2,str3,default1).toExternalForm();
-		 result2 = "file://c:/relative2/path";
-		assertEquals("2.4",result2,result1);
-		
-		// 2.5
-		 result1 = UpdateManagerUtils.getURL(url2,null,default1).toExternalForm();
-		 result2 = "file://c:/default1/default";
-		assertEquals("2.5",result2,result1);
-		
-		// 2.6
-		 result1 = UpdateManagerUtils.getURL(url2,null,default2).toExternalForm();
-		 result2 = "file://c:/default2/";
-		assertEquals("2.6",result2,result1);
-		
-
-		//****************************************************************************************
-		// 3.0
-		 result1 = UpdateManagerUtils.getURL(url3,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("3.0",result2,result1);
-		
-		// 3.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("3.1",result2,result1);
-		
-		// 3.2
-		 result1 = UpdateManagerUtils.getURL(url3,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("3.2",result2,result1);
-		
-		// 3.3
-		 result1 = UpdateManagerUtils.getURL(url3,str2,default1).toExternalForm();
-		 result2 = "file:/home/eclipse/relative1/path/";
-		assertEquals("3.3",result2,result1);
-		
-		// 3.4
-		 result1 = UpdateManagerUtils.getURL(url3,str3,default1).toExternalForm();
-		 result2 = "file:/home/eclipse/relative2/path";
-		assertEquals("3.4",result2,result1);
-		
-		// 3.5
-		 result1 = UpdateManagerUtils.getURL(url3,null,default1).toExternalForm();
-		 result2 = "file:/home/eclipse/default1/default";
-		assertEquals("3.5",result2,result1);
-		
-		// 3.6
-		 result1 = UpdateManagerUtils.getURL(url3,null,default2).toExternalForm();
-		 result2 = "file:/home/eclipse/default2/";
-		assertEquals("3.6",result2,result1);
-				
-		//****************************************************************************************
-		// 4.0
-		 result1 = UpdateManagerUtils.getURL(url4,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("4.0",result2,result1);
-		
-		// 4.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("4.1",result2,result1);
-		
-		// 4.2
-		 result1 = UpdateManagerUtils.getURL(url4,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("4.2",result2,result1);
-		
-		// 4.3
-		 result1 = UpdateManagerUtils.getURL(url4,str2,default1).toExternalForm();
-		 result2 = "ftp:/host:8080/path/relative1/path/";
-		assertEquals("4.3",result2,result1);
-		
-		// 4.4
-		 result1 = UpdateManagerUtils.getURL(url4,str3,default1).toExternalForm();
-		 result2 = "ftp:/host:8080/path/relative2/path";
-		assertEquals("4.4",result2,result1);
-		
-		// 4.5
-		 result1 = UpdateManagerUtils.getURL(url4,null,default1).toExternalForm();
-		 result2 = "ftp:/host:8080/path/default1/default";
-		assertEquals("4.5",result2,result1);
-		
-		// 4.6
-		 result1 = UpdateManagerUtils.getURL(url4,null,default2).toExternalForm();
-		 result2 = "ftp:/host:8080/path/default2/";
-		assertEquals("4.6",result2,result1);
-		
-		//****************************************************************************************
-		// 5.0
-		 result1 = UpdateManagerUtils.getURL(url5,str1,default1).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("5.0",result2,result1);
-		
-		// 5.1
-		 result1 = UpdateManagerUtils.getURL(null,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("5.1",result2,result1);
-		
-		// 5.2
-		 result1 = UpdateManagerUtils.getURL(url5,str1,null).toExternalForm();
-		 result2 = "http://dev.eclipse.org";
-		assertEquals("5.2",result2,result1);
-		
-		// 5.3
-		 result1 = UpdateManagerUtils.getURL(url5,str2,default1).toExternalForm();
-		 result2 = "jar:file:/tmp/100100!/relative1/path/";
-		assertEquals("5.3",result2,result1);
-		
-		// 5.4
-		 result1 = UpdateManagerUtils.getURL(url5,str3,default1).toExternalForm();
-		 result2 = "jar:file:/tmp/100100!/relative2/path";
-		assertEquals("5.4",result2,result1);
-		
-		// 5.5
-		 result1 = UpdateManagerUtils.getURL(url5,null,default1).toExternalForm();
-		 result2 = "jar:file:/tmp/100100!/default1/default";
-		assertEquals("5.5",result2,result1);
-		
-		// 5.6
-		 result1 = UpdateManagerUtils.getURL(url5,null,default2).toExternalForm();
-		 result2 = "jar:file:/tmp/100100!/default2/";
-		assertEquals("5.6",result2,result1);				
-
-	}
-	
-	
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/AllConfigurationsTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/AllConfigurationsTests.java
deleted file mode 100644
index e24d856..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/AllConfigurationsTests.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestBackward.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestBackward.java
deleted file mode 100644
index ff1e277..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestBackward.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.eclipse.update.tests.configurations;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.boot.IPlatformConfiguration;
-import org.eclipse.update.core.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.core.ConfigurationPolicy;
-import org.eclipse.update.internal.core.InternalSiteManager;
-import org.eclipse.update.internal.core.SiteLocal;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.internal.model.*;
-import org.eclipse.update.internal.model.ConfiguredSiteModel;
-import org.eclipse.update.internal.model.InstallConfigurationModel;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import org.eclipse.update.tests.regularInstall.*;
-
-public class TestBackward extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestBackward(String arg0) {
-		super(arg0);
-	}
-	
-	public void testSimpleBackward() throws Exception {
-
-		// cleanup
-		SiteLocal siteLocal = ((SiteLocal)SiteManager.getLocalSite());
-		File localFile = new File(new URL(siteLocal.getLocationURL(),SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)siteLocal.getCurrentConfiguration()).getURL().getFile()));
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE);
-		IFeatureReference featureRef = remoteSite.getFeatureReferences()[0];
-		
-		IInstallConfiguration oldInstallConfig = site.getCurrentConfiguration();
-		IConfiguredSite oldConfigSite = oldInstallConfig.getConfiguredSites()[0];
-		oldConfigSite.install(featureRef.getFeature(),null,null);
-		site.save();
-	
-		
-		// Activity -> InstallConfig
-		IInstallConfiguration current = site.getCurrentConfiguration();
-		IActivity activity = current.getActivities()[0];	
-		assertTrue(activity.getInstallConfiguration().equals(current));
-		
-		// ConfigSite->InstallConfig
-		IConfiguredSite newConfigSite = current.getConfiguredSites()[0];
-		assertTrue(newConfigSite.getInstallConfiguration().equals(current));
-		
-		// cleanup
-		localFile = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		localFile = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),SiteLocal.DEFAULT_CONFIG_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-	
-	}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestRevert.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestRevert.java
deleted file mode 100644
index 89cf454..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/configurations/TestRevert.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.eclipse.update.tests.configurations;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.boot.IPlatformConfiguration;
-import org.eclipse.update.core.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.core.ConfigurationPolicy;
-import org.eclipse.update.internal.core.InternalSiteManager;
-import org.eclipse.update.internal.core.SiteLocal;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.internal.model.*;
-import org.eclipse.update.internal.model.ConfiguredSiteModel;
-import org.eclipse.update.internal.model.InstallConfigurationModel;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import org.eclipse.update.tests.regularInstall.*;
-
-public class TestRevert extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestRevert(String arg0) {
-		super(arg0);
-	}
-	
-	public void testSimpleRevertInstall() throws Exception {
-
-		// cleanup
-		SiteLocal siteLocal = ((SiteLocal)SiteManager.getLocalSite());
-		File localFile = new File(new URL(siteLocal.getLocationURL(),SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)siteLocal.getCurrentConfiguration()).getURL().getFile()));
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE);
-		IFeatureReference featureRef = remoteSite.getFeatureReferences()[0];
-		IFeatureReference featureRef2 = remoteSite.getFeatureReferences()[1];
-		IFeature feature = featureRef.getFeature();
-		
-		IInstallConfiguration old = site.getCurrentConfiguration();
-		ConfigurationPolicy excludepolicy = new ConfigurationPolicy();
-		excludepolicy.setPolicy(IPlatformConfiguration.ISitePolicy.USER_EXCLUDE);
-		IConfiguredSite oldConfigSite = old.getConfiguredSites()[0];
-		excludepolicy.setConfiguredSite(oldConfigSite);		
-		((ConfiguredSiteModel)oldConfigSite).setConfigurationPolicyModel((ConfigurationPolicyModel)excludepolicy);
-		
-		IInstallConfiguration newConfig = site.cloneCurrentConfiguration();
-		newConfig.setLabel("new Label");
-		IConfiguredSite configSite = newConfig.getConfiguredSites()[0];
-		if (!configSite.getSite().equals(oldConfigSite.getSite())) fail("Config sites are not equals");
-		site.addConfiguration(newConfig);		
-		IFeatureReference installedFeature = configSite.install(feature,null,null);
-		site.save();
-
-		configSite.unconfigure(installedFeature.getFeature());
-
-		IFeature feature2 = featureRef2.getFeature();
-		IInstallConfiguration newConfig2 = site.cloneCurrentConfiguration();
-		//newConfig.setLabel("new Label");		
-		IConfiguredSite anotherConfigSite = newConfig2.getConfiguredSites()[0];
-		if (!anotherConfigSite.getSite().equals(oldConfigSite.getSite())) fail("Config sites are not equals");		
-		site.addConfiguration(newConfig2);		
-		anotherConfigSite.install(feature2,null,null);
-		site.save();
-
-		site.revertTo(old,null,null);
-		site.save();
-		
-		// check
-		// there are 4 configuration
-		String time = ""+site.getCurrentConfiguration().getCreationDate().getTime();
-		File file = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),"Config"+time+".xml").getFile());
-		assertTrue("new configuration does not exist", file.exists());
-		
-		
-		// teh current one points to a real fature
-		// does not throw error.
-		IConfiguredSite newConfigSite = null;
-		IConfiguredSite[] sites = site.getCurrentConfiguration().getConfiguredSites();
-		for (int i = 0; i < sites.length; i++) {
-			if (sites[i].getSite().equals(oldConfigSite.getSite())){
-				 newConfigSite = sites[i];
-				 break;
-			}
-		}
-		if (newConfigSite==null) fail("Cannot find configuration site");
-
-		int oldNumber = oldConfigSite.getConfiguredFeatures().length;
-		int newNumber = newConfigSite.getConfiguredFeatures().length;		
-		assertTrue("Wrong number of configured features",oldNumber==newNumber);
-		
-		// test only 2 install config in local site
-		assertTrue("wrong number of unconfigured features",((ConfiguredSite)newConfigSite).getConfigurationPolicy().getUnconfiguredFeatures().length==2);
-		
-		// cleanup
-		localFile = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		localFile = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),SiteLocal.DEFAULT_CONFIG_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);				
-		UpdateManagerUtils.removeFromFileSystem(file);	
-		time = ""+newConfig.getCreationDate().getTime();
-		file = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),"DefaultConfig"+time+".xml").getFile());	
-		UpdateManagerUtils.removeFromFileSystem(file);	
-		time = ""+newConfig2.getCreationDate().getTime();
-		file = new File(new URL(((SiteLocal)SiteManager.getLocalSite()).getLocationURL(),"DefaultConfig"+time+".xml").getFile());	
-		UpdateManagerUtils.removeFromFileSystem(file);	
-	}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/AllPlatformConfigurationTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/AllPlatformConfigurationTests.java
deleted file mode 100644
index a0168e4..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/AllPlatformConfigurationTests.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.eclipse.update.tests.core.boot;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllPlatformConfigurationTests
-	extends PlatformConfigurationTestCase {
-	/**
-	 * Constructor
-	 */
-	public AllPlatformConfigurationTests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * List of API tests
-	 */
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("PlatformConfiguration Tests");
-
-		suite.addTest(new TestSuite(TestPlatCfgAPI.class));
-
-		return suite;
-	}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/PlatformConfigurationTestCase.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/PlatformConfigurationTestCase.java
deleted file mode 100644
index 3f05e32..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/PlatformConfigurationTestCase.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.update.tests.core.boot;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.File;
-import java.util.Date;
-
-import junit.framework.TestCase;
-
-public class PlatformConfigurationTestCase extends TestCase {
-	
-	protected String tempDir;
-	
-	public PlatformConfigurationTestCase(String name) {
-		super(name);
-		try {
-			init();
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-	}
-	
-	protected void init() {
-	}
-	
-	protected void setUp() {
-		// get new temp directory for testcase
-		String root = getTempDirectoryName();
-		setupDirectory(root);
-		tempDir = root;
-	}
-	
-	protected void tearDown() {
-		// cleanup testcase temp directory
-		if (tempDir != null)
-			cleanupDirectory(tempDir);
-	}
-	
-	protected String getTempDirectoryName() {
-		String tmp = System.getProperty("java.io.tmpdir");
-		if (!tmp.endsWith(File.separator))
-			tmp += File.separator;
-		return tmp+"eclipse"+File.separator+(new Date().getTime()+File.separator);
-	}
-	
-	protected void setupDirectory(String name) {
-		File dir = new File(name);
-		dir.mkdirs();
-	}
-	
-	protected void cleanupDirectory(String name) {
-		File dir = new File(name);
-		deleteDirectory(dir);
-	}
-	
-	private void deleteDirectory(File dir) {
-		File[] list = dir.listFiles();
-		if (list == null)
-			return;
-			
-		for (int i=0; i<list.length; i++) {
-			if (list[i].isDirectory()) 
-				deleteDirectory(list[i]);
-			if (!list[i].delete())
-				System.out.println("Unable to delete "+list[i].toString());
-		}
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgAPI.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgAPI.java
deleted file mode 100644
index b33f3bd..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgAPI.java
+++ /dev/null
@@ -1,206 +0,0 @@
-package org.eclipse.update.tests.core.boot;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Date;
-
-import junit.framework.Assert;
-import org.eclipse.core.boot.BootLoader;
-import org.eclipse.core.boot.IPlatformConfiguration;
-import org.eclipse.core.boot.IPlatformConfiguration.ISiteEntry;
-import org.eclipse.core.boot.IPlatformConfiguration.ISitePolicy;
-
-public class TestPlatCfgAPI extends PlatformConfigurationTestCase {
-			
-	public TestPlatCfgAPI(String arg0) {
-		super(arg0);
-	}
-	
-	public void testBasic() throws Exception {
-		
-		// get new config object
-		IPlatformConfiguration cfig = null;
-		try {
-			cfig = BootLoader.getPlatformConfiguration(null);
-		} catch (IOException e) {
-			Assert.fail("0.0.0 "+e.toString());
-		}
-		ISiteEntry[] dflt = cfig.getConfiguredSites();
-		Assert.assertEquals("0.0.1",dflt.length,0);
-		
-		// policy tests
-		ISitePolicy p1 = cfig.createSitePolicy(ISitePolicy.USER_INCLUDE, null);
-		Assert.assertEquals("1.0.0",p1.getType(),ISitePolicy.USER_INCLUDE);
-		Assert.assertEquals("1.0.1",p1.getList().length,0);
-		p1.setList(new String[] {"first"});
-		Assert.assertEquals("1.0.2",p1.getList().length,1);
-		Assert.assertEquals("1.0.3",p1.getList()[0],"first");
-		
-		ISitePolicy p2 = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[0]);
-		Assert.assertEquals("1.1.0",p2.getType(),ISitePolicy.USER_EXCLUDE);
-		Assert.assertEquals("1.1.1",p2.getList().length,0);
-		p2.setList(new String[] {"first", "second"});
-		Assert.assertEquals("1.1.2",p2.getList().length,2);
-		Assert.assertEquals("1.1.3",p2.getList()[1],"second");
-		
-		// create some urls
-		URL u1 = null;
-		URL u2 = null;
-
-		URL u4 = null;
-		try {
-			u1 = new URL("file:d:/temp/");
-			u2 = new URL("file://localhost/temp/");
-			new URL("http://some.server/temp/");
-			u4 = new URL("http://bad.url");
-		} catch (MalformedURLException e) {
-			Assert.fail("2.0.0 unable to create URL "+e);
-		}
-				
-		// site creation tests
-		ISiteEntry s1 = cfig.createSiteEntry(u1,p2);
-		Assert.assertEquals("3.0.0",s1.getURL(),u1);
-		Assert.assertEquals("3.0.1",s1.getSitePolicy(),p2);
-		s1.setSitePolicy(p1);
-		Assert.assertEquals("3.0.2",s1.getSitePolicy(),p1);
-		
-		ISiteEntry s2 = cfig.createSiteEntry(u2,p1);
-		Assert.assertEquals("3.1.0",s2.getURL(),u2);
-		Assert.assertEquals("3.1.1",s2.getSitePolicy(),p1);
-		s2.setSitePolicy(p2);
-		Assert.assertEquals("3.1.2",s2.getSitePolicy(),p2);
-		
-		// configure site tests
-		Assert.assertEquals("3.3.0",cfig.getConfiguredSites().length,0);
-		cfig.configureSite(s1);
-		Assert.assertEquals("3.3.1",cfig.getConfiguredSites().length,1);
-		cfig.configureSite(s2);
-		Assert.assertEquals("3.3.2",cfig.getConfiguredSites().length,2);
-		
-		// lookup site tests
-		Assert.assertEquals("3.4.0",cfig.findConfiguredSite(u1),s1);
-		Assert.assertEquals("3.4.1",cfig.findConfiguredSite(u2),s2);
-		Assert.assertNull("3.4.3",cfig.findConfiguredSite(u4));
-		
-		// unconfigure site tests
-		cfig.unconfigureSite(s1);
-		Assert.assertEquals("3.5.0",cfig.getConfiguredSites().length,1);
-		Assert.assertNull("3.5.1",cfig.findConfiguredSite(u1));		
-		cfig.unconfigureSite(s2);
-		Assert.assertEquals("3.5.2",cfig.getConfiguredSites().length,0);
-		Assert.assertNull("3.5.3",cfig.findConfiguredSite(u2));	
-	}
-	
-	public void testSaveRestore() throws Exception {
-				
-		Assert.assertNotNull("0.0 Unable to obtain temp directory",tempDir);
-		
-		// get new config object
-		IPlatformConfiguration cfig = null;
-		try {
-			cfig = BootLoader.getPlatformConfiguration(null);
-		} catch (IOException e) {
-			Assert.fail("0.0.0 "+e.toString());
-		}
-		ISiteEntry[] sites = cfig.getConfiguredSites();
-		Assert.assertEquals("0.0.1",sites.length,0);
-				
-		// create policies
-		ISitePolicy p1 = cfig.createSitePolicy(ISitePolicy.USER_INCLUDE, null);
-		ISitePolicy p2 = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[0]);		
-		ISitePolicy p3 = cfig.createSitePolicy(ISitePolicy.USER_INCLUDE, new String[] {"first"});
-		ISitePolicy p4 = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[] {"first", "second"});
-						
-		// create some urls
-		URL u1 = null;
-		URL u2 = null;
-		URL u3 = null;
-		URL u4 = null;
-
-		try {
-			u1 = new URL("file:d:/temp/");
-			u2 = new URL("file://localhost/temp/");
-			u3 = new URL("http://some.server/temp/");
-			u4 = new URL("http://another.server/temp/");
-			new URL("http://one.more.server/temp/");
-		} catch (MalformedURLException e) {
-			Assert.fail("1.0 unable to create URL "+e);
-		}
-		
-		// create and configure sites
-		ISiteEntry s1 = cfig.createSiteEntry(u1,p1);
-		cfig.configureSite(s1);
-		ISiteEntry s2 = cfig.createSiteEntry(u2,p2);
-		cfig.configureSite(s2);
-		ISiteEntry s3 = cfig.createSiteEntry(u3,p3);
-		cfig.configureSite(s3);
-		ISiteEntry s4 = cfig.createSiteEntry(u4,p4);
-		cfig.configureSite(s4);
-		sites = cfig.getConfiguredSites();
-		Assert.assertEquals("1.1",sites.length,4);
-		
-		// do save
-		try {
-			cfig.save();
-			Assert.fail("2.0 was expecting IOException");
-		} catch (IOException e) {
-		}
-		
-		URL cfigURL = null;
-		try {
-			cfigURL = new URL("file:"+tempDir+(new Date()).getTime()+"_platform.cfg");
-		} catch(MalformedURLException e) {
-			Assert.fail("2.1 unable to create URL "+e);
-		}
-		
-		try {
-			cfig.save(cfigURL);
-		} catch (IOException e) {
-			Assert.fail("2.2 "+e);
-		}
-		
-		// reload configuration	
-		try {
-			BootLoader.getPlatformConfiguration(cfigURL);
-		} catch (IOException e) {
-			Assert.fail("2.3 "+e.toString());
-		}
-		ISiteEntry[] newSites = cfig.getConfiguredSites();
-		Assert.assertEquals("2.4",newSites.length,4);
-		
-		// check what we've got
-		Assert.assertEquals("3.0.1",sites[0].getURL(),newSites[0].getURL());
-		Assert.assertEquals("3.0.2",sites[0].getSitePolicy().getType(),newSites[0].getSitePolicy().getType());
-		Assert.assertEquals("3.0.3",sites[0].getSitePolicy().getList(),newSites[0].getSitePolicy().getList());
-		
-		Assert.assertEquals("3.1.1",sites[1].getURL(),newSites[1].getURL());
-		Assert.assertEquals("3.1.2",sites[1].getSitePolicy().getType(),newSites[1].getSitePolicy().getType());
-		Assert.assertEquals("3.1.3",sites[1].getSitePolicy().getList(),newSites[1].getSitePolicy().getList());
-		
-		Assert.assertEquals("3.2.1",sites[2].getURL(),newSites[2].getURL());
-		Assert.assertEquals("3.2.2",sites[2].getSitePolicy().getType(),newSites[2].getSitePolicy().getType());
-		Assert.assertEquals("3.2.3",sites[2].getSitePolicy().getList(),newSites[2].getSitePolicy().getList());
-		
-		Assert.assertEquals("3.3.1",sites[3].getURL(),newSites[3].getURL());
-		Assert.assertEquals("3.3.2",sites[3].getSitePolicy().getType(),newSites[3].getSitePolicy().getType());
-		Assert.assertEquals("3.3.3",sites[3].getSitePolicy().getList(),newSites[3].getSitePolicy().getList());
-		
-	}
-	
-	public void testCurrentConfiguration() throws Exception {
-				
-		Assert.assertNotNull("0.0 Unable to obtain temp directory",tempDir);
-		
-		// get new config object
-		IPlatformConfiguration cfig = null;
-		cfig = BootLoader.getCurrentPlatformConfiguration();
-		cfig.getPluginPath();
-		cfig.save();
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgDefault.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgDefault.java
deleted file mode 100644
index b9b846d..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/core/boot/TestPlatCfgDefault.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.update.tests.core.boot;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.IOException;
-
-import org.eclipse.core.boot.BootLoader;
-import org.eclipse.core.boot.IPlatformConfiguration;
-import org.eclipse.core.boot.IPlatformConfiguration.ISiteEntry;
-import org.eclipse.core.boot.IPlatformConfiguration.ISitePolicy;
-
-public class TestPlatCfgDefault
-	extends PlatformConfigurationTestCase {
-		
-	public TestPlatCfgDefault(String arg0) {
-		super(arg0);
-	}
-	
-	public void testInitial() throws Exception {
-		IPlatformConfiguration cfig = null;
-		cfig = BootLoader.getCurrentPlatformConfiguration();
-		ISiteEntry se = cfig.getConfiguredSites()[0];
-		ISitePolicy sp = cfig.createSitePolicy(ISitePolicy.USER_EXCLUDE, new String[] {"1", "2","3","4","5","6","7","8","9","10","11","12"});
-		se.setSitePolicy(sp);
-		cfig.save();
-		System.out.println("done ...");
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTP.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTP.java
deleted file mode 100644
index 7bae9bd..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTP.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package org.eclipse.update.tests.implementation;
-
-import java.io.InputStream;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.IFeature;
-import org.eclipse.update.core.IFeatureReference;
-import org.eclipse.update.core.IPluginEntry;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.IURLEntry;
-import org.eclipse.update.internal.core.*;
-
-public class SiteFTP implements ISite {
-
-	private URL url;
-	public SiteFTP(URL url){
-		this.url = url;
-	}
-
-	/*
-	 * @see ISite#getFeatureReferences()
-	 */
-	public IFeatureReference[] getFeatureReferences() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#install(IFeature, FeatureVerification verifier,IProgressMonitor)
-	 */
-	public IFeatureReference install(IFeature feature,IVerificationListener verificationListener, IProgressMonitor monitor) throws CoreException {
-		return null;
-	}
-
-	/*
-	 * @see ISite#remove(IFeature, IProgressMonitor)
-	 */
-	public void remove(IFeature feature, IProgressMonitor monitor) throws CoreException {
-	}
-
-	/*
-	 * @see ISite#addSiteChangedListener(IConfiguredSiteChangedListener)
-	 */
-	public void addSiteChangedListener(IConfiguredSiteChangedListener listener) {
-	}
-
-	/*
-	 * @see ISite#removeSiteChangedListener(IConfiguredSiteChangedListener)
-	 */
-	public void removeSiteChangedListener(IConfiguredSiteChangedListener listener) {
-	}
-
-	/*
-	 * @see ISite#getURL()
-	 */
-	public URL getURL() {
-		return url;
-	}
-
-	/*
-	 * @see ISite#getType()
-	 */
-	public String getType() {
-		return "org.eclipse.update.tests.ftp";
-	}
-
-	/*
-	 * @see ISite#getCategories()
-	 */
-	public ICategory[] getCategories() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getArchives()
-	 */
-	public IArchiveReference[] getArchives() {
-		return null;
-	}
- 
-	/*
-	 * @see ISite#addCategory(ICategory)
-	 */
-	public void addCategory(ICategory category) {
-	}
-
-	/*
-	 * @see ISite#save()
-	 */
-	public void save() throws CoreException {
-	}
-
-	/*
-	 * @see IPluginContainer#getPluginEntries()
-	 */
-	public IPluginEntry[] getPluginEntries() {
-		return null;
-	}
-
-	/*
-	 * @see IPluginContainer#getPluginEntryCount()
-	 */
-	public int getPluginEntryCount() {
-		return 0;
-	}
-
-	/*
-	 * @see ISite#getDownloadSizeFor(IFeature)
-	 */
-	public long getDownloadSizeFor(IFeature feature) {
-		return 0;
-	}
-
-	/*
-	 * @see ISite#getInstallSizeFor(IFeature)
-	 */
-	public long getInstallSizeFor(IFeature feature) {
-		return 0;
-	}
-
-
-	/*
-	 * @see IPluginContainer#store(IPluginEntry, String, InputStream)
-	 */
-	public void store(IPluginEntry entry, String name, InputStream inStream) throws CoreException {
-	}
-
-	/*
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/*
-	 * @see IPluginContainer#remove(IPluginEntry)
-	 */
-	public void remove(IPluginEntry entry) throws CoreException {
-	}
-
-	/*
-	 * @see ISite#setSiteContentConsumer(ISiteContentConsumer)
-	 */
-	public void setSiteContentConsumer(ISiteContentConsumer contentConsumer) {
-	}
-
-	/*
-	 * @see ISite#setSiteContentProvider(ISiteContentProvider)
-	 */
-	public void setSiteContentProvider(ISiteContentProvider siteContentProvider) {
-	}
-
-	/*
-	 * @see ISite#getSiteContentProvider()
-	 */
-	public ISiteContentProvider getSiteContentProvider() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getDefaultPackagedFeatureType()
-	 */
-	public String getDefaultPackagedFeatureType() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#store(IFeature, String, InputStream, IProgressMonitor)
-	 */
-	public void store(IFeature feature, String name, InputStream inStream, IProgressMonitor monitor) throws CoreException {
-	}
-
-
-	/*
-	 * @see IPluginContainer#remove(IPluginEntry, IProgressMonitor)
-	 */
-	public void remove(IPluginEntry entry, IProgressMonitor monitor) throws CoreException {
-	}
-
-	/*
-	 * @see ISite#getCategory(String)
-	 */
-	public ICategory getCategory(String key) {
-		return null;
-	}
-
-	/*
-	 * @see ISite#createSiteContentConsumer(IFeature)
-	 */
-	public ISiteContentConsumer createSiteContentConsumer(IFeature feature) throws CoreException {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getFeatureReference(IFeature)
-	 */
-	public IFeatureReference getFeatureReference(IFeature feature) {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getDescription()
-	 */
-	public IURLEntry getDescription() {
-		return null;
-	}
-
-	/*
-	 * @see ISite#getPluginEntriesOnlyReferencedBy(IFeature)
-	 */
-	public IPluginEntry[] getPluginEntriesOnlyReferencedBy(IFeature feature) throws CoreException {
-		return null;
-	}
-
-	/**
-	 * @see ISite#addPluginEntry(IPluginEntry)
-	 */
-	public void addPluginEntry(IPluginEntry pluginEntry) {
-	}
-
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTPFactory.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTPFactory.java
deleted file mode 100644
index 5c4c10f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/implementation/SiteFTPFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.eclipse.update.tests.implementation;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.internal.core.SiteURLContentProvider;
-import org.eclipse.update.internal.core.URLEncoder;
-
-public class SiteFTPFactory extends SiteModelFactory implements ISiteFactory {
-
-	public static final String FILE = "a/b/c/";
-
-	/*
-	 * @see ISiteFactory#createSite(URL, boolean)
-	 */
-	public ISite createSite(URL url)
-		throws CoreException, InvalidSiteTypeException {
-		ISite site = null;
-		InputStream siteStream = null;
-
-		try {
-			URL resolvedURL = URLEncoder.encode(url);
-			siteStream = resolvedURL.openStream();
-
-			SiteModelFactory factory = (SiteModelFactory) this;
-			factory.parseSite(siteStream);
-
-			site = new SiteFTP(new URL("http://eclipse.org/" + FILE));
-			
-		} catch (MalformedURLException e) {
-			throw Utilities.newCoreException("Unable to create URL", e);
-		} catch (IOException e) {
-			throw Utilities.newCoreException("Unable to access URL", e);
-		} finally {
-			try {
-				siteStream.close();
-			} catch (Exception e) {
-			}
-		}
-		return site;
-	}
-
-	/*
-	 * @see SiteModelFactory#canParseSiteType(String)
-	 */
-	public boolean canParseSiteType(String type) {
-		return "org.eclipse.update.tests.core.ftp".equalsIgnoreCase(type);
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/AllModelTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/AllModelTests.java
deleted file mode 100644
index 72e111c..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/AllModelTests.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.eclipse.update.tests.model;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.update.core.SiteManager;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import java.io.File;
-import junit.framework.*;
-
-/**
- * Manages the API tests
- */
-public class AllModelTests extends UpdateManagerTestCase {
-	/**
-	 * Constructor
-	 */
-	public AllModelTests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * List of API tests
-	 */
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("Model Tests");
-
-		suite.addTest(new TestSuite(FeatureMain.class));
-		suite.addTest(new TestSuite(SiteMain.class));		
-
-		return suite;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/FeatureMain.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/FeatureMain.java
deleted file mode 100644
index ea3bdfc..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/FeatureMain.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package org.eclipse.update.tests.model;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.net.URL;
-import java.util.ResourceBundle;
-
-import org.eclipse.update.core.model.DefaultFeatureParser;
-import org.eclipse.update.core.model.FeatureModel;
-import org.eclipse.update.core.model.FeatureModelFactory;
-import org.eclipse.update.core.model.ImportModel;
-import org.eclipse.update.core.model.NonPluginEntryModel;
-import org.eclipse.update.core.model.PluginEntryModel;
-import org.eclipse.update.core.model.URLEntryModel;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class FeatureMain extends UpdateManagerTestCase {
-
-	public FeatureMain(String testcase){
-		super(testcase);
-	}
-
-	public void testMain() throws Exception {
-		
-		FeatureModelFactory factory = new FeatureModelFactory();
-		InputStream is = null;
-		FeatureModel feature = null;
-		PrintWriter w = new PrintWriter(System.out);
-		
-		w.println("Parsing feature ...");
-		try {
-			is = FeatureMain.class.getResourceAsStream("feature.xml");		
-			feature = factory.parseFeature(is);
-		} finally {
-			if (is != null) {
-				try { is.close();} catch(IOException e) {}
-			}
-		}
-		
-		String base = "http://another.server/feature.xml";
-		w.println("Resolving feature using "+base+" ...");
-		ResourceBundle bundle = null;
-		bundle = ResourceBundle.getBundle("org/eclipse/update/tests/model/test");
-		feature.resolve(new URL(base), bundle);
-				
-		w.close();
-	}
-	
-	private static void writeFeature(PrintWriter w, int level, FeatureModel feature) {
-		if (feature == null) return;
-		
-		String in = getIndent(level);
-		w.println(in+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-		
-		w.println(in+"<feature");
-		w.println(in+"   "+"id=\""+feature.getFeatureIdentifier()+"\"");
-		w.println(in+"   "+"version=\""+feature.getFeatureVersion()+"\"");
-		w.println(in+"   "+"label=\""+feature.getLabel()+"\"");
-		w.println(in+"   "+"provider-name=\""+feature.getProvider()+"\"");
-		w.println(in+"   "+"image=\""+feature.getImageURLString()+"\" -> "+feature.getImageURL());
-		w.println(in+"   "+"os=\""+feature.getOS()+"\"");
-		w.println(in+"   "+"ws=\""+feature.getWS()+"\"");
-		w.println(in+"   "+"nl=\""+feature.getNL()+"\"");
-		w.println(in+"   "+"application=\""+feature.getApplication()+"\"");
-		w.println(in+"   "+">");
-		
-		writeDescription(w, level+1, feature.getDescriptionModel());
-		writeCopyright(w, level+1, feature.getCopyrightModel());
-		writeLicense(w, level+1, feature.getLicenseModel());
-		writeURLs(w, level+1, feature);
-		writePrereqs(w, level+1, feature);
-		writePluginEntries(w, level+1, feature);
-		writeNonPluginEntries(w, level+1, feature);
-		         
-        w.println(in+"</feature>");
-	}
-	
-	private static void writeDescription(PrintWriter w, int level, URLEntryModel ue) {
-		String in = getIndent(level);
-		w.println("");
-		w.println(in+"<description url=\""+ue.getURLString()+"\" -> "+ue.getURL()+">");
-		w.println(in+ue.getAnnotation());
-		w.println(in+"</description>");
-	}
-	
-	private static void writeCopyright(PrintWriter w, int level, URLEntryModel ue) {
-		String in = getIndent(level);
-		w.println("");
-		w.println(in+"<copyright url=\""+ue.getURLString()+"\" -> "+ue.getURL()+">");
-		w.println(in+ue.getAnnotation());
-		w.println(in+"</copyright>");
-	}
-	
-	private static void writeLicense(PrintWriter w, int level, URLEntryModel ue) {
-		String in = getIndent(level);
-		w.println("");
-		w.println(in+"<license url=\""+ue.getURLString()+"\" -> "+ue.getURL()+">");
-		w.println(in+ue.getAnnotation());
-		w.println(in+"</license>");
-	}
-	
-	private static void writeURLs(PrintWriter w, int level, FeatureModel feature) {
-		String in = getIndent(level);
-		String in2 = getIndent(level+1);
-		w.println("");
-		w.println(in+"<url>");
-		
-		URLEntryModel update = feature.getUpdateSiteEntryModel();
-		w.println(in2+"<update");
-		w.println(in2+"   "+"url=\""+update.getURLString()+"\" -> "+update.getURL());
-		w.println(in2+"   "+"label=\""+update.getAnnotation()+"\"");
-		w.println(in2+"   "+"/>");
-		
-		URLEntryModel[] discovery = feature.getDiscoverySiteEntryModels();
-		for (int i=0; i<discovery.length; i++) {
-			w.println(in2+"<discovery");
-			w.println(in2+"   "+"url=\""+discovery[i].getURLString()+"\" -> "+discovery[i].getURL());
-			w.println(in2+"   "+"label=\""+discovery[i].getAnnotation()+"\"");
-			w.println(in2+"   "+"/>");
-		}
-		
-		w.println(in+"</url>");
-	}
-	
-	private static void writePrereqs(PrintWriter w, int level, FeatureModel feature) {
-		String in = getIndent(level);
-		String in2 = getIndent(level+1);
-		w.println("");
-		w.println(in+"<requires>");
-		
-		ImportModel[] imp = feature.getImportModels();
-		for (int i=0; i<imp.length; i++) {
-			w.println(in2+"<import");
-			w.println(in2+"   "+"plugin=\""+imp[i].getPluginIdentifier()+"\"");
-			w.println(in2+"   "+"version=\""+imp[i].getPluginVersion()+"\"");
-			w.println(in2+"   "+"match=\""+imp[i].getMatchingRuleName()+"\"");
-			w.println(in2+"   "+"/>");
-		}
-		
-		w.println(in+"</requires>");
-	}
-	
-	private static void writePluginEntries(PrintWriter w, int level, FeatureModel feature) {
-		String in = getIndent(level);
-		w.println("");
-		
-		PluginEntryModel[] plugin = feature.getPluginEntryModels();
-		for (int i=0; i<plugin.length; i++) {
-			w.println(in+"<plugin");
-			w.println(in+"   "+"id=\""+plugin[i].getPluginIdentifier()+"\"");
-			w.println(in+"   "+"version=\""+plugin[i].getPluginVersion()+"\"");
-			w.println(in+"   "+"fragment=\""+plugin[i].isFragment()+"\"");
-			w.println(in+"   "+"os=\""+plugin[i].getOS()+"\"");
-			w.println(in+"   "+"ws=\""+plugin[i].getWS()+"\"");
-			w.println(in+"   "+"nl=\""+plugin[i].getNL()+"\"");
-			w.println(in+"   "+"download-size=\""+plugin[i].getDownloadSize()+"\"");
-			w.println(in+"   "+"install-size=\""+plugin[i].getInstallSize()+"\"");
-			w.println(in+"   "+"/>");
-		}
-	}
-	
-	private static void writeNonPluginEntries(PrintWriter w, int level, FeatureModel feature) {
-		String in = getIndent(level);
-		w.println("");
-		
-		NonPluginEntryModel[] data = feature.getNonPluginEntryModels();
-		for (int i=0; i<data.length; i++) {
-			w.println(in+"<data");
-			w.println(in+"   "+"id=\""+data[i].getIdentifier()+"\"");
-			w.println(in+"   "+"download-size=\""+data[i].getDownloadSize()+"\"");
-			w.println(in+"   "+"install-size=\""+data[i].getInstallSize()+"\"");
-			w.println(in+"   "+"/>");
-		}
-	}
-	
-	
-	private static String getIndent(int level) {
-		String indent = "";
-		for (int i=0; i<level; i++) 
-			indent += "   ";
-		return indent;
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/SiteMain.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/SiteMain.java
deleted file mode 100644
index 043c336..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/SiteMain.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package org.eclipse.update.tests.model;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.net.URL;
-
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.core.model.ArchiveReferenceModel;
-import org.eclipse.update.core.model.DefaultSiteParser;
-import org.eclipse.update.core.model.FeatureReferenceModel;
-import org.eclipse.update.core.model.CategoryModel;
-import org.eclipse.update.core.model.SiteModel;
-import org.eclipse.update.core.model.SiteModelFactory;
-import org.eclipse.update.core.model.URLEntryModel;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class SiteMain extends UpdateManagerTestCase {
-	
-	public SiteMain(String name){
-		super(name);
-	}
-
-	public void testMain() throws Exception {
-		
-		PrintWriter w = new PrintWriter(System.out);
-		process("site_old_format.xml",w);
-		process("site.xml",w);
-		try {
-			process("site_with_type.xml",w);
-			fail("InvalidSiteTypeException not thrown");
-		} catch (InvalidSiteTypeException e) {
-			assertEquals(e.getNewType(),"some.other.site.type");
-		} finally {
-			w.close();
-		}
-	}
-	
-	private static void process(String xml, PrintWriter w) throws Exception {
-		
-		SiteModelFactory factory = new SiteModelFactory();
-		InputStream is = null;
-		SiteModel site = null;
-		
-		w.println("");
-		w.println("Parsing site map ...");
-		try {
-			is = SiteMain.class.getResourceAsStream(xml);		
-			site = factory.parseSite(is);
-		}  finally {
-			if (is != null) {
-				try { is.close();} catch(IOException e) {}
-			}
-		}
-		
-		if (site == null) return;
-		
-		String base = "http://another.server/site.xml";
-		w.println("Resolving site using "+base+" ...");
-		site.resolve(new URL(base), null);
-		
-		w.println("Writing site ...");
-		writeSite(w,0,site);
-	}
-	
-	private static void writeSite(PrintWriter w, int level, SiteModel site) {
-		if (site == null) return;
-		
-		String in = getIndent(level);
-		w.println(in+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-		
-		w.println(in+"<site");
-		w.println(in+"   "+"type=\""+site.getType()+"\"");
-		w.println(in+"   "+">");
-		
-		writeDescription(w, level+1, site.getDescriptionModel());
-		writeFeatures(w, level+1, site);
-		writeArchives(w, level+1, site);
-		writeCategoryDefs(w, level+1, site);
-         
-        w.println(in+"</feature>");
-	}
-	
-	private static void writeDescription(PrintWriter w, int level, URLEntryModel ue) {
-		if (ue == null) return;
-		String in = getIndent(level);
-		w.println("");
-		w.println(in+"<description url=\""+ue.getURLString()+"\" -> "+ue.getURL()+">");
-		w.println(in+ue.getAnnotation());
-		w.println(in+"</description>");
-	}
-	
-	private static void writeFeatures(PrintWriter w, int level, SiteModel site) {
-		String in = getIndent(level);
-		getIndent(level+1);
-		w.println("");
-		
-		FeatureReferenceModel[] features = site.getFeatureReferenceModels();
-		for (int i=0; i<features.length; i++) {
-			w.println(in+"<feature");
-			w.println(in+"   "+"type=\""+features[i].getType()+"\"");
-			w.println(in+"   "+"url=\""+features[i].getURLString()+"\" -> "+features[i].getURL());
-			w.println(in+"   "+">");
-			writeCategories(w, level+1, features[i]);
-			w.println(in+"</feature>");
-		}
-	}
-	
-	private static void writeArchives(PrintWriter w, int level, SiteModel site) {
-		String in = getIndent(level);
-		w.println("");
-		
-		ArchiveReferenceModel[] archive = site.getArchiveReferenceModels();
-		for (int i=0; i<archive.length; i++) {
-			w.println(in+"<archive");
-			w.println(in+"   "+"path=\""+archive[i].getPath()+"\"");
-			w.println(in+"   "+"url=\""+archive[i].getURLString()+"\" -> "+archive[i].getURL());
-			w.println(in+"   "+"/>");
-		}
-	}
-	
-	private static void writeCategoryDefs(PrintWriter w, int level, SiteModel site) {
-		String in = getIndent(level);
-		getIndent(level+1);
-		w.println("");
-		
-		CategoryModel[] cat = site.getCategoryModels();
-		for (int i=0; i<cat.length; i++) {
-			w.println(in+"<category-def");
-			w.println(in+"   "+"name=\""+cat[i].getName()+"\"");
-			w.println(in+"   "+"label=\""+cat[i].getLabel()+"\"");
-			w.println(in+"   "+">");
-			writeDescription(w, level+1, cat[i].getDescriptionModel());
-			w.println(in+"</category-def>");
-		}
-	}
-	
-	private static void writeCategories(PrintWriter w, int level, FeatureReferenceModel feature) {
-		String in = getIndent(level);
-		String[] cat = feature.getCategoryNames();
-		for (int i=0; i<cat.length; i++) {
-			w.println(in+"<category name=\""+cat[i]+"\"");
-		}
-	}
-	
-	private static String getIndent(int level) {
-		String indent = "";
-		for (int i=0; i<level; i++) 
-			indent += "   ";
-		return indent;
-	}
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/feature.xml b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/feature.xml
deleted file mode 100644
index 1db9650..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/feature.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<feature id="my.feature" version="3.7.1" label="%s1" provider-name="VK Inc."
-         image="images/feature.gif" os="Win32" ws="Win32" nl="en_CA,en_US"
-         application="org.eclipse.ui.workbench">
-
-   <install-handler url="install/handler.html" library="custom.jar" class="InstallHandler"/>
-   
-   <description url="http://www.tools.com/features/my.feature">
-      Description of my.feature
-   </description>
-   
-   <copyright url="copyright/my.feature">
-      Copyright for my.feature
-   </copyright>
-   
-   <license url="%url1">
-      License for my.feature
-   </license>
-   
-   <url>
-      <update url="http://www.tools.com/update" label="Update site"/>
-      <discovery url="http://www.tools.com/discovery1" label="%s2"/>
-      <discovery url="%url2" label="%s3 Discovery site 2"/>
-      <discovery url="%url3 http://www.tools.com/discovery3" label="Discovery site 3"/>
-   </url>
-   
-   <requires>
-      <import plugin="plugin.1" version="1.0.0" match="perfect"/>
-      <import plugin="plugin.2" version="3.2.0"/>
-      <import plugin="plugin.3"/>
-   </requires>
-   
-   <plugin id="my.plugin.1" version="1.0.0" fragment="true"
-           os="Win32" ws="Win32" nl="en_US" download-size="23456" install-size="1234567"/>
-   <plugin id="my.plugin.2" version="1.0.1"/>
-   <plugin id="my.plugin.3" version="1.0.2"/>
-   
-   <data id="examples.zip" download-size="23456" install-size="1234567"/>
-   <data id="custom/rt.jar"/>
-
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site.xml b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site.xml
deleted file mode 100644
index 7516f26..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<site>
-
-   <description url="http://www.tools.com/updateSite">
-      Site description
-   </description>
-
-   <feature type="my.feature.type" url="feature1.jar">
-      <category name="tools"/>
-      <category name="utilities"/>
-      <category name="windows.tools"/>
-   </feature>
-   
-   <feature type="" url="file:/feature2.jar">
-      <category name="utilities"/>
-   </feature>
-   
-   
-   <archive path="first/archive" url="archive1.jar"/>
-   <archive path="second/archive" url="archive2.jar"/>
-   
-   <category-def name="tools" label="Development Tools">
-      <description url="http://www.tools.com/tools">
-         This is description for tools
-      </description>
-   </category-def>
-   
-   <category-def name="utilities" label="Utilities">
-      <description url="tools.html"/>/
-   </category-def>
-   
-   <category-def name="windows.tools" label="Windows Development Tools"/>
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_old_format.xml b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_old_format.xml
deleted file mode 100644
index dd10ef7..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_old_format.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<site url="www.tools.com/updateSite">
-
-   <feature type="my.feature.type" url="feature1.jar">
-      <category name="tools"/>
-      <category name="utilities"/>
-      <category name="windows.tools"/>
-   </feature>
-   
-   <feature type="" url="feature2.jar">
-      <category name="utilities"/>
-   </feature>
-  
-   <archive path="first/archive" url="archive1.jar"/>
-   <archive path="second/archive" url="archive2.jar"/>
-   
-   <category-def name="tools" label="Development Tools">
-      <description url="http://www.tools.com/tools">
-         This is description for tools
-      </description>
-   </category-def>
-   
-   <category-def name="utilities" label="Utilities">
-      <description url="utilities.html"/>
-   </category-def>
-   
-   <category-def name="windows.tools" label="Windows Development Tools"/>
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_with_type.xml b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_with_type.xml
deleted file mode 100644
index 2ee3a3f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/site_with_type.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<site url="http://www.tools.com/updateSite" type="some.other.site.type">
-
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/test.properties b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/test.properties
deleted file mode 100644
index d4d3b20..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/model/test.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-s1 = String 1
-s2 = String 2
-url1 = relative/index.html
-url2 = http://some.server/tools.html
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nativeTests/TestLocalSystemInfo.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nativeTests/TestLocalSystemInfo.java
deleted file mode 100644
index 9c3c39f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/nativeTests/TestLocalSystemInfo.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.eclipse.update.tests.nativeTests;
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-import java.io.File;
-
-import org.eclipse.update.configuration.LocalSystemInfo;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestLocalSystemInfo extends UpdateManagerTestCase {
-
-	/**
-	 * Test the natives
-	 */
-	public TestLocalSystemInfo(String arg0) {
-		super(arg0);
-	}
-
-	public void testNative() throws Exception {
-		// space
-		LocalSystemInfo system = new LocalSystemInfo();
-	
-		// mount point
-        String[] a = system.listMountPoints();
-        if (a==null) throw new Exception("cannot find native library");
-		System.out.println("Found "+a.length+" mount points.");
-		for (int i =0; i<a.length;i++){
-			System.out.print("#"+i+" - "+a[i]);
-			
-			File root = new File(a[i]);
-			String label = system.getLabel(root);
-			if (label==null) label="NO LABEL";
-			int type = system.getType(root);
-			long size = system.getFreeSpace(root);
-			System.out.println(" ->:"+label+":"+getType(type)+":"+getSize(size));
-		}
-	}
-	
-	private String getType(int type){
-		switch (type) {
-			case LocalSystemInfo.VOLUME_FIXED :
-				return "VOLUME FIXED";
-			case LocalSystemInfo.VOLUME_REMOTE :
-				return "VOLUME REMOTE";
-			case LocalSystemInfo.VOLUME_REMOVABLE :
-				return "VOLUME REMOVABLE";
-			case LocalSystemInfo.VOLUME_CDROM :
-				return "VOLUME CDROM";				
-			case LocalSystemInfo.VOLUME_UNKNOWN :
-				return "VOLUME UNKNOWN";
-			default :
-				return "WRONG VOLUME INFO";
-		}
-	}
-	
-	private String getSize(long size){
-		if (size==LocalSystemInfo.SIZE_UNKNOWN) return "UNKNOWN SIZE";
-		
-		long kb = size/(1024*1024);
-		return new String(size+" ("+kb+"MB)");
-	}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/AllParserTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/AllParserTests.java
deleted file mode 100644
index e1dfbe8..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/AllParserTests.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestCategories.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestCategories.java
deleted file mode 100644
index 55123cd..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestCategories.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.eclipse.update.tests.parser;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.FeatureReference;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestCategories extends UpdateManagerTestCase {
-	/**
-	 * Constructor for Test1
-	 */
-	public TestCategories(String arg0) {
-		super(arg0);
-	}
-
-	public void testCategories() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "xmls/site1/");
-		ISite remoteSite = SiteManager.getSite(remoteUrl);
-
-		IFeatureReference[] feature = remoteSite.getFeatureReferences();
-		//ICategory[] categories = remoteSite.getCategories();
-
-		ICategory featureCategory = feature[0].getCategories()[0];
-
-		assertEquals("UML tools", featureCategory.getLabel());
-
-	}
-
-	public void testOrderedCategories() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "xmls/site1/");
-		ISite remoteSite = SiteManager.getSite(remoteUrl);
-
-		ICategory[] categories = remoteSite.getCategories();
-		for (int i = 0; i < categories.length; i++) {
-			System.out.println("Cat ordered->" + categories[i].getName());
-		}
-
-		assertEquals("Eclipse tools", categories[1].getLabel());
-
-	}
-
-	public void testTranslatedCategories() throws Exception {
-
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE);
-
-		ICategory[] categories = remoteSite.getCategories();
-
-		assertEquals("Required Drivers", categories[0].getLabel());
-
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestFeatureParse.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestFeatureParse.java
deleted file mode 100644
index f28b875..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestFeatureParse.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestSiteParse.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestSiteParse.java
deleted file mode 100644
index 836c5e0..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/parser/TestSiteParse.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package org.eclipse.update.tests.parser;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.model.*;
-import org.eclipse.update.core.model.DefaultSiteParser;
-import org.eclipse.update.core.model.SiteModel;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.core.SiteFileFactory;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestSiteParse extends UpdateManagerTestCase {
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestSiteParse(String arg0) {
-		super(arg0);
-	}
-
-	public void testParse() throws Exception {
-
-		URL remoteUrl = new URL(SOURCE_FILE_SITE + "xmls/site1/");
-		ISite remoteSite = SiteManager.getSite(remoteUrl);
-
-		//IFeatureReference[] feature = remoteSite.getFeatureReferences();
-		//ICategory[] categories = remoteSite.getCategories();
-
-		String path = remoteUrl.getFile();
-		String path2 = remoteSite.getDescription().getURL().getFile();
-		assertEquals(path + "index.html", path2);
-
-	}
-
-	public void testNumberOfFeatures() throws Exception {
-
-		URL remoteURL = new URL("http", getHttpHost(), getHttpPort(), bundle.getString("HTTP_PATH_2"));
-		ISite remoteSite = SiteManager.getSite(remoteURL);
-
-		IFeatureReference[] feature = remoteSite.getFeatureReferences();
-		assertEquals(feature.length, 2);
-
-	}
-
-	public void testParseValid1() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site.xml");
-		DefaultSiteParser parser = new DefaultSiteParser(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);		
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] feature = remoteSite.getFeatureReferenceModels();
-		CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", feature.length == 6);
-		assertTrue("Wrong number of categories", categories.length == 3);
-		assertTrue("Wrong number of archives", archives.length == 0);
-
-		String path = new URL(SOURCE_FILE_SITE + "parsertests/").getFile();
-		String path2 = remoteSite.getDescriptionModel().getURL().getFile();
-		assertEquals(path + "index.html", path2);
-
-	}
-
-	public void testParseValid2() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/reddot.xml");
-		DefaultSiteParser parser = new DefaultSiteParser(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);		
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] feature = remoteSite.getFeatureReferenceModels();
-		CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", feature.length == 2);
-		assertTrue("Wrong number of categories", categories.length == 1);
-		assertTrue("Wrong number of archives", archives.length == 2);
-
-		String valideString = "This category contains all of the<currently>available versions of Red Dot feature.<greeting>Hello, world!</greeting>";
-		assertEquals(valideString,remoteSite.getCategoryModels()[0].getDescriptionModel().getAnnotation());
-
-		String path = new URL(SOURCE_FILE_SITE + "parsertests/").getFile();
-		String path2 = remoteSite.getDescriptionModel().getURL().getFile();
-		assertEquals(path + "index.html", path2);
-
-	}
-
-	public void testParseValid3() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/reddot1.xml");
-		DefaultSiteParser parser = new DefaultSiteParser(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);		
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] feature = remoteSite.getFeatureReferenceModels();
-		CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", feature.length == 2);
-		assertTrue("Wrong number of categories", categories.length == 1);
-		assertTrue("Wrong number of archives", archives.length == 2);
-
-		String valideString = "This category contains all of the<currently>available versions of Red Dot feature.";
-		assertEquals(valideString,remoteSite.getCategoryModels()[0].getDescriptionModel().getAnnotation());
-
-		String path = new URL(SOURCE_FILE_SITE + "parsertests/").getFile();
-		String path2 = remoteSite.getDescriptionModel().getURL().getFile();
-		assertEquals(path + "index.html", path2);
-
-	}
-
-	public void testParseValid4() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "SiteURLTest/data/site.xml");
-		DefaultSiteParser parser = new DefaultSiteParser(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);		
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] feature = remoteSite.getFeatureReferenceModels();
-		//CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", feature.length == 2);
-		assertTrue("Wrong number of archives", archives.length == 3);
-		
-		URL path1 = new URL(SOURCE_FILE_SITE+"SiteURLTest/data/artifacts/features/helpFeature.jar");
-		assertEquals(path1,feature[0].getURL());
-		URL path2 = new URL(SOURCE_FILE_SITE+"SiteURLTest/data/artifacts/plugins/help.jar");
-		assertEquals(path2,archives[0].getURL());
-		
-
-		String path = new URL(SOURCE_FILE_SITE + "SiteURLTest/data/info/").getFile();
-		String path3 = remoteSite.getDescriptionModel().getURL().getFile();
-		assertEquals(path + "siteInfo.html", path3);
-
-	}
-
-	public void testParseValid5() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site2.xml");
-		DefaultSiteParser parser = new DefaultSiteParser(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);		
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] featureRef = remoteSite.getFeatureReferenceModels();
-		//CategoryModel[] categories = remoteSite.getCategoryModels();
-		ArchiveReferenceModel[] archives = remoteSite.getArchiveReferenceModels();
-
-		assertTrue("Wrong number of features", featureRef.length == 1);
-		assertTrue("Wrong number of archives", archives.length == 0);
-		
-
-		((FeatureReference)featureRef[0]).getFeature();
-		
-	}
-	
-	public void testParseUnknownCategory() throws Exception {
-
-		URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/site3.xml");
-		DefaultSiteParser parser = new DefaultSiteParser(new SiteFileFactory());
-		URL resolvedURL = URLEncoder.encode(remoteURL);		
-		SiteModel remoteSite = parser.parse(resolvedURL.openStream());
-		remoteSite.resolve(remoteURL, null);
-
-		FeatureReferenceModel[] featureRef = remoteSite.getFeatureReferenceModels();
-		ICategory[] categories = ((FeatureReference)featureRef[0]).getCategories();
-		assertTrue(categories.length==0);
-	}	
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/AllReconciliationTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/AllReconciliationTests.java
deleted file mode 100644
index c620592..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/AllReconciliationTests.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.eclipse.update.tests.reconciliation;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.update.core.SiteManager;
-import org.eclipse.update.internal.core.UpdateManagerUtils;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import java.io.File;
-import junit.framework.*;
-
-/**
- * Manages the API tests
- */
-public class AllReconciliationTests extends UpdateManagerTestCase {
-	/**
-	 * Constructor
-	 */
-	public AllReconciliationTests(String name) {
-		super(name);
-	}
-	
-	/**
-	 * List of API tests
-	 */
-	public static Test suite() throws Exception {
-		TestSuite suite = new TestSuite();
-		suite.setName("API Tests");
-
-
-		suite.addTest(new TestSuite(TestSiteReconciliation.class));
-
-		return suite;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/TestSiteReconciliation.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/TestSiteReconciliation.java
deleted file mode 100644
index 6c11d6f..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/reconciliation/TestSiteReconciliation.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package org.eclipse.update.tests.reconciliation;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.boot.BootLoader;
-import org.eclipse.core.boot.IPlatformConfiguration;
-import org.eclipse.core.boot.IPlatformConfiguration.ISiteEntry;
-import org.eclipse.core.boot.IPlatformConfiguration.ISitePolicy;
-import org.eclipse.core.internal.boot.PlatformConfiguration;
-import org.eclipse.update.core.*;
-import org.eclipse.update.core.SiteManager;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.configuration.ILocalSite;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.core.InternalSiteManager;
-import org.eclipse.update.internal.core.SiteLocal;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestSiteReconciliation extends UpdateManagerTestCase {
-	
-
-	
-
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestSiteReconciliation(String arg0) {
-		super(arg0);
-	}
-
-	private void addConfigSite(int policy, URL url,String[] listOfPlugins) throws Exception {
-		String xmlFile = ((SiteLocal)SiteManager.getLocalSite()).getLocationURL().getFile();
-		UpdateManagerUtils.removeFromFileSystem(new File(xmlFile));		
-		InternalSiteManager.localSite=null;
-		// get new config object
-		PlatformConfiguration cfig = (PlatformConfiguration)BootLoader.getCurrentPlatformConfiguration();
-		ISitePolicy p1 = cfig.createSitePolicy(policy, listOfPlugins);	
-		ISiteEntry s1 = cfig.createSiteEntry(url,p1);
-		cfig.configureSite(s1);
-		
-	}
-	
-	private void removeConfigSite(URL url) throws Exception {
-		// get new config object
-		PlatformConfiguration cfig = (PlatformConfiguration)BootLoader.getCurrentPlatformConfiguration();
-		ISiteEntry s1 = cfig.findConfiguredSite(url);
-		cfig.unconfigureSite(s1);
-	}	
-	/**
-	 * Site 1 contains a feature which needs a plugin taht is not on the path when we start
-	 * it will never be configured
-	 */
-	public void testNewSiteInclude1() throws Exception {
-	
-		int policy  = ISitePolicy.USER_INCLUDE;
-		URL url = new URL("file",null,dataPath+"reconciliationSites/site1/");
-		String[] plugins = new String[]{};
-		addConfigSite(policy,url, plugins);
-
-		ILocalSite local = SiteManager.getLocalSite();
-		((SiteLocal)local).setStamp(0);
-		IConfiguredSite[] newSites = local.getCurrentConfiguration().getConfiguredSites();
-		IConfiguredSite newSite = null;
-		for (int i = 0; i < newSites.length; i++) {
-			if (newSites[i].getSite().getURL().equals(url))
-				newSite = newSites[i];
-		}
-		
-		if (newSite==null) fail("Site not found in configuration");
-		
-		IFeatureReference[] ref = newSite.getConfiguredFeatures();
-		assertEquals("Wrong number of configured features",0,ref.length);		
-		ref = ((ConfiguredSite)newSite).getConfigurationPolicy().getUnconfiguredFeatures();
-		assertEquals("Wrong number of unconfigured features",1,ref.length);		
-		
-		removeConfigSite(url);
-	}
-
-	public void testNewSiteExclude1() throws Exception {
-		
-		int policy  = ISitePolicy.USER_EXCLUDE;
-		URL url = new URL("file",null,dataPath+"reconciliationSites/site1/");
-		String[] plugins = new String[]{};
-		addConfigSite(policy,url, plugins);
-		
-		ILocalSite local = SiteManager.getLocalSite();
-		((SiteLocal)local).setStamp(0);		
-		IConfiguredSite[] newSites = local.getCurrentConfiguration().getConfiguredSites();
-		IConfiguredSite newSite = null;
-		for (int i = 0; i < newSites.length; i++) {
-			if (newSites[i].getSite().getURL().equals(url))
-				newSite = newSites[i];
-		}
-		
-		if (newSite==null) fail("Site not found in configuration");
-		
-		IFeatureReference[] ref = newSite.getConfiguredFeatures();
-		assertEquals("Wrong number of configured features",0,ref.length);		
-		ref = ((ConfiguredSite)newSite).getConfigurationPolicy().getUnconfiguredFeatures();
-		assertEquals("Wrong number of unconfigured features",1,ref.length);				
-		removeConfigSite(url);
-	}
-
-	/**
-	 * Site 2 contains a feature which needs a plugin taht is on the path when we start
-	 * it will be configured
-	 */
-	public void testNewSiteInclude2() throws Exception {
-		
-		int policy  = ISitePolicy.USER_INCLUDE;
-		URL url = new URL("file",null,dataPath+"reconciliationSites/site2/");
-		String[] plugins = new String[]{};
-		addConfigSite(policy,url, plugins);
-		ILocalSite local = SiteManager.getLocalSite();
-		((SiteLocal)local).setStamp(0);		
-		IConfiguredSite[] newSites = local.getCurrentConfiguration().getConfiguredSites();
-		IConfiguredSite newSite = null;
-		for (int i = 0; i < newSites.length; i++) {
-			if (newSites[i].getSite().getURL().equals(url))
-				newSite = newSites[i];
-		}
-		
-		if (newSite==null) fail("Site not found in configuration");
-		
-		IFeatureReference[] ref = newSite.getConfiguredFeatures();
-		assertEquals("Wrong number of configured features",1,ref.length);
-		ref = ((ConfiguredSite)newSite).getConfigurationPolicy().getUnconfiguredFeatures();
-		assertEquals("Wrong number of unconfigured features",0,ref.length);
-		
-		removeConfigSite(url);
-	}
-
-
-
-	public void testNewSiteExclude2() throws Exception {
-		
-		int policy  = ISitePolicy.USER_EXCLUDE;
-		URL url = new URL("file",null,dataPath+"reconciliationSites/site2/");
-		String[] plugins = new String[]{};
-		addConfigSite(policy,url, plugins);
-		ILocalSite local = SiteManager.getLocalSite();
-		((SiteLocal)local).setStamp(0);		
-		IConfiguredSite[] newSites = local.getCurrentConfiguration().getConfiguredSites();
-		IConfiguredSite newSite = null;
-		for (int i = 0; i < newSites.length; i++) {
-			if (newSites[i].getSite().getURL().equals(url))
-				newSite = newSites[i];
-		}
-		
-		if (newSite==null) fail("Site not found in configuration");
-		
-		IFeatureReference[] ref = newSite.getConfiguredFeatures();
-		assertEquals("Wrong number of configured features",1,ref.length);
-		ref = ((ConfiguredSite)newSite).getConfigurationPolicy().getUnconfiguredFeatures();
-		assertEquals("Wrong number of unconfigured features",0,ref.length);
-
-		removeConfigSite(url);
-	}
-
-
-	
-
-
-
-
-	
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/AllRegularInstallTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/AllRegularInstallTests.java
deleted file mode 100644
index d56dd55..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/AllRegularInstallTests.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/MultipleTestLocalSite.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/MultipleTestLocalSite.java
deleted file mode 100644
index 23f9a6e..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/MultipleTestLocalSite.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestDataEntryInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestDataEntryInstall.java
deleted file mode 100644
index 3260c3b..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestDataEntryInstall.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.eclipse.update.tests.regularInstall;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestDataEntryInstall extends UpdateManagerTestCase {
-	/**
-	 * Constructor for Test1
-	 */
-	public TestDataEntryInstall(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 * With site.xml
-	 */
-	public void testDataEntrySite() throws Exception {
-
-		//cleanup target 
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL =new File(dataPath + "dataEntrySiteTest/site1/site.xml").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE);
-		IFeature remoteFeature = null;
-		
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature();
-			localSite.install(remoteFeature, null,null);
-
-			// verify
-			String site = localSite.getURL().getFile();
-			INonPluginEntry[] entries = remoteFeature.getNonPluginEntries();
-			assertTrue("no data entry", (entries != null && entries.length != 0));
-			String pluginName = entries[0].getIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString()+File.separator+ pluginName);
-			assertTrue("data files not installed locally:"+pluginFile, pluginFile.exists());
-		} 
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}
-	
-	
-	/**
-	 * With site.xml
-	 */
-	public void testDataEntrySitePackaged() throws Exception {
-
-		//cleanup target 
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL =new File(dataPath + "dataEntrySiteTest/site2/site.xml").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE);
-		IFeature remoteFeature = null;
-		
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature();
-			localSite.install(remoteFeature, null,null);
-
-			// verify
-			String site = localSite.getURL().getFile();
-			INonPluginEntry[] entries = remoteFeature.getNonPluginEntries();
-			assertTrue("no data entry", (entries != null && entries.length != 0));
-			entries[0].getIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString()+File.separator+ "nondata"+File.separator+"file1.zip");
-			assertTrue("Data file inside the jar not installed locally:"+pluginFile, pluginFile.exists());
-			pluginFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString()+File.separator+ "file.zip");
-			assertTrue("Data file outside the jar not installed locally:"+pluginFile, pluginFile.exists());
-			
-		} 
-		
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}	
-	
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutableInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutableInstall.java
deleted file mode 100644
index 5dfe548..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutableInstall.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutablePackagedInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutablePackagedInstall.java
deleted file mode 100644
index 6c8a7bb..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestExecutablePackagedInstall.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.eclipse.update.tests.regularInstall;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestExecutablePackagedInstall extends UpdateManagerTestCase {
-	/**
-	 * Constructor for Test1
-	 */
-	public TestExecutablePackagedInstall(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 * With site.xml
-	 */
-	public void testFilePackageExecutableFeatureSite() throws Exception {
-
-		//cleanup target  
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL = new File(dataPath + "ExecutableFeaturePackagedSite/data2/site.xml").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE);
-		IFeature remoteFeature = null;
-		
-		// at least one executable feature and on packaged
-		boolean execFeature = false;
-		boolean packFeature = false;
-
-		if (featuresRef.length==0) fail ("no feature found");
-	
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature();
-			localSite.install(remoteFeature, null,null);
-			
-			if (remoteFeature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider) packFeature = true;
-			if (remoteFeature.getFeatureContentProvider() instanceof FeatureExecutableContentProvider) execFeature = true;
-
-			// verify
-			String site = localSite.getURL().getFile();
-			IPluginEntry[] entries = remoteFeature.getPluginEntries();
-			assertTrue("no plugins entry", (entries != null && entries.length != 0));
-			String pluginName = entries[0].getVersionedIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			assertTrue("plugin files not installed locally:"+pluginFile, pluginFile.exists());
-
-			File featureFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString());
-			assertTrue("feature info not installed locally:"+featureFile, featureFile.exists());
-
-			File featureFileXML = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString() + File.separator + "feature.xml");
-			assertTrue("feature info not installed locally: no feature.xml", featureFileXML.exists());
-		}
-
-		if (!execFeature && !packFeature){
-			fail("cannot find one executable and one package feature on teh site");
-		}
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}
-	
-	
-	/**
-	 * Without site.xml
-	 */
-	public void testFileNoSiteXMLSite() throws Exception {
-
-		//cleanup target 
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL = new File(dataPath + "ExecutableFeaturePackagedSite/data/").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE);
-		IFeature remoteFeature = null;
-		
-		// at least one executable feature and on packaged
-		boolean execFeature = false;
-		boolean packFeature = false;
-
-		if (featuresRef.length==0) fail ("no feature found");
-	
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature();
-			if (remoteFeature!=null){
-			localSite.install(remoteFeature,null, null);
-			
-			if (remoteFeature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider) packFeature = true;
-			if (remoteFeature.getFeatureContentProvider() instanceof FeatureExecutableContentProvider) execFeature = true;
-
-			// verify
-			String site = localSite.getURL().getFile();
-			IPluginEntry[] entries = remoteFeature.getPluginEntries();
-			assertTrue("no plugins entry", (entries != null && entries.length != 0));
-			String pluginName = entries[0].getVersionedIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			assertTrue("plugin files not installed locally:"+pluginFile, pluginFile.exists());
-
-			File featureFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString());
-			assertTrue("feature info not installed locally:"+featureFile, featureFile.exists());
-
-			File featureFileXML = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString() + File.separator + "feature.xml");
-			assertTrue("feature info not installed locally: no feature.xml", featureFileXML.exists());
-			}
-		}
-
-		if (!execFeature && !packFeature){
-			fail("cannot find one executable and one package feature on teh site");
-		}
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}
-	
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestGetFeature.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestGetFeature.java
deleted file mode 100644
index 121e1b5..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestGetFeature.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstall.java
deleted file mode 100644
index 6825813..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstall.java
+++ /dev/null
@@ -1,311 +0,0 @@
-package org.eclipse.update.tests.regularInstall;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestInstall extends UpdateManagerTestCase {
-
-	/**
-	 * 
-	 */
-	public static final String PACKAGED_FEATURE_TYPE = "packaged"; //$NON-NLS-1$
-
-	public class Listener implements IConfiguredSiteChangedListener {
-
-		public boolean notified = false;
-
-		public void featureInstalled(IFeature feature) {
-			notified = true;
-			System.out.println("Notified DefaultFeature Installed");
-		}
-
-		public void featureRemoved(IFeature feature) {
-		}
-
-		public void featureConfigured(IFeature feature) {
-		};
-		public void featureUnconfigured(IFeature feature) {
-		};
-
-		public boolean isNotified() {
-			return notified;
-		}
-	}
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestInstall(String arg0) {
-		super(arg0);
-	}
-
-	private IFeature getFeature1(ISite site)
-		throws MalformedURLException, CoreException {
-		FeatureReference ref = new FeatureReference();
-		ref.setSite(site);
-		ref.setURLString("features/org.eclipse.update.core.tests.feature1_1.0.4.jar");
-		ref.setType(getDefaultInstallableFeatureType());
-		ref.resolve(site.getURL(), null);
-		return ref.getFeature();
-	}
-
-	public void testFileSite() throws Exception {
-
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE);
-		IFeature remoteFeature = getFeature1(remoteSite);
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE);
-		localSite.install(remoteFeature, null, null);
-
-		// verify
-		String site = localSite.getURL().getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin files not installed locally:"+pluginFile, pluginFile.exists());
-		File pluginXMLFile =
-			new File(
-				site,
-				Site.DEFAULT_PLUGIN_PATH + pluginName + File.separator + "plugin.xml");
-		assertTrue("plugin.xml file not installed locally", pluginXMLFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue(
-			"feature info not installed locally:" + featureFile,
-			featureFile.exists());
-		//cleanup
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-
-	}
-
-	/**
-	 * 
-	 */
-	public void testHTTPSite() throws Exception {
-
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE);
-		IFeatureReference[] features = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = null;
-
-		if (features == null || features.length == 0)
-			fail("No features on the site");
-
-		for (int i = 0; i < features.length; i++) {
-			if (features[i].getURL().toExternalForm().endsWith("features2.jar")) {
-				remoteFeature = features[i].getFeature();
-				break;
-			}
-		}
-
-		assertNotNull("Cannot find feature2.jar on site", remoteFeature);
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE);
-		localSite.install(remoteFeature, null, null);
-
-		// feature2.jar should not be in the local site
-		IFeatureReference[] localFeatures = localSite.getFeatureReferences();
-		if (localFeatures == null || localFeatures.length == 0)
-			fail("No features on the target site");
-
-		boolean found = false;
-		for (int i = 0; i < localFeatures.length; i++) {
-			if (localFeatures[i].getURL().toExternalForm().endsWith("features2.jar")) {
-				found = true;
-				break;
-			}
-		}
-
-		assertTrue(
-			"Found feature2.jar on target site. Target site feature ref shouldnot contain JAR file",
-			!found);
-
-		// check
-		String site = localSite.getURL().getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin info not installed locally:"+pluginFile, pluginFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue("feature info not installed locally", featureFile.exists());
-
-		//localSite.save();
-
-		//cleanup
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-	}
-
-	public void testInstall() throws Exception {
-
-		// cleanup local files...
-		URL localURL = ((SiteLocal) SiteManager.getLocalSite()).getLocationURL();
-		File localFile =
-			new File(new URL(localURL, SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-
-		URL INSTALL_SITE = null;
-		try {
-			INSTALL_SITE =
-				new URL("http", getHttpHost(), getHttpPort(), bundle.getString("HTTP_PATH_2"));
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-
-		ISite remoteSite = SiteManager.getSite(INSTALL_SITE);
-		IFeatureReference[] features = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = null;
-
-		if (features == null || features.length == 0)
-			fail("No features on the site");
-
-		for (int i = 0; i < features.length; i++) {
-			if (features[i].getURL().toExternalForm().endsWith("helpFeature.jar")) {
-				remoteFeature = features[i].getFeature();
-				break;
-			}
-		}
-
-		assertNotNull("Cannot find help.jar on site", remoteFeature);
-		ILocalSite localSite = SiteManager.getLocalSite();
-		IConfiguredSite site =
-			localSite.getCurrentConfiguration().getConfiguredSites()[0];
-		Listener listener = new Listener();
-		site.addConfiguredSiteChangedListener(listener);
-
-		site.install(remoteFeature, null, null);
-
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-
-		String sitePath = site.getSite().getURL().getFile();
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(sitePath, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin info not installed locally", pluginFile.exists());
-
-		File featureFile =
-			new File(
-				sitePath,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue("feature info not installed locally", featureFile.exists());
-
-		//cleanup
-		File file =
-			new File(
-				site.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier());
-		UpdateManagerUtils.removeFromFileSystem(file);
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(
-			new File(
-				((InstallConfiguration) localSite.getCurrentConfiguration())
-					.getURL()
-					.getFile()));
-
-		site.removeConfiguredSiteChangedListener(listener);
-		assertTrue("Listener hasn't received notification", listener.isNotified());
-	}
-
-	public void testFileSiteWithoutSiteXML() throws Exception {
-
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE);
-		IFeature remoteFeature = getFeature1(remoteSite);
-		IConfiguredSite localSite =
-			SiteManager.getLocalSite().getCurrentConfiguration().getConfiguredSites()[0];
-		localSite.getSite().install(remoteFeature, null, null);
-
-		IFeatureReference[] features = localSite.getSite().getFeatureReferences();
-		if (features.length == 0)
-			fail("The local site does not contain feature, should not contain an XML file but features should be found anyway by parsing");
-		if (localSite.getSite().getArchives().length == 0)
-			fail("The local site does not contain archives, should not contain an XML file but archives should be found anyway by parsing");
-
-		//cleanup
-		File file =
-			new File(
-				localSite.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier());
-		UpdateManagerUtils.removeFromFileSystem(file);
-		file =
-			new File(
-				localSite.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_PLUGIN_PATH
-					+ "org.eclipse.update.core.tests.feature1.plugin1_3.5.6");
-		UpdateManagerUtils.removeFromFileSystem(file);
-		file =
-			new File(
-				localSite.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_PLUGIN_PATH
-					+ "org.eclipse.update.core.tests.feature1.plugin2_5.0.0");
-		UpdateManagerUtils.removeFromFileSystem(file);
-		File localFile =
-			new File(
-				new URL(
-					((SiteLocal) SiteManager.getLocalSite()).getLocationURL(),
-					SiteLocal.SITE_LOCAL_FILE)
-					.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-
-		try {
-			SiteManager.getSite(new URL("http://www.eclipse.org/"));
-			// FIXME apparently works !!!
-			//		fail("The site contains site.xml... it should be an HTTP site without an XML file");			
-		} catch (CoreException e) {
-			// expected
-		}
-
-	}
-
-	/**
-	* 
-	*/
-	private Feature createPackagedFeature(URL url, ISite site)
-		throws CoreException {
-		String packagedFeatureType = site.DEFAULT_PACKAGED_FEATURE_TYPE;
-		Feature result = null;
-		if (packagedFeatureType != null) {
-			IFeatureFactory factory =
-				FeatureTypeFactory.getInstance().getFactory(packagedFeatureType);
-			result = (Feature) factory.createFeature(url, site);
-		}
-		return result;
-	}
-	/*
-	 * @see ISite#getDefaultInstallableFeatureType()
-	 */
-	public String getDefaultInstallableFeatureType() {
-		String pluginID =
-			UpdateManagerPlugin.getPlugin().getDescriptor().getUniqueIdentifier() + ".";
-		return pluginID + PACKAGED_FEATURE_TYPE;
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstallURLSIteXML.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstallURLSIteXML.java
deleted file mode 100644
index 6c109a8..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestInstallURLSIteXML.java
+++ /dev/null
@@ -1,310 +0,0 @@
-package org.eclipse.update.tests.regularInstall;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestInstallURLSIteXML extends UpdateManagerTestCase {
-
-	/**
-	 * 
-	 */
-	public static final String PACKAGED_FEATURE_TYPE = "packaged"; //$NON-NLS-1$	
-
-	public class Listener implements IConfiguredSiteChangedListener {
-
-		public boolean notified = false;
-
-		public void featureInstalled(IFeature feature) {
-			notified = true;
-			System.out.println("Notified DefaultFeature Installed");
-		}
-
-		public void featureRemoved(IFeature feature) {
-		}
-
-		public void featureConfigured(IFeature feature) {
-		};
-		public void featureUnconfigured(IFeature feature) {
-		};
-
-		public boolean isNotified() {
-			return notified;
-		}
-	}
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestInstallURLSIteXML(String arg0) {
-		super(arg0);
-	}
-
-	private IFeature getFeature1(ISite site)
-		throws MalformedURLException, CoreException {
-		FeatureReference ref = new FeatureReference();
-		ref.setSite(site);
-		ref.setURLString("features/org.eclipse.update.core.tests.feature1_1.0.4.jar");
-		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-		ref.resolve(site.getURL(), null);
-		return ref.getFeature();
-	}
-
-	public void testFileSite() throws Exception {
-
-		ISite remoteSite =
-			SiteManager.getSite(new URL(SOURCE_FILE_SITE, Site.SITE_XML));
-		IFeature remoteFeature = getFeature1(remoteSite);
-		ISite localSite = SiteManager.getSite(new URL(TARGET_FILE_SITE, Site.SITE_XML));
-		localSite.install(remoteFeature, null, null);
-
-		// verify
-		String site = TARGET_FILE_SITE.getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin files not installed locally", pluginFile.exists());
-		File pluginXMLFile =
-			new File(
-				site,
-				Site.DEFAULT_PLUGIN_PATH + pluginName + File.separator + "plugin.xml");
-		assertTrue("plugin.xml file not installed locally", pluginXMLFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue(
-			"feature info not installed locally:" + featureFile,
-			featureFile.exists());
-		//cleanup
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-
-	}
-
-	/**
-	 * 
-	 */
-	public void testHTTPSite() throws Exception {
-
-		ISite remoteSite =
-			SiteManager.getSite(new URL(SOURCE_HTTP_SITE, Site.SITE_XML));
-		IFeatureReference[] features = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = null;
-
-		if (features == null || features.length == 0)
-			fail("No features on the site");
-
-		for (int i = 0; i < features.length; i++) {
-			if (features[i].getURL().toExternalForm().endsWith("features2.jar")) {
-				remoteFeature = features[i].getFeature();
-				break;
-			}
-		}
-
-		assertNotNull("Cannot find feature2.jar on site", remoteFeature);
-		ISite localSite = SiteManager.getSite(new URL(TARGET_FILE_SITE, Site.SITE_XML));
-		localSite.install(remoteFeature, null, null);
-
-		// feature2.jar should not be in the local site
-		IFeatureReference[] localFeatures = localSite.getFeatureReferences();
-		if (localFeatures == null || localFeatures.length == 0)
-			fail("No features on the target site");
-
-		boolean found = false;
-		for (int i = 0; i < localFeatures.length; i++) {
-			if (localFeatures[i].getURL().toExternalForm().endsWith("features2.jar")) {
-				found = true;
-				break;
-			}
-		}
-
-		assertTrue(
-			"Found feature2.jar on target site. Target site feature ref shouldnot contain JAR file",
-			!found);
-
-		// check
-		String site = TARGET_FILE_SITE.getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin info not installed locally", pluginFile.exists());
-
-		File featureFile =
-			new File(
-				site,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue("feature info not installed locally", featureFile.exists());
-
-		//localSite.save();
-
-		//cleanup
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(localSite.getURL().getFile()));
-	}
-
-	public void testInstall() throws Exception {
-
-		// cleanup local files...
-		File localFile =
-			new File(
-				new URL(
-					((SiteLocal) SiteManager.getLocalSite()).getLocationURL(),
-					SiteLocal.SITE_LOCAL_FILE)
-					.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		InternalSiteManager.localSite = null;
-
-		URL INSTALL_SITE = null;
-		try {
-			INSTALL_SITE =
-				new URL("http", getHttpHost(), getHttpPort(), bundle.getString("HTTP_PATH_2"));
-		} catch (Exception e) {
-			fail(e.toString());
-			e.printStackTrace();
-		}
-
-		ISite remoteSite = SiteManager.getSite(INSTALL_SITE);
-		IFeatureReference[] features = remoteSite.getFeatureReferences();
-		IFeature remoteFeature = null;
-
-		if (features == null || features.length == 0)
-			fail("No features on the site");
-
-		for (int i = 0; i < features.length; i++) {
-			if (features[i].getURL().toExternalForm().endsWith("helpFeature.jar")) {
-				remoteFeature = features[i].getFeature();
-				break;
-			}
-		}
-
-		assertNotNull("Cannot find help.jar on site", remoteFeature);
-		ILocalSite localSite = SiteManager.getLocalSite();
-		IConfiguredSite site =
-			localSite.getCurrentConfiguration().getConfiguredSites()[0];
-		Listener listener = new Listener();
-		site.addConfiguredSiteChangedListener(listener);
-
-		site.install(remoteFeature, null, null);
-
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-
-		String sitePath = site.getSite().getURL().getFile();
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-		File pluginFile = new File(sitePath, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin info not installed locally", pluginFile.exists());
-
-		File featureFile =
-			new File(
-				sitePath,
-				Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier().toString());
-		assertTrue("feature info not installed locally", featureFile.exists());
-
-		//cleanup
-		File file =
-			new File(
-				site.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier());
-		UpdateManagerUtils.removeFromFileSystem(file);
-		UpdateManagerUtils.removeFromFileSystem(pluginFile);
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(
-			new File(
-				((InstallConfiguration) localSite.getCurrentConfiguration())
-					.getURL()
-					.getFile()));
-
-		site.removeConfiguredSiteChangedListener(listener);
-		assertTrue("Listener hasn't received notification", listener.isNotified());
-	}
-
-	public void testFileSiteWithoutSiteXML() throws Exception {
-
-		ISite remoteSite =
-			SiteManager.getSite(new URL(SOURCE_FILE_SITE, Site.SITE_XML));
-		IFeature remoteFeature = getFeature1(remoteSite);
-		IConfiguredSite localSite =
-			SiteManager.getLocalSite().getCurrentConfiguration().getConfiguredSites()[0];
-		localSite.getSite().install(remoteFeature, null, null);
-
-		IFeatureReference[] features = localSite.getSite().getFeatureReferences();
-		if (features.length == 0)
-			fail("The local site does not contain feature, should not contain an XML file but features should be found anyway by parsing");
-		if (localSite.getSite().getArchives().length == 0)
-			fail("The local site does not contain archives, should not contain an XML file but archives should be found anyway by parsing");
-
-		//cleanup
-		File file =
-			new File(
-				localSite.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_INSTALLED_FEATURE_PATH
-					+ remoteFeature.getVersionedIdentifier());
-		UpdateManagerUtils.removeFromFileSystem(file);
-		file =
-			new File(
-				localSite.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_PLUGIN_PATH
-					+ "org.eclipse.update.core.tests.feature1.plugin1_3.5.6");
-		UpdateManagerUtils.removeFromFileSystem(file);
-		file =
-			new File(
-				localSite.getSite().getURL().getFile()
-					+ File.separator
-					+ Site.DEFAULT_PLUGIN_PATH
-					+ "org.eclipse.update.core.tests.feature1.plugin2_5.0.0");
-		UpdateManagerUtils.removeFromFileSystem(file);
-		File localFile =
-			new File(
-				new URL(
-					((SiteLocal) SiteManager.getLocalSite()).getLocationURL(),
-					SiteLocal.SITE_LOCAL_FILE)
-					.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-
-	}
-
-	/**
-	* 
-	*/
-	private Feature createPackagedFeature(URL url, ISite site)
-		throws CoreException {
-		String packagedFeatureType = ISite.DEFAULT_PACKAGED_FEATURE_TYPE;
-		Feature result = null;
-		if (packagedFeatureType != null) {
-			IFeatureFactory factory =
-				FeatureTypeFactory.getInstance().getFactory(packagedFeatureType);
-			result = (Feature) factory.createFeature(url, site);
-		}
-		return result;
-	}
-	/*
-	 * @see ISite#getDefaultInstallableFeatureType()
-	 */
-	public String getDefaultInstallableFeatureType() {
-		String pluginID =
-			UpdateManagerPlugin.getPlugin().getDescriptor().getUniqueIdentifier() + ".";
-		return pluginID + PACKAGED_FEATURE_TYPE;
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestLocalSite.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestLocalSite.java
deleted file mode 100644
index c266fd5..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestLocalSite.java
+++ /dev/null
@@ -1,306 +0,0 @@
-package org.eclipse.update.tests.regularInstall;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved. 
- */
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.boot.IPlatformConfiguration;
-import org.eclipse.update.core.*;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.model.*;
-import org.eclipse.update.internal.model.ConfigurationPolicyModel;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-
-public class TestLocalSite extends UpdateManagerTestCase {
-	
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestLocalSite(String arg0) {
-		super(arg0);
-	}
-	
-	public void testCreationConfigFile() throws Exception {
-
-		//clean up
-		SiteLocal siteLocal = (SiteLocal)SiteManager.getLocalSite();
-		URL newURL = new URL(siteLocal.getLocationURL(),SiteLocal.SITE_LOCAL_FILE);
-		File localFile = new File(newURL.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)siteLocal.getCurrentConfiguration()).getURL().getFile()));	
-		InternalSiteManager.localSite=null;	
-
-
-		ILocalSite site = SiteManager.getLocalSite();
-		site.save();
-		URL location = ((SiteLocal)site).getLocationURL();
-		String fileName = UpdateManagerUtils.getLocalRandomIdentifier(SiteLocal.DEFAULT_CONFIG_FILE, site.getCurrentConfiguration().getCreationDate());
-		String filePath = new URL(location,fileName).getFile();
-		File file = new File(filePath);
-		assertTrue("config file hasn't been saved in :"+filePath, file.exists());
-		assertTrue("Local site hasn't been saved in :"+localFile.getAbsolutePath(),localFile.exists());
-		
-		// cleanup
-		UpdateManagerUtils.removeFromFileSystem(file);
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		
-
-	}
-	
-	public void testDefaultConfigFile() throws Exception {
-
-		//clean up
-		SiteLocal siteLocal = (SiteLocal)SiteManager.getLocalSite();
-		URL newURL = new URL(siteLocal.getLocationURL(),SiteLocal.SITE_LOCAL_FILE);
-		File localFile = new File(newURL.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)siteLocal.getCurrentConfiguration()).getURL().getFile()));	
-		InternalSiteManager.localSite=null;
-
-		ILocalSite site = SiteManager.getLocalSite();
-		assertTrue("The local site does not contain an history of install configuration",site.getConfigurationHistory().length!=0);
-		assertTrue("The local site does not contain an current install configuration",site.getCurrentConfiguration()!=null);
-		assertTrue("The local site does not contain a default configuration site for the current install config",site.getCurrentConfiguration().getConfiguredSites().length!=0);
-		
-		System.out.println("Default Config Site is :"+site.getCurrentConfiguration().getConfiguredSites()[0].getSite().getURL().toExternalForm());
-		
-		// cleanup
-		URL location = ((SiteLocal)site).getLocationURL();		
-		String filePath = new URL(location,SiteLocal.DEFAULT_CONFIG_FILE).getFile();
-		File file = new File(filePath);
-		UpdateManagerUtils.removeFromFileSystem(file);		
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		
-
-	}
-	
-	public void testInstallFeatureSaveConfig() throws Exception {
-
-		//clean up
-		SiteLocal siteLocal = (SiteLocal)SiteManager.getLocalSite();
-		URL newURL = new URL(siteLocal.getLocationURL(),SiteLocal.SITE_LOCAL_FILE);
-		File localFile = new File(newURL.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)siteLocal.getCurrentConfiguration()).getURL().getFile()));	
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE);
-		IFeature feature = remoteSite.getFeatureReferences()[0].getFeature();
-		int oldNumber = site.getCurrentConfiguration().getConfiguredSites().length;
-		
-		// we are not checking if this is read only
-		IInstallConfiguration newConfig = site.cloneCurrentConfiguration();
-		newConfig.setLabel("new Label");		
-		//IInstallConfiguration newConfig = site.getCurrentConfiguration();
-		IConfiguredSite configSite = newConfig.getConfiguredSites()[0];
-		ConfigurationPolicyModel configPolicy = new BaseSiteLocalFactory().createConfigurationPolicyModel();
-		configPolicy.setPolicy(IPlatformConfiguration.ISitePolicy.USER_INCLUDE);
-		((ConfiguredSite)configSite).setConfigurationPolicy((ConfigurationPolicy)configPolicy);
-		site.addConfiguration(newConfig);		
-		configSite.install(feature,null,null);
-
-				
-		// teh current one points to a real fature
-		// does not throw error.
-		IConfiguredSite configSite2 = site.getCurrentConfiguration().getConfiguredSites()[0];
-		IFeatureReference ref = configSite2.getConfiguredFeatures()[0];
-		IFeature feature2 = ref.getFeature();
-		//String configuredFeature = feature2.getLabel();
-
-		assertEquals(feature2.getVersionedIdentifier().toString(),"org.eclipse.update.core.tests.feature3_1.0.0");
-		assertTrue("Wrong id  version of feature",feature2.getVersionedIdentifier().toString().equalsIgnoreCase("org.eclipse.update.core.tests.feature3_1.0.0"));
-		
-		// only one feature configured
-		assertTrue("too many features configured",configSite2.getConfiguredFeatures().length==1);
-		
-		// no feature unconfigured
-		assertTrue("too many unconfigured features",((ConfiguredSite)configSite2).getConfigurationPolicy().getUnconfiguredFeatures().length==0);
-		
-		// test only 2 install config in local site
-		assertTrue("wrong number of history in Local site",site.getConfigurationHistory().length==2);
-		
-		// test same # of sites in current config
-		assertTrue("Wrong number of config sites in current config",site.getCurrentConfiguration().getConfiguredSites().length==oldNumber);
-		
-		//test only one feature for the site
-		assertTrue("wrong number of configured features for config site",site.getCurrentConfiguration().getConfiguredSites()[0].getConfiguredFeatures().length==1);
-		
-		// test only 2 activities
-		assertTrue("Wrong number of activities for install config",site.getCurrentConfiguration().getActivities().length==2);
-
-		site.save();		
-
-		// check
-		// there are 2 configuration
-		String time = ""+site.getCurrentConfiguration().getCreationDate().getTime();
-		URL location = ((SiteLocal)site).getLocationURL();
-		File file = new File(new URL(location,"Config"+time+".xml").getFile());
-		assertTrue("new configuration does not exist", file.exists());
-		
-		// cleanup
-		localFile = new File(new URL(location,SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		localFile = new File(new URL(location,SiteLocal.DEFAULT_CONFIG_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		localFile = new File(new URL(location,Site.DEFAULT_FEATURE_PATH+File.separator+feature.getVersionedIdentifier().toString()).getFile());		
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		localFile = new File(new URL(location,Site.DEFAULT_FEATURE_PATH+File.separator+feature2.getVersionedIdentifier().toString()).getFile());		
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		UpdateManagerUtils.removeFromFileSystem(file);		
-		localFile = new File(feature2.getURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-	}
-	
-	public void testRetriveConfig() throws Exception {
-
-		//clean up
-		SiteLocal siteLocal = (SiteLocal)SiteManager.getLocalSite();
-		URL newURL = new URL(siteLocal.getLocationURL(),SiteLocal.SITE_LOCAL_FILE);
-		File localFile = new File(newURL.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)siteLocal.getCurrentConfiguration()).getURL().getFile()));	
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE);
-		IFeature feature = remoteSite.getFeatureReferences()[0].getFeature();
-		int oldNumber = site.getCurrentConfiguration().getConfiguredSites().length;		
-		
-		// we are not checking if this is read only
-		IInstallConfiguration newConfig = site.cloneCurrentConfiguration();
-		newConfig.setLabel("new Label");		
-		IConfiguredSite configSite = newConfig.getConfiguredSites()[0];
-		ConfigurationPolicyModel configPolicy = new BaseSiteLocalFactory().createConfigurationPolicyModel();
-		configPolicy.setPolicy(IPlatformConfiguration.ISitePolicy.USER_INCLUDE);
-		((ConfiguredSite)configSite).setConfigurationPolicy((ConfigurationPolicy)configPolicy);		
-		site.addConfiguration(newConfig);		
-		configSite.install(feature,null,null);
-		site.save();
-		
-		// we created the second xml file
-
-		//do not cleanup, we want to reuse previously created local site
-		// but force re-read of xml File
-		InternalSiteManager.localSite=null;
-		site = SiteManager.getLocalSite();
-		
-		// check
-		// there are 2 configuration
-		String time = ""+site.getCurrentConfiguration().getCreationDate().getTime();
-		URL location = ((SiteLocal)site).getLocationURL();		
-		File file = new File(new URL(location,"Config"+time+".xml").getFile());
-		assertTrue("new configuration does not exist", file.exists());
-		
-		// teh current one points to a real fature
-		// does not throw error.
-		IConfiguredSite configSite2 = site.getCurrentConfiguration().getConfiguredSites()[0];
-		IFeatureReference ref = configSite2.getConfiguredFeatures()[0];
-		IFeature feature2 = ref.getFeature();
-		//String configuredFeature = feature2.getLabel();
-		assertEquals(feature2.getVersionedIdentifier().toString(),"org.eclipse.update.core.tests.feature3_1.0.0");
-		assertTrue("Wrong id  version of feature",feature2.getVersionedIdentifier().toString().equalsIgnoreCase("org.eclipse.update.core.tests.feature3_1.0.0"));
-		
-		// test only 2 install config in local site
-		assertTrue("wrong number of history in Local site",site.getConfigurationHistory().length==2);
-		
-		// test # of sites in current config
-		assertTrue("Wrong number of config sites in current config",site.getCurrentConfiguration().getConfiguredSites().length==oldNumber);
-		
-		//test only one feature for the site
-		assertTrue("wrong number of configured features for config site",site.getCurrentConfiguration().getConfiguredSites()[0].getConfiguredFeatures().length==1);
-		
-		// test only 2 activities
-		assertTrue("Wrong number of activities for install config",site.getCurrentConfiguration().getActivities().length==2);
-		
-		
-		// cleanup
-		localFile = new File(new URL(location,SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		localFile = new File(new URL(location,SiteLocal.DEFAULT_CONFIG_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);			
-		localFile = new File(new URL(location,Site.DEFAULT_FEATURE_PATH+File.separator+feature.getVersionedIdentifier().toString()).getFile());		
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)site.getCurrentConfiguration()).getURL().getFile()));				
-		UpdateManagerUtils.removeFromFileSystem(file);		
-	}
-
-	public void testRetriveConfigHTTPInstall() throws Exception {
-
-		//clean up
-		SiteLocal siteLocal = (SiteLocal)SiteManager.getLocalSite();
-		URL newURL = new URL(siteLocal.getLocationURL(),SiteLocal.SITE_LOCAL_FILE);
-		File localFile = new File(newURL.getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)siteLocal.getCurrentConfiguration()).getURL().getFile()));	
-		InternalSiteManager.localSite=null;		
-
-		ILocalSite site = SiteManager.getLocalSite();
-		ISite remoteSite = SiteManager.getSite(SOURCE_HTTP_SITE);
-		IFeature feature = remoteSite.getFeatureReferences()[0].getFeature();
-		
-		// we are not checking if this is read only
-		IInstallConfiguration newConfig = site.cloneCurrentConfiguration();
-		newConfig.setLabel("new Label");		
-		IConfiguredSite configSite = newConfig.getConfiguredSites()[0];
-		ConfigurationPolicyModel configPolicy = new BaseSiteLocalFactory().createConfigurationPolicyModel();
-		configPolicy.setPolicy(IPlatformConfiguration.ISitePolicy.USER_INCLUDE);
-		((ConfiguredSite)configSite).setConfigurationPolicy((ConfigurationPolicy)configPolicy);		
-		site.addConfiguration(newConfig);		
-		configSite.install(feature,null,null);
-		site.save();
-
-		//do not cleanup, we want to reuse previously created local site
-		// but force re-read of xml File
-		InternalSiteManager.localSite=null;
-		site = SiteManager.getLocalSite();
-		feature = remoteSite.getFeatureReferences()[0].getFeature();
-		int oldNumber = site.getCurrentConfiguration().getConfiguredSites().length;		
-		
-		// check
-		// there are 2 configuration
-		String time = ""+site.getCurrentConfiguration().getCreationDate().getTime();
-		URL location = ((SiteLocal)site).getLocationURL();		
-		File file = new File(new URL(location,"Config"+time+".xml").getFile());
-		assertTrue("new configuration does not exist", file.exists());
-		
-		// teh current one points to a real fature
-		// does not throw error.
-		IConfiguredSite configSite2 = site.getCurrentConfiguration().getConfiguredSites()[0];
-		IFeatureReference ref = configSite2.getConfiguredFeatures()[0];
-		IFeature feature2 = ref.getFeature();
-		//String configuredFeature = feature2.getLabel();
-		assertEquals(feature2.getVersionedIdentifier().toString(),"org.test1.ident1_1.0.0");
-		assertTrue("Wrong id  version of feature",feature2.getVersionedIdentifier().toString().equalsIgnoreCase("org.test1.ident1_1.0.0"));
-		
-		// test only 2 install config in local site
-		assertTrue("wrong number of history in Local site",site.getConfigurationHistory().length==2);
-		
-		// test same number of sites in current config
-		assertTrue("Wrong number of config sites in current config",site.getCurrentConfiguration().getConfiguredSites().length==oldNumber);
-		
-		//test only one feature for the site
-		assertTrue("wrong number of configured features for config site",site.getCurrentConfiguration().getConfiguredSites()[0].getConfiguredFeatures().length==1);
-		
-		// test only 2 activities
-		assertTrue("Wrong number of activities for install config",site.getCurrentConfiguration().getActivities().length==2);
-		
-		
-		// cleanup
-		localFile = new File(new URL(location,SiteLocal.SITE_LOCAL_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);		
-		localFile = new File(new URL(location,SiteLocal.DEFAULT_CONFIG_FILE).getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		localFile = new File(new URL(location,Site.DEFAULT_FEATURE_PATH+File.separator+feature.getVersionedIdentifier().toString()).getFile());		
-		UpdateManagerUtils.removeFromFileSystem(localFile);	
-		UpdateManagerUtils.removeFromFileSystem(new File(((InstallConfiguration)site.getCurrentConfiguration()).getURL().getFile()));						
-		UpdateManagerUtils.removeFromFileSystem(file);		
-		localFile = new File(feature2.getURL().getFile());
-		UpdateManagerUtils.removeFromFileSystem(localFile);
-	}
-
-}
-
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestSpaceInInstall.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestSpaceInInstall.java
deleted file mode 100644
index b1cfed7..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularInstall/TestSpaceInInstall.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.eclipse.update.tests.regularInstall;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import org.eclipse.update.tests.UpdateTestsPlugin;
-
-public class TestSpaceInInstall extends UpdateManagerTestCase {
-	/**
-	 * Constructor for Test1
-	 */
-	public TestSpaceInInstall(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 *
-	 */
-	public void testSpaceInURL() throws Exception {
-
-		//cleanup target 
-		URL testURL = new URL(TARGET_FILE_SITE,"test site space/"); 
-		String testPath = testURL.getFile();
-		File target = new File(testPath);
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		URL newURL = new File(dataPath + "Site with space/site.xml").toURL();
-		ISite remoteSite = SiteManager.getSite(newURL);
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(testURL);
-		IFeature remoteFeature = null;
-		
-		// at least one executable feature and on packaged
-		boolean execFeature = false;
-		boolean packFeature = false;
-
-		if (featuresRef.length==0) fail ("no feature found");
-	
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature();
-			localSite.install(remoteFeature, null,null);
-			
-			if (remoteFeature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider) packFeature = true;
-			if (remoteFeature.getFeatureContentProvider() instanceof FeatureExecutableContentProvider) execFeature = true;
-
-			// verify
-			String site = testURL.getFile();
-			IPluginEntry[] entries = remoteFeature.getPluginEntries();
-			assertTrue("no plugins entry", (entries != null && entries.length != 0));
-			String pluginName = entries[0].getVersionedIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			assertTrue("plugin files not installed locally", pluginFile.exists());
-
-			File featureFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString());
-			assertTrue("feature info not installed locally:"+featureFile, featureFile.exists());
-
-			File featureFileXML = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString() + File.separator + "feature.xml");
-			assertTrue("feature info not installed locally: no feature.xml", featureFileXML.exists());
-		}
-
-		if (!execFeature && !packFeature){
-			fail("cannot find one executable and one package feature on teh site");
-		}
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}
-	
-	
-	/**
-	 *
-	 */
-	public void testSpaceInHTTPURL() throws Exception {
-
-		//cleanup target  
-		File target = new File(TARGET_FILE_SITE.getFile());
-		UpdateManagerUtils.removeFromFileSystem(target);
-		
-		String path = bundle.getString("HTTP_PATH_3");
-		ISite remoteSite = SiteManager.getSite(new URL("http",getHttpHost(),getHttpPort(),path));		
-		IFeatureReference[] featuresRef = remoteSite.getFeatureReferences();
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE);
-		IFeature remoteFeature = null;
-		
-		// at least one executable feature and on packaged
-		boolean execFeature = false;
-		boolean packFeature = false;
-
-		if (featuresRef.length==0) fail ("no feature found");
-	
-		for (int i = 0; i < featuresRef.length; i++) {
-			remoteFeature = featuresRef[i].getFeature();
-			localSite.install(remoteFeature, null,null);
-			
-			if (remoteFeature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider) packFeature = true;
-			if (remoteFeature.getFeatureContentProvider() instanceof FeatureExecutableContentProvider) execFeature = true;
-
-			// verify
-			String site = TARGET_FILE_SITE.getFile();			
-			IPluginEntry[] entries = remoteFeature.getPluginEntries();
-			assertTrue("no plugins entry", (entries != null && entries.length != 0));
-			String pluginName = entries[0].getVersionedIdentifier().toString();
-			File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-			assertTrue("plugin files not installed locally", pluginFile.exists());
-
-			File featureFile = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString());
-			assertTrue("feature info not installed locally:"+featureFile, featureFile.exists());
-
-			File featureFileXML = new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + remoteFeature.getVersionedIdentifier().toString() + File.separator + "feature.xml");
-			assertTrue("feature info not installed locally: no feature.xml", featureFileXML.exists());
-		}
-
-		if (!execFeature && !packFeature){
-			fail("cannot find one executable and one package feature on teh site");
-		}
-
-		//cleanup target 
-		UpdateManagerUtils.removeFromFileSystem(target);
-
-
-	}
-		
-		
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/AllRegularRemoveTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/AllRegularRemoveTests.java
deleted file mode 100644
index 04bc913..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/AllRegularRemoveTests.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.eclipse.update.tests.regularRemove;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import junit.framework.*;
-
-
-public class AllRegularRemoveTests extends UpdateManagerTestCase {
-public AllRegularRemoveTests(String name) {
-	super(name);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite();
-	suite.setName("Regular Remove Tests");
-	
-	suite.addTest(new TestSuite(TestRemove.class));
-	
-	return suite;
-}
-}
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/TestRemove.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/TestRemove.java
deleted file mode 100644
index a237b1d..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/regularRemove/TestRemove.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.eclipse.update.tests.regularRemove;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.configuration.*;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import org.eclipse.update.tests.api.DefaultFeature;
-
-public class TestRemove extends UpdateManagerTestCase {
-
-	public class Listener implements IConfiguredSiteChangedListener {
-
-		public boolean notified = false;
-
-		public void featureInstalled(IFeature feature) {
-			notified = true;
-			System.out.println("Notified DefaultFeature Installed");
-		}
-
-		public void featureRemoved(IFeature feature) {
-		}
-		public void featureConfigured(IFeature feature) {
-		};
-		public void featureUnconfigured(IFeature feature) {
-		};
-
-		public boolean isNotified() {
-			return notified;
-		}
-	}
-
-	/**
-	 * Constructor for Test1
-	 */
-	public TestRemove(String arg0) {
-		super(arg0);
-	}
-
-	private IFeature getFeature1(ISite site)
-		throws MalformedURLException, CoreException {
-		//URL url = UpdateManagerUtils.getURL(site.getURL(), "features/org.eclipse.update.core.tests.feature1_1.0.4.jar", null);
-		FeatureReference ref = new FeatureReference();
-		ref.setSite(site);
-		ref.setURLString("features/org.eclipse.update.core.tests.feature1_1.0.4.jar");
-		ref.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
-		ref.resolve(site.getURL(), null);
-		return ref.getFeature();
-	}
-
-	public void testRemoveFeature() throws Exception {
-
-		// install feature
-		ISite remoteSite = SiteManager.getSite(SOURCE_FILE_SITE);
-		IFeature remoteFeature = getFeature1(remoteSite);
-		ISite localSite = SiteManager.getSite(TARGET_FILE_SITE);
-		IFeatureReference ref = localSite.install(remoteFeature, null, null);
-
-		// then remove it
-		String featureRef = ref.getFeature().getVersionedIdentifier().toString();
-		localSite.remove(ref.getFeature(), null);
-
-		// verify
-		String site = TARGET_FILE_SITE.getFile();
-		IPluginEntry[] entries = remoteFeature.getPluginEntries();
-		assertTrue("no plugins entry", (entries != null && entries.length != 0));
-		String pluginName = entries[0].getVersionedIdentifier().toString();
-
-		File pluginFile = new File(site, Site.DEFAULT_PLUGIN_PATH + pluginName);
-		assertTrue("plugin files installed locally", !pluginFile.exists());
-
-		File featureFile =
-			new File(site, Site.DEFAULT_INSTALLED_FEATURE_PATH + featureRef);
-		assertTrue(
-			"feature info installed locally:" + featureFile,
-			!featureFile.exists());
-
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/AllTypesTests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/AllTypesTests.java
deleted file mode 100644
index acdad72..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/AllTypesTests.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestFeatureType.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestFeatureType.java
deleted file mode 100644
index da74688..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestFeatureType.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestSiteType.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestSiteType.java
deleted file mode 100644
index 3592050..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/types/TestSiteType.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.eclipse.update.tests.types;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.File;
-import java.net.URL;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.core.*;
-import org.eclipse.update.internal.core.*;
-import org.eclipse.update.internal.core.FeaturePackagedContentProvider;
-import org.eclipse.update.internal.core.SiteURLContentProvider;
-import org.eclipse.update.tests.UpdateManagerTestCase;
-import org.eclipse.update.tests.implementation.SiteFTPFactory;
-
-public class TestSiteType extends UpdateManagerTestCase {
-
-	/**
-	 * Test the getFeatures()
-	 */
-	public TestSiteType(String arg0) {
-		super(arg0);
-	}
-
-	/**
-	 * @throws Exception
-	 */
-	public void testSiteType() throws Exception {
-
-		String featurePath = dataPath + "SiteTypeExamples/site1/site.xml";
-		ISite site = SiteManager.getSite(new File(featurePath).toURL());
-		IFeatureReference ref = site.getFeatureReferences()[0];
-		IFeature feature = ref.getFeature();
-
-		assertTrue(site.getSiteContentProvider() instanceof SiteURLContentProvider);
-		assertTrue(((Site) site).getType().equals("org.eclipse.update.core.http"));
-		assertTrue(feature.getFeatureContentProvider() instanceof FeaturePackagedContentProvider);
-
-	}
-
-	/**
-		 * @throws Exception
-		 */
-	public void testFTPSiteType() throws Exception {
-
-		ISite site = SiteManager.getSite(new URL(SOURCE_FILE_SITE + "FTPLikeSite/"));
-
-		// should not find the mapping
-		// but then should attempt to read the XML file
-		// found a new type
-		// call the new type
-		assertTrue(
-			"Wrong site type",
-			site.getType().equals("org.eclipse.update.tests.ftp"));
-		assertTrue(
-			"Wrong file",
-			site.getURL().getFile().equals("/" + SiteFTPFactory.FILE));
-
-	}
-
-	public void testParseValid1() throws Exception {
-		try {
-			URL remoteURL = new URL(SOURCE_FILE_SITE + "parsertests/siteftp.xml");
-			ISite site = SiteManager.getSite(remoteURL);
-			site.getArchives();
-		} catch (CoreException e) {
-			if (e.getMessage().indexOf("</feature>") == -1) {
-				throw e;
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/AllCoreUITests.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/AllCoreUITests.java
deleted file mode 100644
index 60669b4..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/AllCoreUITests.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/TestUILabel.java b/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/TestUILabel.java
deleted file mode 100644
index 74db585..0000000
--- a/update/org.eclipse.update.tests.core/src/org/eclipse/update/tests/uivalues/TestUILabel.java
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/test.xml b/update/org.eclipse.update.tests.core/test.xml
deleted file mode 100644
index f188855..0000000
--- a/update/org.eclipse.update.tests.core/test.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0"?>
-<project name="testsuite" default="run" basedir="."> 
-  
-  <!-- The property ${eclipse-home} should be passed into this script -->
-  <!-- Set a meaningful default value for when it is not. -->
-  <property name="eclipse-home" value="${basedir}/../.."/>
-  
-  <!-- sets the properties eclipse-home, and library-file -->
-  <property name="plugin-name" value="org.eclipse.update.tests.core"/>
-  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
-  <property name="class-name" value="org.eclipse.update.tests.AllTests" />
-  
-  <!-- This target holds all initialization code that needs to be done for -->
-  <!-- all tests that are to be run. Initialization for individual tests -->
-  <!-- should be done within the body of the suite target. -->
-  <target name="init">
-    <tstamp/>
-    <delete>
-      <fileset dir="${eclipse-home}" includes="org*.xml"/>
-    </delete>
-  </target>
-  
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite">
-    <property name="sniff-folder" value="${eclipse-home}/update_core_sniff_folder"/>
-    <delete dir="${sniff-folder}" quiet="true"/>
-    
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${sniff-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" value="${class-name}"/>
-    </ant>
-  </target>
-  
-  <!-- This target holds code to cleanup the testing environment after -->
-  <!-- after all of the tests have been run. You can use this target to -->
-  <!-- delete temporary files that have been created. -->
-  <target name="cleanup">
-  </target>
-  
-  <!-- This target runs the test suite. Any actions that need to happen -->
-  <!-- after all the tests have been run should go here. -->
-   <target name="run" depends="init,suite,cleanup">
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org*.xml"/>
-      <property name="output-file" value="${plugin-name}.xml"/>
-    </ant>
-  </target>
-</project>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/test_with_mail.xml b/update/org.eclipse.update.tests.core/test_with_mail.xml
deleted file mode 100644
index 9f1d408..0000000
--- a/update/org.eclipse.update.tests.core/test_with_mail.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0"?>
-<project name="testsuite" default="run" basedir="."> 
-  
-  <!-- The property ${eclipse-home} should be passed into this script -->
-  <!-- Set a meaningful default value for when it is not. -->
-  <property name="eclipse-home" value="${basedir}/../.."/>
-  
-  <!-- sets the properties eclipse-home, and library-file -->
-  <property name="plugin-name" value="org.eclipse.update.tests.core"/>
-  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
-  <property name="class-name" value="org.eclipse.update.tests.AllTests" />
-  
-  <!-- This target holds all initialization code that needs to be done for -->
-  <!-- all tests that are to be run. Initialization for individual tests -->
-  <!-- should be done within the body of the suite target. -->
-  <target name="init">
-    <tstamp/>
-    <delete>
-      <fileset dir="${eclipse-home}" includes="org*.xml"/>
-    </delete>
-  </target>
-  
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite">
-    <property name="sniff-folder" value="${eclipse-home}/update_core_sniff_folder"/>
-    <delete dir="${sniff-folder}" quiet="true"/>
-    
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${sniff-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" value="${class-name}"/>
-    </ant>
-  </target>
-  
-  <!-- This target holds code to cleanup the testing environment after -->
-  <!-- after all of the tests have been run. You can use this target to -->
-  <!-- delete temporary files that have been created. -->
-  <target name="cleanup">
-  </target>
-  
-  <!-- This target runs the test suite. Any actions that need to happen -->
-  <!-- after all the tests have been run should go here. -->
-   <target name="run" depends="init,suite,cleanup">
-
-    <property name="email-from" value="Eclipse_Automated_Test@oti.com"/>
-    <property name="email-subject" value="Install/Update: Nightly Build Report"/>
-    <property name="email-subject-log" value="Install/Update: Nightly .log"/>
-    <property name="email-server" value="d25ml04.torolab.ibm.com"/>
-    <property name="infile" value="${eclipse-home}/${plugin-name}.xml"/>
-    <property name="infile-log" value="${eclipse-home}/workspace/.metadata/.log"/>
-      
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org*.xml"/>
-      <property name="output-file" value="${plugin-name}.xml"/>
-    </ant>
-    
-    <touch file="${infile-log}"/>
-
-    <mail from="${email-from}" tolist="celek@ca.ibm.com"
-          subject="${email-subject}" files="${infile}"
-          mailhost="${email-server}"/>
-
-    <mail from="${email-from}" tolist="celek@ca.ibm.com"
-          subject="${email-subject-log}" files="${infile-log}"
-          mailhost="${email-server}"/>
-
-    <mail from="${email-from}" tolist="celek@rogers.com"
-          subject="${email-subject-log}" files="${infile-log}"
-          mailhost="${email-server}"/>
-
-    <mail from="${email-from}" tolist="celek@rogers.com"
-          subject="${email-subject}" files="${infile}"
-          mailhost="${email-server}"/>
-
-  </target>
-</project>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/features space/helpFeature.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/features space/helpFeature.jar
deleted file mode 100644
index 9809713..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/features space/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/features space/space feature.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/features space/space feature.jar
deleted file mode 100644
index 5039d7b..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/features space/space feature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/info/siteInfo.html b/update/org.eclipse.update.tests.core/webserver/Site with space/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/install/features space/feature3/feature.xml b/update/org.eclipse.update.tests.core/webserver/Site with space/install/features space/feature3/feature.xml
deleted file mode 100644
index 67741d9..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/install/features space/feature3/feature.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature id="org.eclipse.update.core.tests.feature3" image="feature1.gif" label="Third Feature" provider-name="Smart Company" version="1.0.0" >
-  <description>Description</description>
-  <copyright>copyright</copyright>
-  <license>license</license>
-  <url>
-    <update label="URL to update the feature" url="http://www.eclipse.org/path/feature1/"/>
-    <discovery label="Discovery 1" url="http://www.eclipse.org"/>
-    <discovery label="Discovery 2" url="http://www.eclipse.org"/>
-  </url>
-</feature>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/Pde_core.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/help.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/junit_3.7.jar b/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/plugins space/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/Site with space/site.xml b/update/org.eclipse.update.tests.core/webserver/Site with space/site.xml
deleted file mode 100644
index b5d4bbf..0000000
--- a/update/org.eclipse.update.tests.core/webserver/Site with space/site.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-<description url="info/siteInfo.html"/>
-  <feature url="features space/helpFeature.jar">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features space/space feature.jar">
-    <category name="eclipse/J2EE"/>
-  </feature>
-
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins space/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins space/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins space/junit_3.7.jar"/>
-  <archive path="plugins/org.eclipse.update.plugin1_1.1.1" url="plugins space/org.eclipse.update.plugin1_1.1.1"/>  
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/helpFeature.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/helpFeature.jar
deleted file mode 100644
index 9809713..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/helpFeature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/org.eclipse.pde.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/org.eclipse.pde.feature_1.0.0.jar
deleted file mode 100644
index b5f241a..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/features/org.eclipse.pde.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/top_titlsm.gif b/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/top_titlsm.gif
deleted file mode 100644
index 3917bb6..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/top_titlsm.gif
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/wel_ml.jpg b/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/wel_ml.jpg
deleted file mode 100644
index 01e33df..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/img/wel_ml.jpg
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/siteInfo.html b/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/siteInfo.html
deleted file mode 100644
index b065aa3..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/info/siteInfo.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-</head>
-  <body>
-<img src="img/top_titlsm.gif" alt="" width="460" height="50">
-<br>
-<br>
-     It started with Smalltalk<br>
-    OTI has been building tools for platform-independent OO development since
-  1988. Our ENVY&reg; technology first brought collaborative software development,
-  version management and shared repositories to Smalltalk. IBM is one of
-many   companies to license ENVY, which continues to be the foundation of
-VisualAge&reg;   Smalltalk.<br>
-<br>
-<br>
-<br>
-      Next came Java&#8482;<br>
-    Because of our expertise in OO technology, IBM turned to OTI for a next-generation
-  development environment for Java. The result is VisualAge for Java, which
-  continues to win awards for its innovative IDE and team support. InfoWorld
-  has chosen VisualAge for Java as development tool of the year - year after
-  year after year!<br>
-<br>
-<br>
-<br>
-      Then pervasive computing<br>
-    OTI continues its development of IBM's VisualAge Micro Edition, a state-of-the-art
-  platform for collaborative development of embedded applications and systems
-  that are very lean. As the steady stream of press releases attests, VisualAge
-  Micro Edition is already licensed to the leading microchip manufacturers,
-  microkernel developers, and producers of handheld and consumer devices.<br>
-<br>
-<br>
-<br>
-      Now it's Eclipse<br>
-    OTI has built the next generation IBM application development tools platform.
-  Eclipse is a kind of universal tool platform - an open extensible IDE for
-  anything and nothing in particular. The real value comes from tool plug-ins
-  that "teach" Eclipse how to work with things - java files, web content,
-graphics,  video - almost anything you can imagine. Eclipse allows you to
-independently  develop tools that integrate with other people's tools so
-seamlessly you won't know where one tool ends and another starts. The IBM
-supported version of this technology, WebSphere Studio Workbench, will be
-the core of the next  generation of IBM and IBM Business Partner e-business
-tools optimized for  the WebSphere software platform.<br>
-<br>
-<br>
-<br>
-      So what's next?<br>
-    OTI continues to deliver object-oriented technology that scales across
- platforms,  across teams and across project size. From a mainframe to a
-watch  - we're  closing in on that vision.<br>
-<br>
-<img src="img/wel_ml.jpg" width="460" height="460" alt="">
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-</body>
-</html>
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/Pde_core.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/Pde_core.jar
deleted file mode 100644
index f107217..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/Pde_core.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/help.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/help.jar
deleted file mode 100644
index 7584f66..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/help.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/junit_3.7.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/junit_3.7.jar
deleted file mode 100644
index 67587b2..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/plugins/junit_3.7.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager/site.xml b/update/org.eclipse.update.tests.core/webserver/UpdateManager/site.xml
deleted file mode 100644
index 5e5fda7..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager/site.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site >
-<description url="info/siteInfo.html"/>
-  <feature url="features/helpFeature.jar">
-    <category name="eclipse/UML"/>
-  </feature>
-  <feature url="features/org.eclipse.pde.feature_1.0.0.jar">
-    <category name="eclipse/J2EE"/>
-  </feature>
-  <archive path="plugins/org.eclipse.help_1.0.0.jar" url="plugins/help.jar"/>
-  <archive path="plugins/org.eclipse.pde.core_1.0.0.jar" url="plugins/Pde_core.jar"/>
-  <archive path="plugins/org.junit_3.5.0.jar" url="plugins/junit_3.7.jar"/>
-  <category-def label="IBM WSAD Tools" name="eclipse"/>
-  <category-def label="J2EE tools" name="eclipse/J2EE"/>
-  <category-def label="EJB Tools" name="eclipse/J2EE/EJB"/>
-  <category-def label="UML tools" name="eclipse/UML"/>
-  <category-def label="Messaging Tools" name="B2B"/>  
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/features2.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/features2.jar
deleted file mode 100644
index 0420da6..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/features2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.test.feature_1.0.0.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.test.feature_1.0.0.jar
deleted file mode 100644
index 870a70d..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.test.feature_1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.update.core.tests.feature1_1.0.4.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.update.core.tests.feature1_1.0.4.jar
deleted file mode 100644
index 6afaca7..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse.update.core.tests.feature1_1.0.4.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse_test_feature.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse_test_feature.jar
deleted file mode 100644
index 72bb15e..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/features/org.eclipse_test_feature.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar
deleted file mode 100644
index 639ac8c..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar
deleted file mode 100644
index 0c995d5..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature1.plugin1_1.1.1.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar
deleted file mode 100644
index 0c995d5..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.feature2.plugin2_2.2.2.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar
deleted file mode 100644
index d6737f6..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.dummy_7.9.8.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
deleted file mode 100644
index eb8690f..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin1_3.5.6.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
deleted file mode 100644
index 90a612f..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/plugins/org.eclipse.update.core.tests.feature1.plugin2_5.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.properties b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.properties
deleted file mode 100644
index 211986b..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-drivers=Required Drivers
-security=Security Fixes
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.xml b/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.xml
deleted file mode 100644
index 657d9b2..0000000
--- a/update/org.eclipse.update.tests.core/webserver/UpdateManager2/site.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site id="org.eclipse.update.core.tests" name="Tests" version="0.0.1">
-  <feature url="features/org.eclipse.test.feature_1.0.0.jar">
-    <category name="category1"/>
-  </feature>
-  <feature url="features/features2.jar">
-    <category name="category1/subcat1"/>
-    <category name="category2"/>
-  </feature>
-  <feature url="features/org.eclipse.update.core.tests.feature1_1.0.4.jar">
-    <category name="category1"/>
-    <category name="category2"/>
-  </feature>
-  <feature url="features/org.eclipse_test_feature.jar"/>
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-    <category name="category1"/>
-  </feature>
-  <feature url="org.eclipse.update.core.feature2_1.0.0/org.eclipse.update.core.feature2_2.2.2.jar">
-  </feature>
-
-  <category-def name="category1/subcat1" label="Special Fix"/>
-  <category-def name="category1" label="%drivers"/>
-  <category-def name="category2" label="%security"/>
-</site>
\ No newline at end of file
diff --git a/update/org.eclipse.update.tests.core/webserver/WEB-INF/web.xml b/update/org.eclipse.update.tests.core/webserver/WEB-INF/web.xml
deleted file mode 100644
index 1a6d904..0000000
--- a/update/org.eclipse.update.tests.core/webserver/WEB-INF/web.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-
-<!DOCTYPE web-app
-    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
-    "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
-
-<web-app>
-    
-</web-app>
diff --git a/update/org.eclipse.update.ui.forms/.classpath b/update/org.eclipse.update.ui.forms/.classpath
deleted file mode 100644
index b76e4de..0000000
--- a/update/org.eclipse.update.ui.forms/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="src/"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.eclipse.ui"/>
-    <classpathentry kind="src" path="/org.apache.xerces"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/update/org.eclipse.update.ui.forms/.cvsignore b/update/org.eclipse.update.ui.forms/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/update/org.eclipse.update.ui.forms/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/.project b/update/org.eclipse.update.ui.forms/.project
deleted file mode 100644
index 3eee13e..0000000
--- a/update/org.eclipse.update.ui.forms/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.update.ui.forms</name>
-	<comment></comment>
-	<projects>
-		<project>org.apache.xerces</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.ui</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.team.cvs.core.cvsnature</nature>
-	</natures>
-</projectDescription>
diff --git a/update/org.eclipse.update.ui.forms/about.html b/update/org.eclipse.update.ui.forms/about.html
deleted file mode 100644
index 768324e..0000000
--- a/update/org.eclipse.update.ui.forms/about.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<head>
-<title>About</title>
-<style type="text/css">
-p, table, td, th { font-family: arial, helvetica, geneva; font-size: 10pt}
-pre { font-family: "Courier New", Courier, mono; font-size: 10pt}
-h2 { font-family: arial, helvetica, geneva; font-size: 18pt; font-weight: bold ; line-height: 14px}
-code { font-family: "Courier New", Courier, mono; font-size: 10pt}
-sup { font-family: arial,helvetica,geneva; font-size: 10px}
-h3 { font-family: arial, helvetica, geneva; font-size: 14pt; font-weight: bold}
-li { font-family: arial, helvetica, geneva; font-size: 10pt}
-h1 { font-family: arial, helvetica, geneva; font-size: 28px; font-weight: bold}
-body { font-family: arial, helvetica, geneva; font-size: 10pt; clip: rect(   ); margin-top: 5mm; margin-left: 3mm}
-</style>
-</head>
-<body lang="EN-US" link="blue" vlink="purple">
-<table border="0" cellspacing="5" cellpadding="2" width="100%" >
-  <tr> 
-    <td align="LEFT" valign="TOP" colspan="2" bgcolor="#0080C0"><b><font color="#FFFFFF">About This Content</font></b></td>
-  </tr>
-  <tr> 
-    <td> 
-<p>11th December, 2001</p>	
-<h3>License</h3>
-<p>Eclipse.org makes available all content in this plug-in &quot;Content&quot;.  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-<a href="http://www.eclipse.org/legal/cpl-v05.html">Common Public License Version 0.5</a> &quot;CPL&quot;.  For purposes of the CPL, &quot;Program&quot; will mean the Content.</p>
-
-<h3>Contributions</h3>
-
-<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise
-made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
-Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p>
-
-<p>If this Content is licensed to you under license terms and conditions other than the CPL &quot;Other License&quot;, any modifications, enhancements and/or
-other code and/or documentation &quot;Modifications&quot; uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
-host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
-to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
-providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of
-the CPL.</p>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/build.properties b/update/org.eclipse.update.ui.forms/build.properties
deleted file mode 100644
index 842d677..0000000
--- a/update/org.eclipse.update.ui.forms/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.forms.jar = src/
-bin.includes = plugin.properties,\
-               *.jar,\
-               plugin.xml,\
-               about.html
diff --git a/update/org.eclipse.update.ui.forms/plugin.properties b/update/org.eclipse.update.ui.forms/plugin.properties
deleted file mode 100644
index f73bcad..0000000
--- a/update/org.eclipse.update.ui.forms/plugin.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# plugin.xml properties
-#
-
-name = Install/Update Forms
-
diff --git a/update/org.eclipse.update.ui.forms/plugin.xml b/update/org.eclipse.update.ui.forms/plugin.xml
deleted file mode 100644
index b35c62e..0000000
--- a/update/org.eclipse.update.ui.forms/plugin.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin
-   id="org.eclipse.update.ui.forms"
-   name="%name"
-   version="2.0.0"
-   provider-name="International Business Machines Corp."
-   class="">
-
-   <runtime>
-      <library name="forms.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.apache.xerces"/>
-   </requires>
-
-
-</plugin>
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractForm.java
deleted file mode 100644
index 4e248da..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractForm.java
+++ /dev/null
@@ -1,226 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.jface.util.*;
-import org.eclipse.ui.*;
-
-/**
- * This class implements IForm interface and
- * provides some common services to its subclasses.
- * It handles some common properties like heading
- * text, image and colors, as well as
- * font change processing.
- */
-
-public abstract class AbstractForm implements IForm, IPropertyChangeListener {
-	protected FormWidgetFactory factory;
-	protected Color headingBackground;
-	protected Color headingForeground;
-	protected boolean headingVisible=true;
-	protected Image headingImage;
-	protected String headingText;
-	protected Font titleFont;
-	
-	public AbstractForm() {
-		factory = new FormWidgetFactory();
-	   	titleFont = JFaceResources.getHeaderFont();
-   		JFaceResources.getFontRegistry().addListener(this);
-	}
-
-	/**
-	 * @see IForm#commitChanges(boolean)
-	 */
-	public void commitChanges(boolean onSave) {
-	}
-
-
-	/**
-	 * @see IForm#createControl(Composite)
-	 */
-	public abstract Control createControl(Composite parent);
-
-	/**
-	 * @see IForm#dispose()
-	 */
-	public void dispose() {
-		factory.dispose();
-		JFaceResources.getFontRegistry().removeListener(this);
-	}
-
-
-	/**
-	 * @see IForm#doGlobalAction(String)
-	 */
-	public boolean doGlobalAction(String actionId) {
-		return false;
-	}
-
-
-	/**
-	 * @see IForm#expandTo(Object)
-	 */
-	public void expandTo(Object object) {
-	}
-
-
-	/**
-	 * @see IForm#getControl()
-	 */
-	public abstract Control getControl();
-
-	/**
-	 * @see IForm#getFactory()
-	 */
-	public FormWidgetFactory getFactory() {
-		return factory;
-	}
-
-
-	/**
-	 * @see IForm#getHeadingBackground()
-	 */
-	public Color getHeadingBackground() {
-		return headingBackground;
-	}
-
-
-	/**
-	 * @see IForm#getHeadingForeground()
-	 */
-	public Color getHeadingForeground() {
-		return headingForeground;
-	}
-
-
-	/**
-	 * @see IForm#getHeadingImage()
-	 */
-	public Image getHeadingImage() {
-		return headingImage;
-	}
-
-
-	/**
-	 * @see IForm#getHeading()
-	 */
-	public String getHeadingText() {
-		if (headingText==null) return "";
-		return headingText;
-	}
-
-
-	/**
-	 * @see IForm#initialize(Object)
-	 */
-	public void initialize(Object model) {
-	}
-
-
-	/**
-	 * @see IForm#isHeadingVisible()
-	 */
-	public boolean isHeadingVisible() {
-		return headingVisible;
-	}
-
-
-	/**
-	 * @see IForm#registerSection(FormSection)
-	 */
-	public void registerSection(FormSection section) {
-	}
-
-
-	/**
-	 * @see IForm#setFocus()
-	 */
-	public void setFocus() {
-	}
-
-
-	/**
-	 * @see IForm#setHeadingBackground(Color)
-	 */
-	public void setHeadingBackground(Color newHeadingBackground) {
-		this.headingBackground = newHeadingBackground;
-	}
-
-
-	/**
-	 * @see IForm#setHeadingForeground(Color)
-	 */
-	public void setHeadingForeground(Color newHeadingForeground) {
-		this.headingForeground = newHeadingForeground;
-	}
-
-
-	/**
-	 * @see IForm#setHeadingImage(Image)
-	 */
-	public void setHeadingImage(Image headingImage) {
-		this.headingImage = headingImage;
-	}
-
-
-	/**
-	 * @see IForm#setHeadingVisible(boolean)
-	 */
-	public void setHeadingVisible(boolean newHeadingVisible) {
-		this.headingVisible = newHeadingVisible;
-	}
-
-
-	/**
-	 * @see IForm#setHeading(String)
-	 */
-	public void setHeadingText(String headingText) {
-		this.headingText = headingText;
-	}
-
-
-	/**
-	 * @see IForm#update()
-	 */
-	public void update() {
-	}
-	
-protected boolean canPerformDirectly(String id, Control control) {
-	if (control instanceof Text) {
-		Text text = (Text)control;
-		if (id.equals(IWorkbenchActionConstants.CUT)) {
-			text.cut();
-			return true;
-		}
-		if (id.equals(IWorkbenchActionConstants.COPY)) {
-			text.copy();
-			return true;
-		}
-		if (id.equals(IWorkbenchActionConstants.PASTE)) {
-			text.paste();
-			return true;
-		}
-		if (id.equals(IWorkbenchActionConstants.SELECT_ALL)) {
-			text.selectAll();
-			return true;
-		}
-		if (id.equals(IWorkbenchActionConstants.DELETE)) {
-			int count = text.getSelectionCount();
-			if (count==0) {
-				int caretPos = text.getCaretPosition();
-				text.setSelection(caretPos, caretPos+1);
-			}
-			text.insert("");
-			return true;
-		}
-	}
-	return false;
-}
-
-
-}
-
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractSectionForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractSectionForm.java
deleted file mode 100644
index b276c70..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/AbstractSectionForm.java
+++ /dev/null
@@ -1,193 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import java.util.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.graphics.*;
-
-/**
- * This form class understands form sections.
- * It assumes that they are part of the form
- * and it offers life cycle handling of sections
- * once they are registered.
- */
-
-public abstract class AbstractSectionForm extends AbstractForm {
-	public static final int H_SCROLL_INCREMENT = 5;
-	public static final int V_SCROLL_INCREMENT = 64;
-	protected Vector sections = null;
-
-	public void registerSection(FormSection section) {
-		if (sections == null)
-			sections = new Vector();
-		if (!sections.contains(section))
-			sections.add(section);
-	}
-
-	public void unregisterSection(FormSection section) {
-		if (sections != null && sections.contains(section))
-			sections.remove(section);
-	}
-
-	public void initialize(Object model) {
-		if (sections != null) {
-			for (Iterator iter = sections.iterator(); iter.hasNext();) {
-				FormSection section = (FormSection) iter.next();
-				section.initialize(model);
-			}
-		}
-	}
-
-	public void setFocus() {
-		if (sections != null && sections.size() > 0) {
-			FormSection firstSection = (FormSection) sections.firstElement();
-			firstSection.setFocus();
-		}
-	}
-
-	public void update() {
-		if (sections != null) {
-			for (Iterator iter = sections.iterator(); iter.hasNext();) {
-				FormSection section = (FormSection) iter.next();
-				section.update();
-			}
-		}
-	}
-
-	public void commitChanges(boolean onSave) {
-		if (sections != null) {
-			for (Iterator iter = sections.iterator(); iter.hasNext();) {
-				FormSection section = (FormSection) iter.next();
-				if (section.isDirty())
-					section.commitChanges(onSave);
-			}
-		}
-	}
-
-	public boolean doGlobalAction(String actionId) {
-		Control focusControl = getFocusControl();
-		if (focusControl == null)
-			return false;
-
-		if (canPerformDirectly(actionId, focusControl))
-			return true;
-		Composite parent = focusControl.getParent();
-		FormSection targetSection = null;
-		while (parent != null) {
-			Object data = parent.getData();
-			if (data != null && data instanceof FormSection) {
-				targetSection = (FormSection) data;
-				break;
-			}
-			parent = parent.getParent();
-		}
-		if (targetSection != null) {
-			return targetSection.doGlobalAction(actionId);
-		}
-		return false;
-	}
-
-	protected Control getFocusControl() {
-		Control control = getControl();
-		if (control == null || control.isDisposed())
-			return null;
-		Display display = control.getDisplay();
-		Control focusControl = display.getFocusControl();
-		if (focusControl == null || focusControl.isDisposed())
-			return null;
-		return focusControl;
-	}
-
-	public boolean canPaste(Clipboard clipboard) {
-		Control focusControl = getFocusControl();
-		if (focusControl == null)
-			return false;
-		Composite parent = focusControl.getParent();
-		FormSection targetSection = null;
-		while (parent != null) {
-			Object data = parent.getData();
-			if (data != null && data instanceof FormSection) {
-				targetSection = (FormSection) data;
-				break;
-			}
-			parent = parent.getParent();
-		}
-		if (targetSection != null) {
-			return targetSection.canPaste(clipboard);
-		}
-		return false;
-	}
-
-	public void dispose() {
-		if (sections != null) {
-			for (Iterator iter = sections.iterator(); iter.hasNext();) {
-				FormSection section = (FormSection) iter.next();
-				section.dispose();
-			}
-		}
-		super.dispose();
-	}
-
-	public static void ensureVisible(ScrolledComposite scomp, Control control) {
-		Point controlSize = control.getSize();
-		Rectangle area = scomp.getClientArea();
-		Point areaOrigin = scomp.toDisplay(new Point(area.x, area.y));
-
-		Point scompOrigin = scomp.toDisplay(scomp.getOrigin());
-		Point controlOrigin = control.toDisplay(control.getLocation());
-
-		int x = scompOrigin.x;
-		int y = scompOrigin.y;
-
-		if (controlOrigin.x < scompOrigin.x) {
-			x = Math.max(areaOrigin.x, controlOrigin.x);
-		}
-		if (controlOrigin.y < scompOrigin.y) {
-			y = Math.max(areaOrigin.y, controlOrigin.y);
-		}
-		if (controlOrigin.x + controlSize.x > scompOrigin.x + area.width) {
-			x = Math.max(areaOrigin.x, controlOrigin.x + controlSize.x - area.width);
-		}
-		if (controlOrigin.y + controlSize.y > scompOrigin.y + area.height) {
-			y = Math.max(areaOrigin.y, controlOrigin.y + controlSize.y - area.height);
-		}
-		scomp.setOrigin(scomp.toControl(new Point(x, y)));
-	}
-
-	public static void scrollVertical(ScrolledComposite scomp, boolean up) {
-		scroll(scomp, 0, up ? -V_SCROLL_INCREMENT : V_SCROLL_INCREMENT);
-	}
-	public static void scrollHorizontal(ScrolledComposite scomp, boolean left) {
-		scroll(scomp, left ? -H_SCROLL_INCREMENT : H_SCROLL_INCREMENT, 0);
-	}
-	public static void scrollPage(ScrolledComposite scomp, boolean up) {
-		Point origin = scomp.getOrigin();
-		Rectangle clientArea = scomp.getClientArea();
-		int increment = up ? -clientArea.height : clientArea.height;
-		scroll(scomp, 0, increment);
-	}
-	private static void scroll(ScrolledComposite scomp, int xoffset, int yoffset) {
-		Point origin = scomp.getOrigin();
-		Point contentSize = scomp.getContent().getSize();
-		int xorigin = origin.x + xoffset;
-		int yorigin = origin.y + yoffset;
-		xorigin = Math.max(xorigin, 0);
-		xorigin = Math.min(xorigin, contentSize.x - 1);
-		yorigin = Math.max(yorigin, 0);
-		yorigin = Math.min(yorigin, contentSize.y - 1);
-		scomp.setOrigin(xorigin, yorigin);
-	}
-
-	public static void updatePageIncrement(ScrolledComposite scomp) {
-		ScrollBar vbar = scomp.getVerticalBar();
-		if (vbar != null) {
-			Rectangle clientArea = scomp.getClientArea();
-			int increment = clientArea.height - 5;
-			vbar.setPageIncrement(increment);
-		}
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/CustomWorkbook.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/CustomWorkbook.java
deleted file mode 100644
index 34aa1a9..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/CustomWorkbook.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.graphics.*;
-import java.util.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.*;
-import org.eclipse.ui.part.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.swt.custom.*;
-
-
-public class CustomWorkbook implements IFormWorkbook {
-	private Hashtable pages;
-	private IFormPage sourcePage;
-	private IFormPage lastFormPage;
-	private boolean firstPageSelected=true;
-	private CTabFolder tabFolder;
-	private Vector listeners=new Vector();
-	private IFormPage currentPage;
-
-public CustomWorkbook() {
-	pages = new Hashtable();
-}
-public void addFormSelectionListener(IFormSelectionListener listener) {
-	listeners.addElement(listener);
-}
-public void addPage(IFormPage page) {
-	CTabItem item = new CTabItem(tabFolder, SWT.NULL);
-	item.setText(page.getLabel());
-	item.setToolTipText(page.getTitle());
-	item.setData(page);
-	pages.put(page, item);
-	if (page.isSource()) sourcePage = page;
-	
-	if (firstPageSelected && currentPage == null)
-		selectPage(page);
-}
-public void createControl(Composite parent) {
-	tabFolder = new CTabFolder(parent, SWT.BOTTOM);
-	tabFolder.addSelectionListener(new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			CTabItem item = (CTabItem) e.item;
-			IFormPage page = (IFormPage) item.getData();
-			if (page != null)
-				selectPage(page);
-		}
-	});
-	// listener to resize visible components
-	tabFolder.addListener(SWT.Resize, new Listener() {
-		public void handleEvent(Event e) {
-			if (currentPage != null)
-				setControlSize(currentPage.getControl());
-		}
-	});
-}
-private void fireSelectionChanged(IFormPage page) {
-	for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-		IFormSelectionListener listener = (IFormSelectionListener) iter.next();
-		listener.formSelected(page);
-	}
-}
-public Control getControl() {
-	return tabFolder;
-}
-public IFormPage getCurrentPage() {
-	return currentPage;
-}
-public boolean isFirstPageSelected() {
-	return firstPageSelected;
-}
-public void removeFormSelectionListener(IFormSelectionListener listener) {
-	listeners.removeElement(listener);
-}
-public void removePage(IFormPage page) {
-	CTabItem item = (CTabItem) pages.get(page);
-	if (item != null)
-		item.dispose();
-}
-private void reselectPage(final IFormPage page) {
-	tabFolder.getDisplay().asyncExec(new Runnable() {
-		public void run() {
-		selectPage(page);
-		}
-	});
-}
-public void selectPage(final IFormPage page) {
-	final IFormPage oldPage = currentPage;
-	currentPage = page;
-
-	// It may take a while
-	BusyIndicator.showWhile(tabFolder.getDisplay(), new Runnable() {
-		public void run() {
-			switchPages(oldPage, page);
-		}
-	});
-}
-private void setControlSize(Control control) {
-	Rectangle bounds = tabFolder.getBounds();
-	Rectangle offset = tabFolder.getClientArea();
-	bounds.x += offset.x;
-	bounds.y += offset.y;
-	bounds.width = offset.width;
-	bounds.height = offset.height;
-	control.setBounds(bounds);
-	control.moveAbove(tabFolder);
-}
-private void setControlVisible(Control control) {
-	if (control == null)
-		return;
-	setControlSize(control);
-	control.setVisible(true);
-}
-public void setFirstPageSelected(boolean newFirstPageSelected) {
-	firstPageSelected = newFirstPageSelected;
-}
-private void switchPages(IFormPage oldPage, IFormPage newPage) {
-	if (oldPage != null && oldPage!=newPage) {
-		boolean okToSwitch = oldPage.becomesInvisible(newPage);
-		if (!okToSwitch) {
-			// We must try to go back to the source page
-			reselectPage(oldPage);
-			return;
-		}
-	}
-	if (newPage.getControl() == null)
-		newPage.createControl(tabFolder);
-	tabFolder.setSelection((CTabItem) pages.get(newPage));
-	if (oldPage != null && oldPage != newPage) {
-		Control oldControl = oldPage.getControl();
-		if (oldControl!=null) oldControl.setVisible(false);
-	}
-	Control newControl = newPage.getControl();
-	newPage.becomesVisible(oldPage);
-	setControlVisible(newControl);
-	fireSelectionChanged(newPage);
-}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ExpandableGroup.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ExpandableGroup.java
deleted file mode 100644
index fd2e880..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ExpandableGroup.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-
-public abstract class ExpandableGroup {
-	private String text;
-	private boolean expanded;
-	private Composite expansion;
-	protected SelectableFormLabel textLabel;
-	private Composite control;
-	private int style;
-	private boolean expandable=true;
-	
-class ExpandableLayout extends Layout {
-	protected void layout(Composite parent, boolean changed) {
-		Rectangle clientArea = parent.getClientArea();
-		Point size = textLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-		int x = 0;
-		int y = 1;
-		
-		if (expandable) {
-			x = 8 + 8;
-		}
-		textLabel.setBounds(x, y, size.x, size.y);
-	
-		if (expandable)
-		   y = Math.max(size.y, 8) + 2 + 2;
-		else
-		   y = size.y + 2;
-		if (expanded) {
-			int areaWidth = clientArea.width - x;
-			size = expansion.computeSize(areaWidth, SWT.DEFAULT, changed);
-			expansion.setBounds(x, y, size.x, size.y);
-		}
-	}
-
-	protected Point computeSize(Composite parent, int wHint, int hHint, boolean changed) {
-		int width = 0, height = 0;
-		Point size = textLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-		width = size.x;
-		height = size.y + 2 + 2;
-		if (expanded) {
-			size = expansion.computeSize(wHint, SWT.DEFAULT, changed);
-			width = Math.max(width, size.x);
-			height += size.y;
-		}
-		if (expandable) {
-			height = Math.max(height, 8);
-			width += 8 + 8;
-		}
-		return new Point(width, height);
-	}
-}
-
-	public ExpandableGroup() {
-	}
-	
-	public ExpandableGroup(int style) {
-		this.style = style;
-	}
-	
-	public Control getControl() {
-		return control;
-	}
-	
-	public void createControl(Composite parent, FormWidgetFactory factory) {
-		final Canvas container = new Canvas(parent, SWT.NULL);
-		container.setBackground(factory.getBackgroundColor());
-		container.setLayout(new ExpandableLayout());
-		container.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				if (expandable) repaint(e);
-			}
-		});
-		container.addMouseListener(new MouseAdapter() {
-			public void mouseUp(MouseEvent e) {
-				Rectangle box = getBoxBounds(null);
-				if (box.contains(e.x, e.y)) {
-					setExpanded(!isExpanded());
-				}
-			}
-		});
-		textLabel = createTextLabel(container, factory);
-		getHyperlinkHandler(factory).registerHyperlink(textLabel, new HyperlinkAdapter () {
-			public void linkActivated(Control link) {
-				ExpandableGroup.this.linkActivated();
-				if (expandable) setExpanded(!isExpanded());
-			}
-		});
-		textLabel.addFocusListener(factory.visibilityHandler);
-		textLabel.addKeyListener(factory.keyboardHandler);		
-		if (text!=null) textLabel.setText(text);
-		expansion = factory.createComposite(container);
-		fillExpansion(expansion, factory);
-		this.control = container;
-	}
-	
-	protected SelectableFormLabel createTextLabel(Composite parent, FormWidgetFactory factory) {
-		SelectableFormLabel text = new SelectableFormLabel(parent, SWT.WRAP);
-		text.setBackground(factory.getBackgroundColor());
-		return text;
-	}
-	
-	protected HyperlinkHandler getHyperlinkHandler(FormWidgetFactory factory) {
-		return factory.getHyperlinkHandler();
-	}
-	
-	public abstract void fillExpansion(Composite expansion, FormWidgetFactory factory);
-	
-	public void setText(String text) {
-		this.text = text;
-		if (textLabel!=null)
-		   textLabel.setText(text);
-	}
-	
-	public String getText() {
-		return text;
-	}
-	
-	public boolean isExpanded() {
-		return expanded;
-	}
-	
-	public void setExpandable(boolean expandable) {
-		this.expandable = expandable;
-	}
-	
-	public boolean isExpandable() {
-		return expandable;
-	}
-	
-	public void setExpanded(boolean expanded) {
-		if (this.expanded != expanded) {
-			if (expanded) {
-				aboutToExpand();
-			}
-			else {
-				aboutToCollapse();
-			}
-			this.expanded = expanded;
-			expansion.setVisible(expanded);
-			control.layout();
-			if (expanded) {
-				this.expanded();
-			}
-			else {
-				collapsed();
-			}
-		}
-	}
-	
-	private void repaint(PaintEvent e) {
-		GC gc = e.gc;
-		Rectangle box = getBoxBounds(gc);
-		gc.setForeground(control.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
-		gc.drawRectangle(box);
-		gc.setForeground(control.getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND));
-		gc.drawLine(box.x+2, box.y+4, box.x+6, box.y+4);
-		if (!isExpanded()) {
-			gc.drawLine(box.x+4, box.y+2, box.x+4, box.y+6);
-		}
-	}
-	
-	private Rectangle getBoxBounds(GC gc) {
-		int x = 0;
-		int y = 0;
-		boolean noGC = false;
-	
-		if (gc==null) {
-			gc = new GC(control);
-			noGC = true;
-		}
-		gc.setFont(textLabel.getFont());
-		int height = gc.getFontMetrics().getHeight();
-		y = height/2 - 4 +1;
-		y = Math.max(y, 0);
-		if (noGC) gc.dispose();
-		return new Rectangle(x, y, 8, 8);
-	}
-	
-	protected void updateLayout() {
-		control.layout();
-	}
-	
-	protected void aboutToExpand() {
-	}
-	
-	protected void aboutToCollapse() {
-	}
-	
-	protected void expanded() {
-	}
-	protected void collapsed() {
-	}
-	protected void linkActivated() {
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormButton.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormButton.java
deleted file mode 100644
index 5d7f87f..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormButton.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-
-public class FormButton {
-	private Button button;
-	private Image image;
-	private FormWidgetFactory factory;
-	private Image hoverImage;
-	private boolean inside;
-	private Image disabledImage;
-
-public FormButton(Button button, FormWidgetFactory factory) {
-	this.button = button;
-	this.factory = factory;
-	button.addMouseTrackListener(new MouseTrackAdapter() {
-		public void mouseEnter(MouseEvent e) {
-			inside=true;
-			updateImage();
-		}
-		public void mouseExit(MouseEvent e) {
-			inside=false;
-			updateImage();
-		}
-	});
-}
-public Button getButton() {
-	return button;
-}
-public Image getDisabledImage() {
-	return disabledImage;
-}
-public Image getHoverImage() {
-	return hoverImage;
-}
-public Image getImage() {
-	return image;
-}
-public void setDisabledImage(Image newDisabledImage) {
-	disabledImage = newDisabledImage;
-}
-public void setEnabled(boolean enabled) {
-	button.setEnabled(enabled);
-	updateImage();
-}
-public void setHoverImage(Image newHoverImage) {
-	hoverImage = newHoverImage;
-}
-public void setImage(Image newImage) {
-	image = newImage;
-	if (hoverImage==null) hoverImage = image;
-	if (disabledImage==null) disabledImage = image;
-	updateImage();
-}
-public void updateImage() {
-	boolean enabled = button.isEnabled();
-	if (enabled == false) {
-		button.setImage(disabledImage);
-	} else {
-		if (inside) {
-			button.setCursor(factory.getHyperlinkCursor());
-			button.setImage(hoverImage);
-		} else {
-			button.setCursor(null);
-			button.setImage(image);
-		}
-	}
-}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormEntry.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormEntry.java
deleted file mode 100644
index a7b12e1..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormEntry.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.widgets.*;
-import java.util.*;
-
-public class FormEntry {
-	private Text text;
-	private String value;
-	private boolean dirty;
-	private Vector listeners=new Vector();
-	boolean ignoreModify=false;
-
-public FormEntry(Text text) {
-	this.text = text;
-	this.value = text.getText();
-	addListeners();
-}
-public void addFormTextListener(IFormTextListener listener) {
-	listeners.addElement(listener);
-}
-private void addListeners() {
-	text.addKeyListener(new KeyAdapter() {
-		public void keyReleased(KeyEvent e) {
-			keyReleaseOccured(e);
-		}
-	});
-	text.addModifyListener(new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			editOccured(e);
-		}
-	});
-	text.addFocusListener (new FocusAdapter() {
-		public void focusLost(FocusEvent e) {
-			if (dirty) commit();
-		}
-	});
-}
-public void commit() {
-	if (dirty) {
-		value = text.getText();
-		//notify
-		for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-			((IFormTextListener) iter.next()).textValueChanged(this);
-		}
-	}
-	dirty = false;
-}
-protected void editOccured(ModifyEvent e) {
-	if (ignoreModify) return;
-	dirty = true;
-	for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-		((IFormTextListener) iter.next()).textDirty(this);
-	}
-}
-
-public Text getControl() {
-	return text;
-}
-public java.lang.String getValue() {
-	return value;
-}
-public boolean isDirty() {
-	return dirty;
-}
-protected void keyReleaseOccured(KeyEvent e) {
-	if (e.character == '\r') {
-		// commit value
-		if (dirty) commit();
-	}
-	else if (e.character == '\u001b') { // Escape character
-		text.setText(value!=null?value:""); // restore old
-		dirty= false;
-	}
-}
-public void removeFormTextListener(IFormTextListener listener) {
-	listeners.removeElement(listener);
-}
-public void setDirty(boolean newDirty) {
-	dirty = newDirty;
-}
-public void setValue(String value) {
-	if (text!=null) text.setText(value!=null?value:"");
-	this.value = value;
-}
-
-public void setValue(String value, boolean blockNotification) {
-	ignoreModify = blockNotification;
-	setValue(value);
-	ignoreModify = false;
-}
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormLabel.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormLabel.java
deleted file mode 100644
index 8c16b5f..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormLabel.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import java.text.*;
-
-/**
- * FormText is a windowless control that
- * draws text in the provided context.
- */
-public class FormLabel extends Canvas {
-	private String text="";
-	int textMarginWidth=5;
-	int textMarginHeight=5;
-	private boolean underlined;
-
-	public FormLabel(Composite parent, int style) {
-		super(parent, style);
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-	}
-	public String getText() {
-		return text;
-	}
-	public void setText(String text) {
-		if (text!=null) 
-			this.text = text;
-		else
-			text = "";
-	}
-	
-	public void setUnderlined(boolean underlined) {
-		this.underlined = underlined;
-	}
-	
-	public boolean isUnderlined() {
-		return underlined;
-	}
-	
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		int innerWidth = wHint;
-		if (innerWidth!=SWT.DEFAULT)
-		   innerWidth -= textMarginWidth*2;
-		Point textSize = computeTextSize(innerWidth, hHint);
-		int textWidth = textSize.x + 2*textMarginWidth;
-		int textHeight = textSize.y + 2*textMarginHeight;
-		return new Point(textWidth, textHeight);
-	}
-	
-	public static int computeWrapHeight(GC gc, String text, int width) {
-		BreakIterator wb = BreakIterator.getWordInstance();
-		wb.setText(text);
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-
-		int saved = 0;
-		int last = 0;
-		int height = lineHeight;
-
-		for (int loc = wb.first();
-			     loc != BreakIterator.DONE;
-			     loc = wb.next()) {
-		   String word = text.substring(saved, loc);
-		   Point extent = gc.textExtent(word);
-		   if (extent.x > width) {
-		   		// overflow
-		   		saved = last;
-		   		height += extent.y;
-		   }
-		   last = loc;
-		}
-		return height;
-	}
-	
-	private Point computeTextSize(int wHint, int hHint) {
-		Point extent;
-		GC gc = new GC(this);
-		
-		gc.setFont(getFont());
-		if ((getStyle() & SWT.WRAP)!=0 && wHint != SWT.DEFAULT) {
-			int height = computeWrapHeight(gc, text, wHint);
-			extent = new Point(wHint, height);
-		}
-		else {
-			extent = gc.textExtent(getText());
-		}
-		gc.dispose();
-		return extent;
-	}
-
-	public static void paintWrapText(GC gc, Point size, String text, int marginWidth, int marginHeight) {
-		paintWrapText(gc, size, text, marginWidth, marginHeight, false);
- 	}
-
-	public static void paintWrapText(GC gc, Point size, String text, int marginWidth, int marginHeight, boolean underline) {
-  		BreakIterator wb = BreakIterator.getWordInstance();
-		wb.setText(text);
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		int descent = fm.getDescent();
-
-		int saved = 0;
-		int last = 0;
-		int y = marginHeight;
-		int width = size.x - marginWidth*2;
-
-		for (int loc = wb.first();
-		     loc != BreakIterator.DONE;
-		     loc = wb.next()) {
-	   		String line = text.substring(saved, loc);
-	   		Point extent = gc.textExtent(line);
-	   		if (extent.x > width) {
-	   			// overflow
-	   			String prevLine = text.substring(saved, last);
-	   			gc.drawString(prevLine, marginWidth, y, true);
-	   			if (underline) {
-					Point prevExtent = gc.textExtent(prevLine);
-	   				int lineY = y + lineHeight - descent + 1;
-	   				gc.drawLine(marginWidth, lineY, prevExtent.x, lineY);
-	   			}
-	   			
-	   			saved = last;
-	   			y += lineHeight;
-	   		}
-	   		last = loc;
-		}
-		// paint the last line
-		String lastLine = text.substring(saved, last);
-		gc.drawString(lastLine, marginWidth, y, true);
-		if (underline) {
-			int lineY = y + lineHeight - descent + 1;
-			Point lastExtent = gc.textExtent(lastLine);
-			gc.drawLine(marginWidth, lineY, marginWidth + lastExtent.x, lineY);
-		}
-	}
-	
-	protected void paint(PaintEvent e) {
-		GC gc = e.gc;
-		Point size = getSize();
-	   	gc.setFont(getFont());
-	   	gc.setForeground(getForeground());
-	   	if ((getStyle() & SWT.WRAP)!=0) {
-	   		paintWrapText(gc, size, text, textMarginWidth, textMarginHeight, underlined);
-	   	}
-	   	else {
-		   gc.drawText(getText(), textMarginWidth, textMarginHeight, true);
-		   if (underlined) {
-	   			FontMetrics fm = gc.getFontMetrics();
-				int descent = fm.getDescent();
-		   		int lineY = size.y - textMarginHeight - descent + 1;
-		      	gc.drawLine(textMarginWidth, lineY, size.x-textMarginWidth, lineY);
-		   }
-	   	}
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormSection.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormSection.java
deleted file mode 100644
index 41084f4..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormSection.java
+++ /dev/null
@@ -1,417 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.*;
-import org.eclipse.jface.util.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.dnd.Clipboard;
-
-public abstract class FormSection implements IPropertyChangeListener {
-	public static final int SELECTION = 1;
-	private String headerColorKey = FormWidgetFactory.DEFAULT_HEADER_COLOR;
-	private String headerText;
-	private Control client;
-	protected Label header;
-	protected Control separator;
-	private SectionChangeManager sectionManager;
-	private String description;
-	private boolean dirty;
-	protected Label descriptionLabel;
-	private ToggleControl toggle;
-	private boolean readOnly;
-	private boolean addSeparator = true;
-	private boolean descriptionPainted = true;
-	private boolean headerPainted = true;
-	private boolean collapsable = false;
-	private boolean collapsed = false;
-	private int widthHint = SWT.DEFAULT;
-	private int heightHint = SWT.DEFAULT;
-	private Composite control;
-
-	/*
-	 * This is a special layout for the section. Both the
-	 * header and the description labels will wrap and
-	 * they will use client's size to calculate needed
-	 * height. This kind of behaviour is not possible
-	 * with stock grid layout.
-	 */
-	class SectionLayout extends Layout {
-		int vspacing = 3;
-		int sepHeight = 2;
-
-		protected Point computeSize(
-			Composite parent,
-			int wHint,
-			int hHint,
-			boolean flush) {
-			int width = 0;
-			int height = 0;
-			int cwidth = 0;
-			int collapsedHeight = 0;
-
-			if (wHint != SWT.DEFAULT)
-				width = wHint;
-			if (hHint != SWT.DEFAULT)
-				height = hHint;
-
-			cwidth = width;
-
-			if (client != null) {
-				Point csize = client.computeSize(SWT.DEFAULT, SWT.DEFAULT, flush);
-				if (width == 0) {
-					width = csize.x;
-					cwidth = width;
-				}
-				if (height == 0)
-					height = csize.y;
-			}
-
-			Point toggleSize = null;
-
-			if (collapsable && toggle != null)
-				toggleSize = toggle.computeSize(SWT.DEFAULT, SWT.DEFAULT, flush);
-
-			if (hHint == SWT.DEFAULT && headerPainted && header != null) {
-				int hwidth = cwidth;
-				if (toggleSize != null)
-					hwidth = cwidth - toggleSize.x - 5;
-				Point hsize = header.computeSize(hwidth, SWT.DEFAULT, flush);
-				height += hsize.y;
-				collapsedHeight = hsize.y;
-				height += vspacing;
-			}
-
-			if (hHint == SWT.DEFAULT && addSeparator) {
-				height += sepHeight;
-				height += vspacing;
-				collapsedHeight += vspacing + sepHeight;
-			}
-			if (hHint == SWT.DEFAULT && descriptionPainted && descriptionLabel != null) {
-				Point dsize = descriptionLabel.computeSize(cwidth, SWT.DEFAULT, flush);
-				height += dsize.y;
-				height += vspacing;
-			}
-			if (toggle != null && toggle.getSelection()) {
-				// collapsed state
-				height = collapsedHeight;
-			}
-			return new Point(width, height);
-		}
-		protected void layout(Composite parent, boolean flush) {
-			int width = parent.getClientArea().width;
-			int height = parent.getClientArea().height;
-			int y = 0;
-			Point toggleSize = null;
-
-			if (collapsable) {
-				toggleSize = toggle.computeSize(SWT.DEFAULT, SWT.DEFAULT, flush);
-			}
-			if (headerPainted && header != null) {
-				Point hsize;
-
-				int availableWidth = width;
-				if (toggleSize != null)
-					availableWidth = width - toggleSize.x - 5;
-				hsize = header.computeSize(availableWidth, SWT.DEFAULT, flush);
-				int hx = 0;
-				if (toggle != null) {
-					int ty = y + hsize.y - toggleSize.y;
-					toggle.setBounds(0, ty, toggleSize.x, toggleSize.y);
-					hx = toggleSize.x; // + 5;
-				}
-				header.setBounds(hx, y, availableWidth, hsize.y);
-
-				y += hsize.y + vspacing;
-			}
-			if (addSeparator && separator != null) {
-				separator.setBounds(0, y, width, 2);
-				y += sepHeight + vspacing;
-			}
-			if (toggle != null && toggle.getSelection()) {
-				return;
-			}
-			if (descriptionPainted && descriptionLabel != null) {
-				Point dsize = descriptionLabel.computeSize(width, SWT.DEFAULT, flush);
-				descriptionLabel.setBounds(0, y, width, dsize.y);
-				y += dsize.y + vspacing;
-			}
-			if (client != null) {
-				client.setBounds(0, y, width, height - y);
-			}
-		}
-	}
-
-	public FormSection() {
-		// Description causes problems re word wrapping
-		// and causes bad layout in schema and
-		// feature editors when in Motif - turning off
-		if (SWT.getPlatform().equals("motif")) {
-			descriptionPainted = false;
-		}
-		JFaceResources.getFontRegistry().addListener(this);
-	}
-	public void commitChanges(boolean onSave) {
-	}
-	public abstract Composite createClient(
-		Composite parent,
-		FormWidgetFactory factory);
-	public final Control createControl(
-		Composite parent,
-		final FormWidgetFactory factory) {
-		Composite section = factory.createComposite(parent);
-		SectionLayout slayout = new SectionLayout();
-		section.setLayout(slayout);
-		section.setData(this);
-
-		if (headerPainted) {
-			Color headerColor = factory.getColor(getHeaderColorKey());
-			header =
-				factory.createHeadingLabel(section, getHeaderText(), headerColor, SWT.WRAP);
-			if (collapsable) {
-				toggle = new ToggleControl(section, SWT.NULL);
-				toggle.setSelection(collapsed);
-				toggle.setBackground(factory.getBackgroundColor());
-				toggle.setActiveDecorationColor(factory.getHyperlinkColor());
-				toggle.setDecorationColor(factory.getColor(factory.COLOR_COMPOSITE_SEPARATOR));
-				toggle.setActiveCursor(factory.getHyperlinkCursor());
-				toggle.addFocusListener(factory.visibilityHandler);
-				toggle.addKeyListener(factory.keyboardHandler);
-				toggle.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						doToggle();
-					}
-				});
-					header.addMouseListener(new MouseAdapter() {
-					public void mouseDown(MouseEvent e) {
-						toggle.setSelection(!toggle.getSelection());
-						toggle.redraw();
-						doToggle();
-					}
-				});
-				header.addMouseTrackListener(new MouseTrackAdapter() {
-					public void mouseEnter(MouseEvent e) {
-						header.setCursor(factory.getHyperlinkCursor());
-					}
-					public void mouseExit(MouseEvent e) {
-						header.setCursor(null);
-					}
-				});
-			}
-		}
-
-		if (addSeparator) {
-			//separator = factory.createSeparator(section, SWT.HORIZONTAL);
-			separator = factory.createCompositeSeparator(section);
-		}
-
-		if (descriptionPainted && description != null) {
-			descriptionLabel = factory.createLabel(section, description, SWT.WRAP);
-		}
-		client = createClient(section, factory);
-		section.setData(this);
-		control = section;
-		return section;
-	}
-	
-	private void doToggle() {
-		boolean collapsed = toggle.getSelection();
-		reflow();
-		if (descriptionLabel != null)
-		descriptionLabel.setVisible(!collapsed);
-		if (client != null)
-		client.setVisible(!collapsed);
-	}
-
-	protected void reflow() {
-		control.layout(true);
-		control.getParent().layout(true);
-	}
-
-	protected Text createText(
-		Composite parent,
-		String label,
-		FormWidgetFactory factory) {
-		return createText(parent, label, factory, 1);
-	}
-	protected Text createText(
-		Composite parent,
-		String label,
-		FormWidgetFactory factory,
-		int span) {
-		factory.createLabel(parent, label);
-		Text text = factory.createText(parent, "");
-		GridData gd =
-			new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
-		gd.grabExcessHorizontalSpace = true;
-		gd.horizontalSpan = span;
-		text.setLayoutData(gd);
-		return text;
-	}
-	protected Text createText(
-		Composite parent,
-		FormWidgetFactory factory,
-		int span) {
-		Text text = factory.createText(parent, "");
-		GridData gd =
-			new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
-		gd.grabExcessHorizontalSpace = true;
-		gd.horizontalSpan = span;
-		text.setLayoutData(gd);
-		return text;
-	}
-	public void dispose() {
-		JFaceResources.getFontRegistry().removeListener(this);
-	}
-	public boolean doGlobalAction(String actionId) {
-		return false;
-	}
-	public void expandTo(Object object) {
-	}
-	public final void fireChangeNotification(int changeType, Object changeObject) {
-		if (sectionManager == null)
-			return;
-		sectionManager.dispatchNotification(this, changeType, changeObject);
-	}
-	public final void fireSelectionNotification(Object changeObject) {
-		fireChangeNotification(SELECTION, changeObject);
-	}
-	public java.lang.String getDescription() {
-		return description;
-	}
-	public java.lang.String getHeaderColorKey() {
-		return headerColorKey;
-	}
-	public java.lang.String getHeaderText() {
-		return headerText;
-	}
-	public int getHeightHint() {
-		return heightHint;
-	}
-	public int getWidthHint() {
-		return widthHint;
-	}
-	public void initialize(Object input) {
-	}
-	public boolean isAddSeparator() {
-		return addSeparator;
-	}
-	public boolean isDescriptionPainted() {
-		return descriptionPainted;
-	}
-	public boolean isDirty() {
-		return dirty;
-	}
-	public boolean isHeaderPainted() {
-		return headerPainted;
-	}
-	public boolean isReadOnly() {
-		return readOnly;
-	}
-	public void sectionChanged(
-		FormSection source,
-		int changeType,
-		Object changeObject) {
-	}
-	public void setAddSeparator(boolean newAddSeparator) {
-		addSeparator = newAddSeparator;
-	}
-
-	private String trimNewLines(String text) {
-		StringBuffer buff = new StringBuffer();
-		for (int i = 0; i < text.length(); i++) {
-			char c = text.charAt(i);
-			if (c == '\n')
-				buff.append(' ');
-			else
-				buff.append(c);
-		}
-		return buff.toString();
-	}
-
-	public void setDescription(java.lang.String newDescription) {
-		// we will trim the new lines so that we can
-		// use layout-based word wrapping instead
-		// of hard-coded one
-		description = trimNewLines(newDescription);
-		//description = newDescription;
-		if (descriptionLabel != null)
-			descriptionLabel.setText(newDescription);
-	}
-	public void setDescriptionPainted(boolean newDescriptionPainted) {
-		descriptionPainted = newDescriptionPainted;
-	}
-	public void setDirty(boolean newDirty) {
-		dirty = newDirty;
-	}
-	public void setFocus() {
-		if (toggle!=null)
-			toggle.setFocus();
-	}
-	public void setHeaderColorKey(java.lang.String newHeaderColorKey) {
-		headerColorKey = newHeaderColorKey;
-	}
-	public void setHeaderPainted(boolean newHeaderPainted) {
-		headerPainted = newHeaderPainted;
-	}
-	public void setHeaderText(java.lang.String newHeaderText) {
-		headerText = newHeaderText;
-		if (header != null)
-			header.setText(headerText);
-	}
-	public void setHeightHint(int newHeightHint) {
-		heightHint = newHeightHint;
-	}
-	void setManager(SectionChangeManager manager) {
-		this.sectionManager = manager;
-	}
-	public void setReadOnly(boolean newReadOnly) {
-		readOnly = newReadOnly;
-	}
-
-	public void setWidthHint(int newWidthHint) {
-		widthHint = newWidthHint;
-	}
-
-	public void update() {
-	}
-
-	public void propertyChange(PropertyChangeEvent arg0) {
-		if (control != null && header != null) {
-			header.setFont(JFaceResources.getBannerFont());
-			control.layout(true);
-		}
-	}
-
-	/**
-	 * Gets the collapsable.
-	 * @return Returns a boolean
-	 */
-	public boolean getCollapsable() {
-		return collapsable;
-	}
-
-	/**
-	 * Sets the collapsable.
-	 * @param collapsable The collapsable to set
-	 */
-	public void setCollapsable(boolean collapsable) {
-		this.collapsable = collapsable;
-	}
-
-	public void setCollapsed(boolean collapsed) {
-		this.collapsed = collapsed;
-	}
-	
-	public boolean canPaste(Clipboard clipboard) {
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormWidgetFactory.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormWidgetFactory.java
deleted file mode 100644
index b631822..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/FormWidgetFactory.java
+++ /dev/null
@@ -1,395 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.graphics.*;
-import java.util.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.update.ui.forms.internal.engine.FormEngine;
-
-public class FormWidgetFactory {
-	public static final String DEFAULT_HEADER_COLOR = "__default__header__";
-	public static final String COLOR_BACKGROUND = "__bg";
-	public static final String COLOR_BORDER = "__border";
-	public static final String COLOR_COMPOSITE_SEPARATOR = "__compSep";
-	public static final String COLOR_HYPERLINK = "__hyperlink";
-
-	private Hashtable colorRegistry = new Hashtable();
-	private Color backgroundColor;
-	private Color clientAreaColor;
-	private KeyListener deleteListener;
-	private Color foregroundColor;
-	private Display display;
-	public static final int BORDER_STYLE = SWT.NONE; //SWT.BORDER;
-	private BorderPainter borderPainter;
-	private Color borderColor;
-	private HyperlinkHandler hyperlinkHandler;
-	/* default */ VisibilityHandler visibilityHandler;
-	/* default */ KeyboardHandler keyboardHandler;
-
-	class BorderPainter implements PaintListener {
-		public void paintControl(PaintEvent event) {
-			Composite composite = (Composite) event.widget;
-			Control[] children = composite.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				Control c = children[i];
-				if (c.isEnabled() == false && !(c instanceof CCombo))
-					continue;
-				if (c instanceof SelectableFormLabel)
-					continue;
-				if (c instanceof Text || c instanceof Canvas || c instanceof CCombo) {
-					Rectangle b = c.getBounds();
-					GC gc = event.gc;
-					gc.setForeground(c.getBackground());
-					gc.drawRectangle(b.x - 1, b.y - 1, b.width + 1, b.height + 1);
-					gc.setForeground(foregroundColor);
-					gc.drawRectangle(b.x - 2, b.y - 2, b.width + 3, b.height + 3);
-				} else if (c instanceof Table || c instanceof Tree || c instanceof TableTree) {
-					Rectangle b = c.getBounds();
-					GC gc = event.gc;
-					gc.setForeground(borderColor);
-					//gc.drawRectangle(b.x - 2, b.y - 2, b.width + 3, b.height + 3);
-					gc.drawRectangle(b.x - 1, b.y - 1, b.width + 2, b.height + 2);
-				}
-			}
-		}
-	}
-
-	class VisibilityHandler extends FocusAdapter {
-		public void focusGained(FocusEvent e) {
-			Widget w = e.widget;
-			if (w instanceof Control) {
-				ensureVisible((Control) w);
-			}
-		}
-	}
-
-	class KeyboardHandler extends KeyAdapter {
-		public void keyPressed(KeyEvent e) {
-			Widget w = e.widget;
-			if (w instanceof Control) {
-				processKey(e.keyCode, (Control) w);
-			}
-		}
-	}
-
-	public FormWidgetFactory() {
-		this(Display.getCurrent());
-	}
-
-	public FormWidgetFactory(Display display) {
-		this.display = display;
-		initialize();
-	}
-
-	public static ScrolledComposite getScrolledComposite(Control c) {
-		Composite parent = c.getParent();
-
-		while (parent != null) {
-			if (parent instanceof ScrolledComposite) {
-				return (ScrolledComposite) parent;
-			}
-			parent = parent.getParent();
-		}
-		return null;
-	}
-
-	public static void ensureVisible(Control c) {
-		ScrolledComposite scomp = getScrolledComposite(c);
-		if (scomp != null) {
-			AbstractSectionForm.ensureVisible(scomp, c);
-		}
-	}
-
-	public static void processKey(int keyCode, Control c) {
-		ScrolledComposite scomp = getScrolledComposite(c);
-		if (scomp != null) {
-			switch (keyCode) {
-				case SWT.ARROW_DOWN :
-					AbstractSectionForm.scrollVertical(scomp, false);
-					break;
-				case SWT.ARROW_UP :
-					AbstractSectionForm.scrollVertical(scomp, true);
-					break;
-				case SWT.ARROW_LEFT :
-					AbstractSectionForm.scrollHorizontal(scomp, true);
-					break;
-				case SWT.ARROW_RIGHT :
-					AbstractSectionForm.scrollHorizontal(scomp, false);
-					break;
-				case SWT.PAGE_UP :
-					AbstractSectionForm.scrollPage(scomp, true);
-					break;
-				case SWT.PAGE_DOWN :
-					AbstractSectionForm.scrollPage(scomp, false);
-					break;
-			}
-		}
-	}
-
-	public Button createButton(Composite parent, String text, int style) {
-		int flatStyle = BORDER_STYLE == SWT.BORDER ? SWT.NULL : SWT.FLAT;
-		//int flatStyle = SWT.NULL;
-		Button button = new Button(parent, style | flatStyle);
-		button.setBackground(backgroundColor);
-		button.setForeground(foregroundColor);
-		if (text != null)
-			button.setText(text);
-		button.addFocusListener(visibilityHandler);
-		return button;
-	}
-	public Composite createComposite(Composite parent) {
-		return createComposite(parent, SWT.NULL);
-	}
-	public Composite createComposite(Composite parent, int style) {
-		Composite composite = new Composite(parent, style);
-		composite.setBackground(backgroundColor);
-		composite.addMouseListener(new MouseAdapter() {
-			public void mousePressed(MouseEvent e) {
-				((Control) e.widget).setFocus();
-			}
-		});
-		return composite;
-	}
-	public Composite createCompositeSeparator(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setBackground(getColor(COLOR_COMPOSITE_SEPARATOR));
-		return composite;
-	}
-
-	public Label createHeadingLabel(Composite parent, String text) {
-		return createHeadingLabel(parent, text, null, SWT.NONE);
-	}
-
-	public Label createHeadingLabel(Composite parent, String text, int style) {
-		return createHeadingLabel(parent, text, null, style);
-	}
-
-	public Label createHeadingLabel(Composite parent, String text, Color bg) {
-		return createHeadingLabel(parent, text, bg, SWT.NONE);
-	}
-
-	public Label createHeadingLabel(
-		Composite parent,
-		String text,
-		Color bg,
-		int style) {
-		Label label = new Label(parent, style);
-		if (text != null)
-			label.setText(text);
-		label.setBackground(backgroundColor);
-		label.setForeground(foregroundColor);
-		label.setFont(JFaceResources.getFontRegistry().get(JFaceResources.BANNER_FONT));
-		return label;
-	}
-
-	public Label createHyperlinkLabel(
-		Composite parent,
-		String text,
-		IHyperlinkListener listener) {
-		return createHyperlinkLabel(parent, text, listener, SWT.NULL);
-	}
-	public Label createHyperlinkLabel(
-		Composite parent,
-		String text,
-		IHyperlinkListener listener,
-		int style) {
-		Label label = createLabel(parent, text, style);
-		turnIntoHyperlink(label, listener);
-		return label;
-	}
-	public Label createLabel(Composite parent, String text) {
-		return createLabel(parent, text, SWT.NONE);
-	}
-	public Label createLabel(Composite parent, String text, int style) {
-		Label label = new Label(parent, style);
-		if (text != null)
-			label.setText(text);
-		label.setBackground(backgroundColor);
-		label.setForeground(foregroundColor);
-		return label;
-	}
-
-	public SelectableFormLabel createSelectableLabel(
-		Composite parent,
-		String text) {
-		return createSelectableLabel(parent, text, SWT.NONE);
-	}
-
-	public SelectableFormLabel createSelectableLabel(
-		Composite parent,
-		String text,
-		int style) {
-		SelectableFormLabel label = new SelectableFormLabel(parent, style);
-		if (text != null)
-			label.setText(text);
-		label.setBackground(backgroundColor);
-		label.setForeground(foregroundColor);
-		label.addFocusListener(visibilityHandler);
-		label.addKeyListener(keyboardHandler);
-		return label;
-	}
-
-	public FormEngine createFormEngine(Composite parent) {
-		FormEngine engine = new FormEngine(parent, SWT.WRAP);
-		engine.setBackground(backgroundColor);
-		engine.setForeground(foregroundColor);
-		engine.marginWidth = 1;
-		engine.marginHeight = 0;
-		engine.setHyperlinkSettings(getHyperlinkHandler());
-		engine.addKeyListener(keyboardHandler);
-		return engine;
-	}
-
-	public Label createSeparator(Composite parent, int style) {
-		Label label = new Label(parent, SWT.SEPARATOR | style);
-		label.setBackground(backgroundColor);
-		label.setForeground(borderColor);
-		return label;
-	}
-	public Table createTable(Composite parent, int style) {
-		Table table = new Table(parent, BORDER_STYLE | style);
-		table.setBackground(backgroundColor);
-		table.setForeground(foregroundColor);
-		hookDeleteListener(table);
-		return table;
-	}
-	public Text createText(Composite parent, String value) {
-		return createText(parent, value, BORDER_STYLE | SWT.SINGLE);
-	}
-	public Text createText(Composite parent, String value, int style) {
-		Text text = new Text(parent, style);
-		if (value != null)
-			text.setText(value);
-		text.setBackground(clientAreaColor);
-		text.setForeground(foregroundColor);
-		text.addFocusListener(visibilityHandler);
-		return text;
-	}
-	public Tree createTree(Composite parent, int style) {
-		Tree tree = new Tree(parent, BORDER_STYLE | style);
-		tree.setBackground(backgroundColor);
-		tree.setForeground(foregroundColor);
-		hookDeleteListener(tree);
-		return tree;
-	}
-	private void deleteKeyPressed(Widget widget) {
-		if (!(widget instanceof Control))
-			return;
-		Control control = (Control) widget;
-		for (Control parent = control.getParent();
-			parent != null;
-			parent = parent.getParent()) {
-			if (parent.getData() instanceof FormSection) {
-				FormSection section = (FormSection) parent.getData();
-				section.doGlobalAction(IWorkbenchActionConstants.DELETE);
-				break;
-			}
-		}
-	}
-	public void dispose() {
-		Enumeration colors = colorRegistry.elements();
-		while (colors.hasMoreElements()) {
-			Color c = (Color) colors.nextElement();
-			c.dispose();
-		}
-		hyperlinkHandler.dispose();
-		colorRegistry = null;
-	}
-	public Color getBackgroundColor() {
-		return backgroundColor;
-	}
-	public Color getBorderColor() {
-		return borderColor;
-	}
-	public Cursor getBusyCursor() {
-		return hyperlinkHandler.getBusyCursor();
-	}
-	public Color getClientAreaColor() {
-		return clientAreaColor;
-	}
-	public Color getColor(String key) {
-		return (Color) colorRegistry.get(key);
-	}
-	public Color getForegroundColor() {
-		return foregroundColor;
-	}
-	public HyperlinkHandler getHyperlinkHandler() {
-		return hyperlinkHandler;
-	}
-	public Cursor getHyperlinkCursor() {
-		return hyperlinkHandler.getHyperlinkCursor();
-	}
-	public Color getHyperlinkColor() {
-		return hyperlinkHandler.getForeground();
-	}
-	public Color getHyperlinkHoverColor() {
-		return hyperlinkHandler.getActiveForeground();
-	}
-	public int getHyperlinkUnderlineMode() {
-		return hyperlinkHandler.getHyperlinkUnderlineMode();
-	}
-	public void hookDeleteListener(Control control) {
-		if (deleteListener == null) {
-			deleteListener = new KeyAdapter() {
-				public void keyPressed(KeyEvent event) {
-					if (event.character == SWT.DEL && event.stateMask == 0) {
-						deleteKeyPressed(event.widget);
-					}
-				}
-			};
-		}
-		control.addKeyListener(deleteListener);
-	}
-	private void initialize() {
-		clientAreaColor = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
-		//registerColor(COLOR_BACKGROUND, 0xff, 0xfe, 0xf9);
-		registerColor(COLOR_BORDER, 195, 191, 179);
-		registerColor(COLOR_COMPOSITE_SEPARATOR, 152, 170, 203);
-		registerColor(DEFAULT_HEADER_COLOR, 0x48, 0x70, 0x98);
-		//backgroundColor = getColor(COLOR_BACKGROUND);
-		backgroundColor = clientAreaColor;
-		borderColor = getColor(COLOR_BORDER);
-		foregroundColor = display.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
-		hyperlinkHandler = new HyperlinkHandler();
-		Color hyperlinkColor = JFaceColors.getHyperlinkText(display);
-		//hyperlinkHandler.setForeground(registerColor(COLOR_HYPERLINK, 0, 0, 153));
-		hyperlinkHandler.setForeground(hyperlinkColor);
-		hyperlinkHandler.setBackground(backgroundColor);
-		visibilityHandler = new VisibilityHandler();
-		keyboardHandler = new KeyboardHandler();
-	}
-
-	public void paintBordersFor(Composite parent) {
-		if (BORDER_STYLE == SWT.BORDER)
-			return;
-		if (borderPainter == null)
-			borderPainter = new BorderPainter();
-		parent.addPaintListener(borderPainter);
-	}
-	public Color registerColor(String key, int r, int g, int b) {
-		Color c = new Color(display, r, g, b);
-		colorRegistry.put(key, c);
-		return c;
-	}
-	public void setHyperlinkColor(Color color) {
-		hyperlinkHandler.setForeground(color);
-	}
-	public void setHyperlinkHoverColor(org.eclipse.swt.graphics.Color hoverColor) {
-		hyperlinkHandler.setActiveForeground(hoverColor);
-	}
-	public void setHyperlinkUnderlineMode(int newHyperlinkUnderlineMode) {
-		hyperlinkHandler.setHyperlinkUnderlineMode(newHyperlinkUnderlineMode);
-	}
-	public void turnIntoHyperlink(Control control, IHyperlinkListener listener) {
-		hyperlinkHandler.registerHyperlink(control, listener);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HTMLTableLayout.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HTMLTableLayout.java
deleted file mode 100644
index 3232633..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HTMLTableLayout.java
+++ /dev/null
@@ -1,645 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import java.util.*;
-import org.eclipse.swt.SWT;
-
-/**
- * This implementation of the layout algorithm
- * attempts to position controls in the composite
- * using a two-pass autolayout HTML table altorithm
- * recommeded by HTML 4.01 W3C specification.
- * The main differences with GridLayout is that
- * it has two passes and that width and height
- * are not calculated in the same pass.
- * <p>
- * The advantage of the algorithm over GridLayout
- * is that it is capable of flowing text controls
- * capable of line wrap. These controls do not
- * have natural 'preferred size'. Instead, 
- * they are capable of providing the required
- * height if the width is set. Consequently,
- * this algorithm first calculates the widths
- * that will be assigned to columns, and then
- * passes those widths to the controls to
- * calculate the height. When a composite
- * with this layout is a child of the scrolling
- * composite, they should interact in such
- * a way that reduction in the scrolling composite
- * width results in the reflow and increase of
- * the overall height.
- * <p>
- * If none of the columns contain expandable
- * and wrappable controls, the end-result
- * will be similar to the one provided
- * by GridLayout. The difference will
- * show up for layouts that contain
- * controls whose minimum and maximum
- * widths are not the same.
- */
-
-public class HTMLTableLayout extends Layout {
-	public int numColumns = 1;
-	public int leftMargin = 5;
-	public int rightMargin = 5;
-	public int topMargin = 5;
-	public int bottomMargin = 5;
-	public int horizontalSpacing = 5;
-	public int verticalSpacing = 5;
-	public boolean makeColumnsEqualWidth = false;
-	
-	private boolean initialLayout=true;
-	private Vector grid = null;
-	private int [] minColumnWidths, maxColumnWidths;
-	private int widestColumnWidth;
-	private int [] growingColumns;
-	
-	public int getMinimumWidth(Composite parent, boolean changed) {
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-		   changed = true;
-		   initialLayout = false;
-		}
-		if (grid==null || changed) {
-		   changed = true;
-		   grid = new Vector();
-		   createGrid(parent);
-		}
-		if (minColumnWidths==null)
-		   minColumnWidths = new int [numColumns];
-		for (int i=0; i<numColumns; i++) {
-			minColumnWidths[i] = 0;
-		}
-		return internalGetMinimumWidth(parent, changed);
-	}
-	
-	public int getMaximumWidth(Composite parent, boolean changed) {
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-		   changed = true;
-		   initialLayout = false;
-		}
-		if (grid==null || changed) {
-		   changed = true;
-		   grid = new Vector();
-		   createGrid(parent);
-		}
-		if (maxColumnWidths==null)
-		   maxColumnWidths = new int[numColumns];
-		for (int i=0; i<numColumns; i++) {
-			maxColumnWidths[i] = 0;
-		}
-		return internalGetMaximumWidth(parent, changed);
-	}
-	
-	/**
-	 * @see Layout#layout(Composite, boolean)
-	 */
-	protected void layout(Composite parent, boolean changed) {
-		Rectangle clientArea = parent.getClientArea();
-		Control [] children = parent.getChildren();
-		if (children.length ==0) return;
-		int parentWidth = clientArea.width;
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-		   changed = true;
-		   initialLayout = false;
-		}
-		if (grid==null || changed) {
-		   changed = true;
-		   grid = new Vector();
-		   createGrid(parent);
-		}
-		resetColumnWidths();
-		int minWidth = internalGetMinimumWidth(parent, changed);
-		int maxWidth = internalGetMaximumWidth(parent, changed);
-		
-		int tableWidth = parentWidth;
-		
-		int [] columnWidths;
-		
-		if (parentWidth < minWidth) {
-		   tableWidth = minWidth;
-		   if (makeColumnsEqualWidth) {
-		      columnWidths = new int[numColumns];
-		      for (int i=0; i<numColumns; i++) {
-		      	columnWidths[i] = widestColumnWidth;
-		      }
-		   }
-		   else
-		      columnWidths = minColumnWidths;
-		}
-		else if (parentWidth > maxWidth) {
-			if (growingColumns.length==0) {
-		   		tableWidth = maxWidth;
-		   		columnWidths = maxColumnWidths;
-			}
-			else {
-				columnWidths = new int [numColumns];
-				int colSpace = tableWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns-1)*horizontalSpacing;
-				int extra = parentWidth - maxWidth;
-				int colExtra = extra / growingColumns.length;
-				for (int i=0; i<numColumns; i++) {
-					columnWidths[i] = maxColumnWidths[i];
-				
-					if (isGrowingColumn(i)) {
-						columnWidths[i] += colExtra;
-					}
-				}
-			}
-		}
-		else {
-			columnWidths = new int [numColumns];
-			if (makeColumnsEqualWidth) {
-				int colSpace = tableWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns-1)*horizontalSpacing;
-				int col = colSpace/numColumns;
-				for (int i=0; i<numColumns; i++) {
-					columnWidths[i] = col;
-				}
-			}
-			else {
-			   int [] extraSpace = calculateExtraSpace(tableWidth, maxWidth, minWidth);
-			   for (int i=0; i<numColumns; i++) {
-				  int minCWidth = minColumnWidths[i];
-		   		  columnWidths[i] = minCWidth + extraSpace[i];
-			   }
-			}
-		}
-		int x = 0;
-		int y = topMargin;
-		// assign widths 
-		for (int i=0; i<grid.size(); i++) {
-			TableData [] row = (TableData [])grid.elementAt(i);
-			// assign widths, calculate heights
-			int rowHeight = 0;
-			x = leftMargin;
-			for (int j=0; j<numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData==false) {
-					continue;
-				}
-				Control child = children[td.childIndex];
-				int span = td.colspan;
-				int cwidth = 0;
-				for (int k=j; k<j+span; k++) {
-					cwidth += columnWidths[k];
-					if (k<j+span-1) cwidth += horizontalSpacing;
-				}
-				Point size = computeSize(child, cwidth, changed);
-				td.compWidth = cwidth;
-				if (td.heightHint!=SWT.DEFAULT) {
-					size = new Point(size.x, td.heightHint);
-				}
-				td.compSize = size;
-				rowHeight = Math.max(rowHeight, size.y);
-			}
-			for (int j=0; j<numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData==false) {
-					continue;
-				}
-				Control child = children[td.childIndex];
-				placeControl(child, td, x, y, rowHeight);
-				x += td.compWidth;
-				if (j<numColumns-1) x+= horizontalSpacing;		
-			}
-			y += rowHeight + verticalSpacing;
-		}
-	}
-	
-boolean isGrowingColumn(int col) {
-	if (growingColumns==null) return false;
-	for (int i=0; i<growingColumns.length; i++) {
-		if (col == growingColumns[i]) return true;
-	}
-	return false;
-}	
-	
-int [] calculateExtraSpace(int tableWidth, int maxWidth, int minWidth) {
-	int fixedPart = leftMargin + rightMargin + (numColumns-1)*horizontalSpacing;
-	int D = maxWidth - minWidth;
-	
-	int W = tableWidth -fixedPart - minWidth;
-	
-	int extraSpace [] = new int [numColumns];
-
-	int rem = 0;
-	for (int i=0; i<numColumns; i++) { 
-		int cmin = minColumnWidths[i];
-		int cmax = maxColumnWidths[i];
-		int d = cmax - cmin;
-		int extra = D!=0 ? (d * W)/D : 0;
-		if (i<numColumns-1) {
-			extraSpace [i] = extra;
-			rem += extra;
-		}
-		else {
-			extraSpace[i] = W - rem;
-		}
-	}
-	return extraSpace;
-}
-	
-Point computeSize(Control child, int width, boolean changed) {
-	int widthArg = width;
-	if (!isWrap(child))
-	   widthArg = SWT.DEFAULT;
-	Point size = child.computeSize(widthArg, SWT.DEFAULT, changed);
-	return size;
-}
-
-void placeControl(Control control, TableData td, int x, int y, int rowHeight) {
-	int xloc = x + td.indent;
-	int yloc = y;
-	int width = td.compSize.x;
-	int height = td.compSize.y;
-	int colWidth = td.compWidth;
-	
-	// align horizontally
-	if (td.align==TableData.CENTER) {
-		xloc = x + colWidth/2 - width/2;
-	}
-	else if (td.align==TableData.RIGHT) {
-		xloc = x + colWidth - width;
-	}
-	else if (td.align==TableData.FILL) {
-		width = colWidth;
-	}
-	// align vertically
-	if (td.valign == TableData.MIDDLE) {
-		yloc = y + rowHeight/2 - height/2;
-	}
-	else if (td.valign==TableData.BOTTOM) {
-		yloc = y + rowHeight - height;
-	}
-	else if (td.valign==TableData.FILL) {
-		height = rowHeight;	
-	}
-	control.setBounds(xloc, yloc, width, height);
-}
-
-void createGrid(Composite composite) {
-	int row, column, rowFill, columnFill;
-	Control[] children;
-	TableData spacerSpec;
-	Vector growingCols = new Vector();
-
-	// 
-	children = composite.getChildren();
-	if (children.length==0) return;
-
-	// 
-	grid.addElement(createEmptyRow());
-	row = 0;
-	column = 0;
-
-	// Loop through the children and place their associated layout specs in the
-	// grid.  Placement occurs left to right, top to bottom (i.e., by row).
-	for (int i = 0; i < children.length; i++) {
-		// Find the first available spot in the grid.
-		Control child = children[i];
-		TableData spec = (TableData) child.getLayoutData();
-		while (((TableData[]) grid.elementAt(row))[column] != null) {
-			column = column + 1;
-			if (column >= numColumns) {
-				row = row + 1;
-				column = 0;
-				if (row >= grid.size()) {
-					grid.addElement(createEmptyRow());
-				}
-			}
-		}
-		// See if the place will support the widget's horizontal span.  If not, go to the
-		// next row.
-		if (column + spec.colspan - 1 >= numColumns) {
-			grid.addElement(createEmptyRow());
-			row = row + 1;
-			column = 0;
-		}
-
-		// The vertical span for the item will be at least 1.  If it is > 1,
-		// add other rows to the grid.
-		for (int j = 2; j <= spec.rowspan; j++) {
-			if (row + j > grid.size()) {
-				grid.addElement(createEmptyRow());
-			}
-		}
-
-		// Store the layout spec.  Also cache the childIndex.  NOTE: That we assume the children of a
-		// composite are maintained in the order in which they are created and added to the composite.
-		((TableData[]) grid.elementAt(row))[column] = spec;
-		spec.childIndex = i;
-		
-		if (spec.grabHorizontal) {
-			updateGrowingColumns(growingCols, spec, column);
-		}
-
-		// Put spacers in the grid to account for the item's vertical and horizontal
-		// span.
-		rowFill = spec.rowspan - 1;
-		columnFill = spec.colspan - 1;
-		for (int r = 1; r <= rowFill; r++) {
-			for (int c = 0; c < spec.colspan; c++) {
-				spacerSpec = new TableData();
-				spacerSpec.isItemData = false;
-				((TableData[]) grid.elementAt(row + r))[column + c] = spacerSpec;
-			}
-		}
-		for (int c = 1; c <= columnFill; c++) {
-			for (int r = 0; r < spec.rowspan; r++) {
-				spacerSpec = new TableData();
-				spacerSpec.isItemData = false;
-				((TableData[]) grid.elementAt(row + r))[column + c] = spacerSpec;
-			}
-		}
-		column = column + spec.colspan - 1;
-	}
-
-	// Fill out empty grid cells with spacers.
-	for (int k = column + 1; k < numColumns; k++) {
-		spacerSpec = new TableData();
-		spacerSpec.isItemData = false;
-		((TableData[]) grid.elementAt(row))[k] = spacerSpec;
-	}
-	for (int k = row + 1; k < grid.size(); k++) {
-		spacerSpec = new TableData();
-		spacerSpec.isItemData = false;
-		((TableData[]) grid.elementAt(k))[column] = spacerSpec;
-	}
-	growingColumns = new int [growingCols.size()];
-	for (int i=0; i<growingCols.size(); i++) {
-		growingColumns[i] = ((Integer)growingCols.get(i)).intValue();
-	}
-}
-
-private void updateGrowingColumns(Vector growingColumns, TableData spec, int column) {
-	int affectedColumn = column + spec.colspan -1;
-	for (int i=0; i<growingColumns.size(); i++) {
-		Integer col = (Integer)growingColumns.get(i);
-		if (col.intValue()==affectedColumn)
-		   return;
-	}
-	growingColumns.add(new Integer(affectedColumn));
-}
-
-private TableData [] createEmptyRow() {
-	TableData [] row = new TableData[numColumns];
-	for (int i=0; i<numColumns; i++) 
-	   row[i] = null;
-	return row;
-}
-
-	/**
-	 * @see Layout#computeSize(Composite, int, int, boolean)
-	 */
-	protected Point computeSize(Composite parent, int wHint, int hHint, boolean changed) {
-		Control [] children = parent.getChildren();
-		if (children.length == 0) {
-			return new Point(0, 0);
-		}
-		int parentWidth = wHint;
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-		   changed = true;
-		   initialLayout = false;
-		}
-		if (grid==null || changed) {
-		   changed = true;
-		   grid = new Vector();
-		   createGrid(parent);
-		}
-		resetColumnWidths();
-		int minWidth = internalGetMinimumWidth(parent, changed);
-		int maxWidth = internalGetMaximumWidth(parent, changed);
-		
-		int tableWidth = parentWidth;
-		
-		int [] columnWidths;
-		
-		if (parentWidth < minWidth) {
-		   tableWidth = minWidth;
-		   if (makeColumnsEqualWidth) {
-		      columnWidths = new int[numColumns];
-		      for (int i=0; i<numColumns; i++) {
-		      	columnWidths[i] = widestColumnWidth;
-		      }
-		   }
-		   else
-		      columnWidths = minColumnWidths;
-		}
-		else if (parentWidth > maxWidth) {
-		   tableWidth = maxWidth;
-		   columnWidths = maxColumnWidths;
-		}
-		else {
-			columnWidths = new int [numColumns];
-			if (makeColumnsEqualWidth) {
-				int colSpace = tableWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns-1)*horizontalSpacing;
-				int col = colSpace/numColumns;
-				for (int i=0; i<numColumns; i++) {
-					columnWidths[i] = col;
-				}
-			}
-			else {
-			   int [] extraSpace = calculateExtraSpace(tableWidth, maxWidth, minWidth);
-			   for (int i=0; i<numColumns; i++) {
-				  int minCWidth = minColumnWidths[i];
-		   		  columnWidths[i] = minCWidth + extraSpace[i];
-			   }
-			}
-		}
-		int totalHeight=0;
-		int y = topMargin;
-		// compute widths 
-		for (int i=0; i<grid.size(); i++) {
-			TableData [] row = (TableData [])grid.elementAt(i);
-			// assign widths, calculate heights
-			int rowHeight = 0;
-			for (int j=0; j<numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData==false) {
-					continue;
-				}
-				Control child = children[td.childIndex];
-				int span = td.colspan;
-				int cwidth = 0;
-				for (int k=j; k<j+span; k++) {
-					if (k>j) cwidth += horizontalSpacing;
-					cwidth += columnWidths[k];
-				}
-				int cy = td.heightHint;
-				if (cy == SWT.DEFAULT) {
-				   Point size = computeSize(child, cwidth, changed);
-				   cy = size.y;
-				}
-				rowHeight = Math.max(rowHeight, cy);
-			}
-			y += rowHeight + verticalSpacing;
-		}
-		totalHeight = y + bottomMargin;
-		return new Point(tableWidth, totalHeight);
-	}
-
-	int internalGetMinimumWidth(Composite parent, boolean changed) {
-		if (changed)
-		   calculateMinimumColumnWidths(parent, true);
-		int minimumWidth = 0;
-		
-		widestColumnWidth = 0;
-		
-		if (makeColumnsEqualWidth) {
-			for (int i=0; i<numColumns; i++) {
-				widestColumnWidth = Math.max(widestColumnWidth, minColumnWidths[i]);
-			}
-		}
-		for (int i=0; i<numColumns; i++) {
-			if (i>0) minimumWidth += horizontalSpacing;
-			if (makeColumnsEqualWidth)
-			   minimumWidth += widestColumnWidth;
-			else
-			   minimumWidth += minColumnWidths[i];
-		}
-		// add margins
-		minimumWidth += leftMargin + rightMargin;
-		return minimumWidth;
-	}
-	
-	int internalGetMaximumWidth(Composite parent, boolean changed) {
-		if (changed)
-		   calculateMaximumColumnWidths(parent, true);
-		int maximumWidth = 0;
-		for (int i=0; i<numColumns; i++) {
-			if (i>0) maximumWidth += horizontalSpacing;
-			maximumWidth += maxColumnWidths[i];
-		}
-		// add margins
-		maximumWidth += leftMargin + rightMargin;
-		return maximumWidth;
-	}
-	
-	void resetColumnWidths() {
-		if (minColumnWidths == null)
-		   minColumnWidths = new int [numColumns];
-		if (maxColumnWidths == null)
-		   maxColumnWidths = new int [numColumns];
-		for (int i=0; i<numColumns; i++) {
-			minColumnWidths [i] = 0;
-		}
-		for (int i=0; i<numColumns; i++) {
-			maxColumnWidths [i] = 0;
-		}
-	}
-
-	void calculateMinimumColumnWidths(Composite parent, boolean changed) {
-		Control [] children = parent.getChildren();
-		
-		for (int i=0; i<grid.size(); i++) {
-			TableData [] row = (TableData [])grid.elementAt(i);
-			for (int j=0; j<numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData==false) continue;
-				Control child = children[td.childIndex];
-				int minWidth = -1;
-				if (child instanceof Composite) {
-					Composite cc = (Composite)child;
-					Layout l = cc.getLayout();
-					if (l instanceof HTMLTableLayout) {
-						minWidth = ((HTMLTableLayout)l).getMinimumWidth(cc, changed);
-					}
-				}
-				if (minWidth == -1) {
-					if (isWrap(child)) {
-						// Should be the width of the
-						// longest word, we'll pick
-						// some small number instead
-						minWidth = 30;
-					}
-					else {
-					   Point size = child.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-					   minWidth = size.x;
-					}
-				}
-				minWidth += td.indent;
-				minColumnWidths[j] = Math.max(minColumnWidths[j], minWidth);
-			}
-		}
-	}
-	
-	boolean isWrap(Control control) {
-		if (control instanceof Composite &&
-		   ((Composite)control).getLayout() instanceof HTMLTableLayout)
-		   return true;
-		return (control.getStyle() & SWT.WRAP)!=0;
-	}
-	
-	void calculateMaximumColumnWidths(Composite parent, boolean changed) {
-		Control [] children = parent.getChildren();
-		
-		for (int i=0; i<numColumns; i++) {
-			maxColumnWidths [i] = 0;
-		}
-		for (int i=0; i<grid.size(); i++) {
-			TableData [] row = (TableData [])grid.elementAt(i);
-			for (int j=0; j<numColumns; j++) {
-				TableData td = row[j];
-				if (td.isItemData==false) continue;
-				Control child = children[td.childIndex];
-				int maxWidth = -1;
-				if (child instanceof Composite) {
-					Composite cc = (Composite)child;
-					Layout l = cc.getLayout();
-					if (l instanceof HTMLTableLayout) {
-						maxWidth = ((HTMLTableLayout)l).getMaximumWidth(cc, changed);
-					}
-				}
-				if (maxWidth == -1) {
-					Point size = child.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-					maxWidth = size.x;
-				}
-				maxWidth += td.indent;
-				if (td.colspan==1)
-				   maxColumnWidths[j] = Math.max(maxColumnWidths[j], maxWidth);
-				else {
-					// grow the last column
-					int last = j + td.colspan -1;
-					int rem = 0;
-					for (int k=j; k<j+td.colspan-1; k++) {
-						rem += maxColumnWidths[k];
-					}
-					int reduced = maxWidth - rem;
-					maxColumnWidths[last] = Math.max(maxColumnWidths[last], reduced);
-				}
-			}
-		}
-	}
-	
-private void initializeIfNeeded(Composite parent, boolean changed) {
-	if (changed)
-	   	initialLayout = true;
-	if (initialLayout) {
-		initializeLayoutData(parent);
-		initialLayout = false;
-	}
-}
-	
-void initializeLayoutData(Composite composite) {
-	Control[] children = composite.getChildren();
-	for (int i = 0; i < children.length; i++) {
-		Control child = children[i];
-		if (child.getLayoutData() == null) {
-			child.setLayoutData(new TableData());
-		}
-	}
-}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkAdapter.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkAdapter.java
deleted file mode 100644
index 56c92db..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkAdapter.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-public class HyperlinkAdapter implements IHyperlinkListener {
-
-public HyperlinkAdapter() {
-	super();
-}
-public void linkActivated(org.eclipse.swt.widgets.Control linkLabel) {}
-public void linkEntered(org.eclipse.swt.widgets.Control linkLabel) {}
-public void linkExited(org.eclipse.swt.widgets.Control linkLabel) {}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkHandler.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkHandler.java
deleted file mode 100644
index cb066ea..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkHandler.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-
-public class HyperlinkHandler extends HyperlinkSettings
-								implements MouseListener, 
-										 MouseTrackListener, 
-										 SelectionListener,
-										 PaintListener {
-	private Hashtable hyperlinkListeners;
-	private Control lastActivated;
-	private Control lastEntered;
-
-public HyperlinkHandler() {
-	hyperlinkListeners = new Hashtable();
-}
-
-public Control getLastLink() {
-	return lastActivated;
-}
-
-public void mouseDoubleClick(MouseEvent e) {
-}
-
-public void mouseDown(MouseEvent e) {
-	if (e.button == 1)
-		return;
-	lastActivated = (Control)e.widget;
-}
-public void mouseEnter(MouseEvent e) {
-	Control control = (Control) e.widget;
-	linkEntered(control);
-}
-public void mouseExit(MouseEvent e) {
-	Control control = (Control) e.widget;
-	linkExited(control);
-}
-public void mouseHover(MouseEvent e) {
-}
-
-public void mouseUp(MouseEvent e) {
-	if (e.button != 1)
-		return;
-	Control linkControl = (Control)e.widget;
-	Rectangle bounds = linkControl.getBounds();
-	if (bounds.contains(e.x, e.y))
-		linkActivated(linkControl);
-}
-
-public void widgetDefaultSelected(SelectionEvent e) {
-	Control link = (Control)e.widget;
-	linkActivated(link);
-}
-
-public void widgetSelected(SelectionEvent e) {
-	Control link = (Control)e.widget;
-	SelectableFormLabel l = (SelectableFormLabel)link;
-	if (l.getSelection()) linkEntered(link);
-	else linkExited(link);
-}
-
-private void linkActivated(Control link) {
-	IHyperlinkListener action =
-		(IHyperlinkListener) hyperlinkListeners.get(link);
-	if (action != null) {
-		link.setCursor(busyCursor);
-		action.linkActivated(link);
-		if (!link.isDisposed()) 
-	   		link.setCursor(isHyperlinkCursorUsed()?hyperlinkCursor:null);
-	}
-}
-
-private void linkEntered(Control link) {
-	if (lastEntered!=null && lastEntered instanceof SelectableFormLabel) {
-		SelectableFormLabel fl = (SelectableFormLabel)lastEntered;
-		linkExited(fl);
-	}
-	if (isHyperlinkCursorUsed())
-		link.setCursor(hyperlinkCursor);
-	if (activeBackground != null)
-		link.setBackground(activeBackground);
-	if (activeForeground != null)
-		link.setForeground(activeForeground);
-	if (hyperlinkUnderlineMode==UNDERLINE_ROLLOVER) underline(link, true);    
-
-	IHyperlinkListener action =
-		(IHyperlinkListener) hyperlinkListeners.get(link);
-	if (action != null)
-		action.linkEntered(link);
-	lastEntered = link;
-}
-
-private void linkExited(Control link) {
-	if (isHyperlinkCursorUsed())
-		link.setCursor(null);
-	if (hyperlinkUnderlineMode==UNDERLINE_ROLLOVER)
-		underline(link, false);
-	if (background != null)
-		link.setBackground(background);
-	if (foreground != null)
-		link.setForeground(foreground);
-	IHyperlinkListener action =
-		(IHyperlinkListener) hyperlinkListeners.get(link);
-	if (action != null)
-		action.linkExited(link);
-	if (lastEntered == link) lastEntered = null;
-}
-
-public void paintControl(PaintEvent e) {
-	Control label = (Control) e.widget;
-	if (hyperlinkUnderlineMode == UNDERLINE_ALWAYS)
-		HyperlinkHandler.underline(label, true);
-}
-
-public void registerHyperlink(Control control, IHyperlinkListener listener) {
-	if (background != null)
-		control.setBackground(background);
-	if (foreground != null)
-		control.setForeground(foreground);
-	control.addMouseListener(this);
-	control.addMouseTrackListener(this);
-
-	if (hyperlinkUnderlineMode == UNDERLINE_ALWAYS && control instanceof Label)
-		control.addPaintListener(this);
-	if (control instanceof SelectableFormLabel) {
-		SelectableFormLabel sl = (SelectableFormLabel)control;
-		sl.addSelectionListener(this);
-		if (hyperlinkUnderlineMode == UNDERLINE_ALWAYS)
-			sl.setUnderlined(true);
-	}
-	hyperlinkListeners.put(control, listener);
-	removeDisposedLinks();
-}
-private void removeDisposedLinks() {
-	for (Enumeration keys = hyperlinkListeners.keys(); keys.hasMoreElements();) {
-		Control control = (Control)keys.nextElement();
-		if (control.isDisposed()) {
-			hyperlinkListeners.remove(control);
-		}
-	}
-}
-
-public void reset() {
-	hyperlinkListeners.clear();
-}
-
-public static void underline(Control control, boolean inside) {
-	if (control instanceof SelectableFormLabel) {
-		SelectableFormLabel l = (SelectableFormLabel)control;
-		l.setUnderlined(inside);
-		l.redraw();
-		return;
-	}
-	if (!(control instanceof Label))
-		return;
-	Composite parent = control.getParent();
-	Rectangle bounds = control.getBounds();
-	GC gc = new GC(parent);
-	Color color = inside? control.getForeground() : control.getBackground();
-	gc.setForeground(color);
-	int y = bounds.y + bounds.height;
-	gc.drawLine(bounds.x, y, bounds.x+bounds.width, y);
-	gc.dispose();
-}
-
-
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkSettings.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkSettings.java
deleted file mode 100644
index 0aa0b31..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/HyperlinkSettings.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.*;
-import java.util.*;
-import org.eclipse.swt.*;
-
-public class HyperlinkSettings {
-	public static final int UNDERLINE_NEVER = 1;
-	public static final int UNDERLINE_ROLLOVER = 2;
-	public static final int UNDERLINE_ALWAYS = 3;
-
-	protected boolean hyperlinkCursorUsed=true;
-	protected int hyperlinkUnderlineMode=UNDERLINE_ALWAYS;
-	protected Color background;
-	protected Color foreground;
-	protected Color activeBackground;
-	protected Color activeForeground;
-	protected Cursor hyperlinkCursor;
-	protected Cursor busyCursor;
-	protected Cursor textCursor;
-	
-public HyperlinkSettings() {
-	hyperlinkCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND);
-	busyCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_WAIT);
-	textCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_IBEAM);
-}
-
-public void dispose() {
-	hyperlinkCursor.dispose();
-	busyCursor.dispose();
-	textCursor.dispose();
-}
-
-public Color getActiveBackground() {
-	return activeBackground;
-}
-public Color getActiveForeground() {
-	return activeForeground;
-}
-public Color getBackground() {
-	return background;
-}
-public Cursor getBusyCursor() {
-	return busyCursor;
-}
-public Cursor getTextCursor() {
-	return textCursor;
-}
-public Color getForeground() {
-	return foreground;
-}
-public Cursor getHyperlinkCursor() {
-	return hyperlinkCursor;
-}
-public int getHyperlinkUnderlineMode() {
-	return hyperlinkUnderlineMode;
-}
-
-public boolean isHyperlinkCursorUsed() {
-	return hyperlinkCursorUsed;
-}
-
-public void setActiveBackground(Color newActiveBackground) {
-	activeBackground = newActiveBackground;
-}
-public void setActiveForeground(Color newActiveForeground) {
-	activeForeground = newActiveForeground;
-}
-public void setBackground(Color newBackground) {
-	background = newBackground;
-}
-public void setForeground(Color newForeground) {
-	foreground = newForeground;
-}
-public void setHyperlinkCursorUsed(boolean newHyperlinkCursorUsed) {
-	hyperlinkCursorUsed = newHyperlinkCursorUsed;
-}
-public void setHyperlinkUnderlineMode(int newHyperlinkUnderlineMode) {
-	hyperlinkUnderlineMode = newHyperlinkUnderlineMode;
-}
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IForm.java
deleted file mode 100644
index b0f5747..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IForm.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-
-public interface IForm {
-public void commitChanges(boolean onSave);
-public Control createControl(Composite parent);
-public void dispose();
-public boolean doGlobalAction(String actionId);
-public void expandTo(Object object);
-public Control getControl();
-public FormWidgetFactory getFactory();
-public Color getHeadingBackground();
-public Color getHeadingForeground();
-public Image getHeadingImage();
-public String getHeadingText();
-public void initialize(Object model);
-public boolean isHeadingVisible();
-public void registerSection(FormSection section);
-public void setFocus();
-public void setHeadingBackground(Color newHeadingBackground);
-public void setHeadingForeground(Color newHeadingForeground);
-public void setHeadingImage(Image headingImage);
-public void setHeadingVisible(boolean newHeadingVisible);
-public void setHeadingText(String heading);
-public void update();
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormPage.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormPage.java
deleted file mode 100644
index 2717583..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormPage.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.widgets.*;
-
-public interface IFormPage {
-
-boolean becomesInvisible(IFormPage newPage);
-void becomesVisible(IFormPage previousPage);
-void createControl(Composite parent);
-Control getControl();
-String getLabel();
-String getTitle();
-boolean isSource();
-boolean isVisible();
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormSelectionListener.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormSelectionListener.java
deleted file mode 100644
index a131d34..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormSelectionListener.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-public interface IFormSelectionListener {
-	public void formSelected(IFormPage page);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormTextListener.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormTextListener.java
deleted file mode 100644
index 8aedbf9..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormTextListener.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-public interface IFormTextListener {
-	public void textValueChanged(FormEntry text);
-	public void textDirty(FormEntry text);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormWorkbook.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormWorkbook.java
deleted file mode 100644
index c729331..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IFormWorkbook.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.graphics.*;
-import java.util.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.*;
-import org.eclipse.ui.part.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.jface.window.*;
-
-public interface IFormWorkbook {
-
-void addFormSelectionListener(IFormSelectionListener listener);
-public void addPage(IFormPage page);
-public void createControl(Composite parent);
-Control getControl();
-public IFormPage getCurrentPage();
-boolean isFirstPageSelected();
-void removeFormSelectionListener(IFormSelectionListener listener);
-public void removePage(IFormPage page);
-public void selectPage(final IFormPage page);
-void setFirstPageSelected(boolean selected);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IHyperlinkListener.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IHyperlinkListener.java
deleted file mode 100644
index e04f2dd..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/IHyperlinkListener.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.Label;
-
-public interface IHyperlinkListener {
-
-public void linkActivated(Control linkLabel);
-public void linkEntered(Control linkLabel);
-public void linkExited(Control linkLabel);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/NoTabsWorkbook.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/NoTabsWorkbook.java
deleted file mode 100644
index 59aa53d..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/NoTabsWorkbook.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.graphics.*;
-import java.util.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.*;
-import org.eclipse.ui.part.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.swt.custom.*;
-
-public class NoTabsWorkbook implements IFormWorkbook {
-	private Vector pages;
-	private boolean firstPageSelected = true;
-	private PageBook pageBook;
-	private Vector listeners = new Vector();
-	private IFormPage currentPage;
-
-	public NoTabsWorkbook() {
-		pages = new Vector();
-	}
-	public void addFormSelectionListener(IFormSelectionListener listener) {
-		listeners.addElement(listener);
-	}
-	public void addPage(IFormPage page) {
-		pages.add(page);
-
-		if (firstPageSelected && currentPage == null)
-			selectPage(page);
-	}
-
-	public void createControl(Composite parent) {
-		pageBook = new PageBook(parent, SWT.NULL);
-	}
-
-	private void fireSelectionChanged(IFormPage page) {
-		for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-			IFormSelectionListener listener = (IFormSelectionListener) iter.next();
-			listener.formSelected(page);
-		}
-	}
-
-	public Control getControl() {
-		return pageBook;
-	}
-
-	public IFormPage getCurrentPage() {
-		return currentPage;
-	}
-
-	public boolean isFirstPageSelected() {
-		return firstPageSelected;
-	}
-	public void removeFormSelectionListener(IFormSelectionListener listener) {
-		listeners.removeElement(listener);
-	}
-
-	public void removePage(IFormPage page) {
-		if (pages.contains(page)) {
-			Control c = page.getControl();
-			if (c!=null && !c.isDisposed())
-				c.dispose();
-			pages.remove(page);
-		}
-	}
-
-	public void selectPage(final IFormPage page) {
-		final IFormPage oldPage = currentPage;
-		currentPage = page;
-
-		if (pageBook != null) {
-
-			// It may take a while
-			BusyIndicator.showWhile(pageBook.getDisplay(), new Runnable() {
-				public void run() {
-					switchPages(oldPage, page);
-				}
-			});
-		}
-	}
-
-	public void setFirstPageSelected(boolean newFirstPageSelected) {
-		firstPageSelected = newFirstPageSelected;
-	}
-
-	private void switchPages(IFormPage oldPage, IFormPage newPage) {
-		if (oldPage != null && oldPage != newPage) {
-			oldPage.becomesInvisible(newPage);
-		}
-		if (newPage.getControl() == null)
-			newPage.createControl(pageBook);
-		pageBook.showPage(newPage.getControl());
-
-		newPage.becomesVisible(oldPage);
-		fireSelectionChanged(newPage);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ScrollableSectionForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ScrollableSectionForm.java
deleted file mode 100644
index c7228b8..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ScrollableSectionForm.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.*;
-
-/**
- * This version of the section form adds scrolling
- * capability. However, scrolling can be disabled
- * using 'setScrollable' method. For this reason,
- * this class can be used instead of the SectionForm.
- */
-
-public class ScrollableSectionForm extends SectionForm {
-	private Composite container;
-	private boolean verticalFit;
-	private boolean scrollable=true;
-	
-public ScrollableSectionForm() {
-}
-public Control createControl(Composite parent) {
-	container = createParent(parent);
-	Control formControl = super.createControl(container);
-	if (container instanceof ScrolledComposite) {
-		ScrolledComposite sc = (ScrolledComposite)container;
-		sc.setContent(formControl);
-	}
-	GridData gd = new GridData(GridData.FILL_BOTH);
-	formControl.setLayoutData(gd);
-	container.setBackground(formControl.getBackground());
-	return container;
-}
-protected Composite createParent(Composite parent) {
-	Composite result = null;
-	if (isScrollable()) {
-		ScrolledComposite scomp =
-			new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-		if (isVerticalFit()) {
-			scomp.setExpandHorizontal(true);
-			scomp.setExpandVertical(true);
-		}
-		initializeScrollBars(scomp);
-		result = scomp;
-	} else {
-		result = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		result.setLayout(layout);
-	}
-	return result;
-}
-public boolean isScrollable() {
-	return scrollable;
-}
-public boolean isVerticalFit() {
-	return verticalFit;
-}
-public void setScrollable(boolean newScrollable) {
-	scrollable = newScrollable;
-}
-
-public void setVerticalFit(boolean newVerticalFit) {
-	verticalFit = newVerticalFit;
-}
-
-private void initializeScrollBars(ScrolledComposite scomp) {
-	ScrollBar hbar = scomp.getHorizontalBar();
-	if (hbar!=null) {
-		hbar.setIncrement(H_SCROLL_INCREMENT);
-	}
-	ScrollBar vbar = scomp.getVerticalBar();
-	if (vbar!=null) {
-		vbar.setIncrement(V_SCROLL_INCREMENT);
-	}	
-	updatePageIncrement(scomp);
-}
-
-public void update() {
-	super.update();
-	if (container instanceof ScrolledComposite) {
-		updateScrolledComposite();
-	} else {
-		container.layout(true);
-	}
-}
-public void updateScrollBars() {
-	if (container instanceof ScrolledComposite) {
-		updateScrolledComposite();
-	}
-}
-public void updateScrolledComposite() {
-	ScrolledComposite sc = (ScrolledComposite) container;
-	Control formControl = getControl();
-	Point newSize = formControl.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-	formControl.setSize(newSize);
-	sc.setMinSize(newSize);
-	updatePageIncrement(sc);
-}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionChangeManager.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionChangeManager.java
deleted file mode 100644
index 1ff42f2..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionChangeManager.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.util.*;
-
-public class SectionChangeManager {
-	Hashtable sources = new Hashtable();
-
-public SectionChangeManager() {
-	super();
-}
-public void dispatchNotification(
-	FormSection source,
-	int type,
-	Object changeObject) {
-	Vector targets = (Vector) sources.get(source);
-	if (targets != null) {
-		for (Iterator iter = targets.iterator(); iter.hasNext();) {
-			FormSection section = (FormSection) iter.next();
-			section.sectionChanged(source, type, changeObject);
-		}
-	}
-}
-public void linkSections(FormSection source, FormSection target) {
-	source.setManager(this);
-	Vector targets = null;
-
-	targets = (Vector) sources.get(source);
-	if (targets == null) {
-		targets = new Vector();
-		sources.put(source, targets);
-	}
-	targets.addElement(target);
-}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionForm.java
deleted file mode 100644
index e7e6b4d..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SectionForm.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.events.*;
-import java.util.*;
-import org.eclipse.ui.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.jface.util.*;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * This form implementation assumes that it contains
- * form sections and that they fill up the screen.
- * Typically, the form client will use up the entire
- * parent area below the heading. Sections must
- * be able to return their preferred size in both
- * dimensions. If they contain wrappable text,
- * WebForm should be used instead.
- */
-
-
-public class SectionForm extends AbstractSectionForm implements PaintListener {
-	private Composite control;
-	private int TITLE_HMARGIN = 10;
-	private int TITLE_VMARGIN = 5;
-
-	class FormLayout extends Layout {
-		protected Point computeSize(
-			Composite composite,
-			int wHint,
-			int hHint,
-			boolean flushCache) {
-			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
-				return new Point(wHint, hHint);
-			Control client = composite.getChildren()[0];
-			Point csize = client.computeSize(widthHint, heightHint, flushCache);
-			if (headingVisible) csize.y += getTitleHeight();
-			return csize;
-		}
-		protected void layout(Composite composite, boolean flushCache) {
-			Rectangle clientArea = composite.getClientArea();
-			Control client = composite.getChildren()[0];
-			int theight = headingVisible?getTitleHeight() : 0;
-			client.setBounds(
-				clientArea.x,
-				clientArea.y + theight,
-				clientArea.width,
-				clientArea.height - theight);
-		}
-	}
-	private int widthHint=SWT.DEFAULT;
-	private int heightHint=SWT.DEFAULT;
-
-public SectionForm() {
-}
-
-public Control createControl(Composite parent) {
-	Composite canvas = new Composite(parent, SWT.NONE);
-	canvas.setBackground(factory.getBackgroundColor());
-	canvas.setForeground(factory.getForegroundColor());
-	canvas.addPaintListener(this);
-	canvas.setLayout(new FormLayout());
-	Composite formParent = factory.createComposite(canvas);
-	createFormClient(formParent);
-	this.control = canvas;
-	canvas.setFocus();
-	return canvas;
-}
-
-protected void createFormClient(Composite parent) {
-	factory.createComposite(parent);
-}
-
-public Control getControl() {
-	return control;
-}
-
-private int getTitleHeight() {
-	int imageHeight = 0;
-	if (headingImage!=null && SWT.getPlatform().equals("motif")==false) {
-		imageHeight = headingImage.getBounds().height;
-	}
-	GC gc = new GC(control);
-	gc.setFont(titleFont);
-	FontMetrics fm = gc.getFontMetrics();
-	int fontHeight = fm.getHeight();
-	gc.dispose();
-
-	int height =  fontHeight + TITLE_VMARGIN + TITLE_VMARGIN;
-	return Math.max(height, imageHeight);
-}
-
-private void paint(Control form, GC gc) {
-	Rectangle bounds = form.getBounds();
-	int height = getTitleHeight();
-	if (headingImage != null) {
-		Rectangle imageBounds = headingImage.getBounds();
-		int x = bounds.width - imageBounds.width;
-		int y = 0;
-		//x = Math.max(x, 0);
-		x = 0;
-		if (headingBackground != null) {
-			gc.setBackground(headingBackground);
-			gc.fillRectangle(0, 0, bounds.width, height);
-		}
-		if (SWT.getPlatform().equals("motif")==false) {
-	       gc.drawImage(headingImage, x, y);
-		}
-		if (headingForeground != null)
-			gc.setForeground(headingForeground);
-		else
-			gc.setForeground(factory.getForegroundColor());
-		gc.setFont(titleFont);
-		gc.drawText(getHeadingText(), TITLE_HMARGIN, TITLE_VMARGIN, true);
-	} else {
-		gc.setFont(titleFont);
-		gc.setBackground(factory.getColor(factory.DEFAULT_HEADER_COLOR));
-		//gc.fillRectangle(TITLE_HMARGIN, TITLE_VMARGIN, bounds.width-TITLE_HMARGIN*2, height-TITLE_VMARGIN*2);
-		gc.setForeground(factory.getForegroundColor());
-		gc.drawText(getHeadingText(), TITLE_HMARGIN, TITLE_VMARGIN, true);
-	}
-}
-
-public final void paintControl(PaintEvent event) {
-	if (!headingVisible) return;
-	GC gc = event.gc;
-	Control form = (Control)event.widget;
-	paint(form, gc);
-}
-
-public void setHeadingVisible(boolean newHeadingVisible) {
-	super.setHeadingVisible(newHeadingVisible);
-	if (control != null)
-		control.layout(true);
-}
-
-public void propertyChange(PropertyChangeEvent event) {
-	titleFont = JFaceResources.getHeaderFont();
-	if (control!=null) { 
-		control.layout(true);
-		control.redraw();
-	}
-}
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableControl.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableControl.java
deleted file mode 100644
index ea81992..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableControl.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import java.text.*;
-
-/**
- * FormText is a windowless control that
- * draws text in the provided context.
- */
-public abstract class SelectableControl extends Canvas {
-	private boolean hasFocus;
-
-	public SelectableControl(Composite parent, int style) {
-		super(parent, style);
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		addMouseListener(new MouseAdapter () {
-			public void mouseUp(MouseEvent e) {
-				notifyListeners(SWT.Selection);
-			}
-		});
-		addKeyListener(new KeyAdapter() {
-			public void keyPressed(KeyEvent e) {
-				if (e.character == '\r') {
-					// Activation
-					notifyListeners(SWT.Selection);
-				}
-			}
-		});
-		addListener(SWT.Traverse, new Listener () {
-			public void handleEvent(Event e) {
-				if (e.detail != SWT.TRAVERSE_RETURN)
-					e.doit = true;
-			}
-		});
-		addFocusListener(new FocusListener() {
-			public void focusGained(FocusEvent e) {
-				if (!hasFocus) {
-				   hasFocus=true;
-				   redraw();
-				}
-			}
-			public void focusLost(FocusEvent e) {
-				if (hasFocus) {
-					hasFocus=false;
-					redraw();
-				}
-			}
-		});
-	}
-
-	protected void paint(PaintEvent e) {
-		GC gc = e.gc;
-		Point size = getSize();
-	   	gc.setFont(getFont());
-	   	paint(gc);
-		if (hasFocus) {
-	   		gc.setForeground(getForeground());
-	   		gc.drawFocus(0, 0, size.x, size.y);
-		}
-	}
-	
-	protected abstract void paint(GC gc);
-	
-	private void notifyListeners(int eventType) {
-		Event event = new Event();
-		event.type = eventType;
-		event.widget = this;
-		notifyListeners(eventType, event);
-	}
-	
-	public void addSelectionListener(SelectionListener listener) {
-		checkWidget ();
-		if (listener == null) return;
-		TypedListener typedListener = new TypedListener (listener);
-		addListener (SWT.Selection,typedListener);
-	}
-	
-	public void removeSelectionListener(SelectionListener listener) {
-		checkWidget ();
-		if (listener == null) return;
-		removeListener (SWT.Selection, listener);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableFormLabel.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableFormLabel.java
deleted file mode 100644
index adc38a8..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/SelectableFormLabel.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.SWT;
-
-public class SelectableFormLabel extends FormLabel {
-	private boolean hasFocus;
-
-	public boolean getSelection() {
-		return hasFocus;
-	}
-	
-	/**
-	 * Constructor for SelectableFormLabel
-	 */
-	public SelectableFormLabel(Composite parent, int style) {
-		super(parent, style);
-		addKeyListener(new KeyAdapter() {
-			public void keyPressed(KeyEvent e) {
-				if (e.character == '\r') {
-					// Activation
-					notifyListeners(SWT.DefaultSelection);
-				}
-			}
-		});
-		addListener(SWT.Traverse, new Listener () {
-			public void handleEvent(Event e) {
-				switch (e.detail) {
-					case SWT.TRAVERSE_PAGE_NEXT:
-					case SWT.TRAVERSE_PAGE_PREVIOUS:
-					case SWT.TRAVERSE_ARROW_NEXT:
-					case SWT.TRAVERSE_ARROW_PREVIOUS:
-					case SWT.TRAVERSE_RETURN:
-					e.doit = false;
-					return;
-				}
-				e.doit = true;
-			}
-		});
-		addFocusListener(new FocusListener() {
-			public void focusGained(FocusEvent e) {
-				if (!hasFocus) {
-				   hasFocus=true;
-				   notifyListeners(SWT.Selection);
-				   redraw();
-				}
-			}
-			public void focusLost(FocusEvent e) {
-				if (hasFocus) {
-					hasFocus=false;
-					notifyListeners(SWT.Selection);
-					redraw();
-				}
-			}
-		});
-		textMarginWidth = 1;
-		textMarginHeight = 1;
-	}
-	
-	private void notifyListeners(int eventType) {
-		Event event = new Event();
-		event.type = eventType;
-		event.widget = this;
-		notifyListeners(eventType, event);
-	}
-
-	protected void paint(PaintEvent e) {
-		super.paint(e);
-	   	if (hasFocus) {
-	   		GC gc = e.gc;
-	   		Point size = getSize();
-	   		gc.setForeground(getForeground());
-	   		gc.drawFocus(0, 0, size.x, size.y);
-		}
-	}
-
-	public void addSelectionListener(SelectionListener listener) {
-		checkWidget ();
-		if (listener == null) return;
-		TypedListener typedListener = new TypedListener (listener);
-		addListener (SWT.Selection,typedListener);
-		addListener (SWT.DefaultSelection,typedListener);
-	}
-	
-	public void removeSelectionListener(SelectionListener listener) {
-		checkWidget ();
-		if (listener == null) return;
-		removeListener (SWT.Selection, listener);
-		removeListener (SWT.DefaultSelection, listener);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableData.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableData.java
deleted file mode 100644
index e2243e2..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableData.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-
-public class TableData {
-	public static final int LEFT = 1;
-	public static final int CENTER = 2;
-	public static final int RIGHT = 3;
-	public static final int TOP = 4;
-	public static final int MIDDLE = 5;
-	public static final int BOTTOM = 6;
-	public static final int FILL = 7;
-	public int colspan=1;
-	public int rowspan=1;
-	public int align = LEFT;
-	public int valign = TOP;
-	public int indent = 0;
-	public int maxWidth = SWT.DEFAULT;
-	public int maxHeight = SWT.DEFAULT;
-	public int heightHint = SWT.DEFAULT;
-	public boolean grabHorizontal=false;
-	
-	//private
-	int childIndex;
-	boolean isItemData=true; 
-	int compWidth;
-	Point compSize;
-		
-	public TableData() {
-	}
-	
-	public TableData(int align, int valign) {
-		this(align, valign, 1, 1);
-	}
-	
-	public TableData(int align, int valign, int rowspan, int colspan) {
-		this.align = align;
-		this.valign = valign;
-		this.rowspan = rowspan;
-		this.colspan = colspan;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableLayoutTest.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableLayoutTest.java
deleted file mode 100644
index 0205ddd..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/TableLayoutTest.java
+++ /dev/null
@@ -1,229 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.events.*;
-import java.io.InputStream;
-import org.eclipse.swt.program.Program;
-import org.eclipse.update.ui.forms.internal.engine.*;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.StatusLineManager;
-
-public class TableLayoutTest {
-
-public static void main (String [] args) {
-     Display display = new Display ();
-     Shell shell = new Shell (display);
-     shell.setLayout(new FillLayout());
-     final ScrolledComposite sc = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL);
-    // sc.setAlwaysShowScrollBars(true);
-     sc.setBackground(sc.getDisplay().getSystemColor(SWT.COLOR_WHITE));
-     final Composite c = new Composite(sc, SWT.NONE);
-     //c.setBackground(c.getDisplay().getSystemColor(SWT.COLOR_RED));
-     sc.setContent(c);
-     sc.addListener (SWT.Resize,  new Listener () {
-		public void handleEvent (Event e) {
-			Rectangle ssize = sc.getClientArea();
-			int swidth = ssize.width;
-			HTMLTableLayout layout = (HTMLTableLayout)c.getLayout();
-			Point size = layout.computeSize(c, swidth, SWT.DEFAULT, true);
-			//if (size.x < swidth) size.x = swidth;
-			Rectangle trim = c.computeTrim(0, 0, size.x, size.y);
-			size = new Point(trim.width, trim.height);
-			/*
-			Point size = c.computeSize(swidth, SWT.DEFAULT, true);
-			*/
-			//System.out.println("in: "+swidth+", out: "+size.x);
-			c.setSize(size);
-		}
-	});
-     c.setBackground(c.getDisplay().getSystemColor(SWT.COLOR_WHITE));
-     HTMLTableLayout layout = new HTMLTableLayout();
-     layout.numColumns = 2;
-     //layout.horizontalSpacing = 0;
-     layout.leftMargin = 0;
-     layout.rightMargin = 0;
-     layout.makeColumnsEqualWidth=false;
-     //layout.marginWidth = layout.marginHeight = 0;
-     //layout.horizontalSpacing = 0;
-     c.setLayout(layout);
-     
-     Label label;
-     CLabel clabel;
-     Button b;
-     TableData td;
-/*     
-     label = new Label(c, SWT.NULL);
-     label.setText("Single line1");
-     
-     //label = new Label(c, SWT.WRAP);
-     Text text = new Text(c, SWT.MULTI | SWT.WRAP);
-     text.setEditable(false);
-     text.setText("This is a much longer text that I want wrapped,"+
-     " but depending on the window size it can be rendered completely.");
-     
-     b = new Button(c, SWT.PUSH);
-     b.setText("Simple button");
-     
-     label = new Label(c, SWT.WRAP);
-     label.setText("Another text that may or may not be wrapped");
-
-     label = new Label(c, SWT.NULL);
-     td = new TableData(TableData.RIGHT, TableData.BOTTOM);
-     label.setLayoutData(td);
-     label.setText("Fixed label");
-     
-     Composite nested = new Composite(c, SWT.NULL);
-     layout = new HTMLTableLayout();
-     layout.numColumns = 2;
-     nested.setLayout(layout);
-     b = new Button(nested, SWT.PUSH);
-     b.setText("Button2");
-     label = new Label(nested, SWT.WRAP);
-     td = new TableData(TableData.LEFT, TableData.MIDDLE);
-     label.setLayoutData(td);
-     label.setText("Some text in the nested label that can be wrapped");
-*/     
-     label = new Label(c, SWT.NULL);
-     label.setText("Text in the left column");
-     
-     b = new Button(c, SWT.CHECK);
-     b.setText("Checkbox in the right column");
-
-     
-     label = new Label(c, SWT.WRAP);
-     label.setText("This assignment step is then repeated for nested tables using the minimum and maximum widths derived for all such tables in the first pass. In this case, the width of the parent table cell plays the role of the current window size in the above description. This process is repeated recursively for all nested tables. The topmost table is then rendered using the assigned widths. Nested tables are subsequently rendered as part of the parent table's cell contents.");
-     td = new TableData();
-     td.colspan = 2;
-     td.align = TableData.FILL;
-     label.setLayoutData(td);
-     
-     ExpandableGroup exp = new ExpandableGroup (SWT.WRAP) {
-     	public void fillExpansion(Composite container, FormWidgetFactory factory) {
-     		HTMLTableLayout layout = new HTMLTableLayout();
-     		container.setLayout(layout);
-     		layout.leftMargin = layout.rightMargin = 0;
-     		Button button = factory.createButton(container, null, SWT.PUSH);
-     		button.setText("Button");
-    	}
-     	public void expanded() {
-     		c.layout(true);
-     		updateSize(sc, c);
-     	}
-     	public void collapsed() {
-     		c.layout(true);
-     		updateSize(sc, c);
-     	}
-     };
-     exp.setText("Expandable Section");
-     //exp.setExpandable(false);
-     FormWidgetFactory factory = new FormWidgetFactory();
-     exp.createControl(c, factory);
-     //exp.getControl().setBackground(label.getDisplay().getSystemColor(SWT.COLOR_GREEN));
-     td = new TableData();
-     td.colspan = 2;
-     td.align = TableData.FILL;
-     exp.getControl().setLayoutData(td);
-     
-	 StatusLineManager manager = new StatusLineManager();
-     addFormEngine(c, factory, manager);
-     //addFormEngine(c, factory, manager);
-     //addFormEngine(c, factory, manager);
-     
-     addRow(c);
- 
-     Control mcontrol = manager.createControl(c);
-     td = new TableData();
-     td.colspan = 2;
-     td.align = TableData.FILL;
-     mcontrol.setLayoutData(td);
-     
-     factory.setHyperlinkUnderlineMode(HyperlinkHandler.UNDERLINE_ROLLOVER);
-     
-     SelectableFormLabel ft = new SelectableFormLabel(c, SWT.WRAP);
-     ft.setText("Some text in the form text that should also wrap");
-     factory.turnIntoHyperlink(ft, new IHyperlinkListener() {
-     	public void linkEntered(Control link) {
-     		System.out.println("Link entered");
-     	}
-     	public void linkExited(Control link) {
-    		System.out.println("Link exited");
-     	}
-     	public void linkActivated(Control link) {
-     		System.out.println("Link activated");
-     	}
-     });
-
-     ft = new SelectableFormLabel(c, SWT.WRAP);
-     ft.setText("Some more form text here");
-     factory.turnIntoHyperlink(ft, new IHyperlinkListener() {
-     	public void linkEntered(Control link) {
-     		System.out.println("Link entered");
-     	}
-     	public void linkExited(Control link) {
-    		System.out.println("Link exited");
-     	}
-     	public void linkActivated(Control link) {
-     		System.out.println("Link activated");
-     	}
-     });
-   
-     shell.open ();
-     while (!shell.isDisposed ()) {
-          if (!display.readAndDispatch ()) display.sleep ();
-     }
-     display.dispose ();
-}
-
-public static void addFormEngine(Composite c, FormWidgetFactory factory, IStatusLineManager manager) {
-     new Label(c, SWT.NULL);
-     FormEngine html = new FormEngine(c, SWT.WRAP);
-     html.setHyperlinkSettings(factory.getHyperlinkHandler());
-     HTTPAction action = new HTTPAction();
-     action.setStatusLineManager(manager);
-     html.registerTextObject("urlHandler", action);
-     //html.setBackground(factory.getBackgroundColor());
-     html.setForeground(factory.getForegroundColor());
-     InputStream is = TableLayoutTest.class.getResourceAsStream("index.xml");
-     //html.setParagraphsSeparated(false);
-     html.load(is, true);
-     TableData td = new TableData();
-     td.colspan = 1;
-     td.align = TableData.FILL;
-     html.setLayoutData(td);
-}
-
-public static void addRow(Composite c) {
-	Composite row = new Composite(c, SWT.WRAP);
-	RowLayout layout = new RowLayout();
-	layout.wrap = true;
-	row.setLayout(layout);
-	
-	for (int i=0; i<10; i++) {
-		Button button = new Button(row, SWT.PUSH);
-		button.setText("Button that should be wrapped");
-	}
-	TableData td = new TableData();
-	td.colspan = 2;
-	td.align = TableData.FILL;
-	td.grabHorizontal = true;
-	row.setLayoutData(td);
-}
-
-private static void updateSize(ScrolledComposite sc, Composite c) {
-	Rectangle ssize = sc.getClientArea();
-	int swidth = ssize.width;
-	HTMLTableLayout layout = (HTMLTableLayout)c.getLayout();
-	Point size = layout.computeSize(c, swidth, SWT.DEFAULT, true);
-	Rectangle trim = c.computeTrim(0, 0, size.x, size.y);
-	size = new Point(trim.width, trim.height);
-	c.setSize(size);
-}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ToggleControl.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ToggleControl.java
deleted file mode 100644
index 89ec8f6..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/ToggleControl.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.SWT;
-
-public class ToggleControl extends SelectableControl {
-	private boolean selection;
-	private Color decorationColor;
-	private Color activeColor;
-	private Cursor activeCursor;
-	private boolean hover=false;
-	private static final int marginWidth = 2;
-	private static final int marginHeight = 2;
-	private static final int WIDTH = 9;
-	private static final int HEIGHT = 9;
-	private static final int [] offPoints = { 0,2, 8,2, 4,6 };
-	private static final int [] onPoints = { 2, -1, 2,8, 6,4 };	
-
-	public ToggleControl(Composite parent, int style) {
-		super(parent, style);
-		addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				selection = !selection;
-				redraw();
-			}
-		});
-
-		addMouseTrackListener(new MouseTrackAdapter() {
-			public void mouseEnter(MouseEvent e) {
-				hover = true;
-				if (activeCursor!=null)
-				   setCursor(activeCursor);
-				redraw();
-			}
-			public void mouseExit(MouseEvent e) {
-				hover = false;
-				if (activeCursor!=null)
-				   setCursor(null);
-				redraw();
-			}
-		});
-	}
-	
-	public void setDecorationColor(Color decorationColor) {
-		this.decorationColor = decorationColor;
-	}
-	
-	public Color getDecorationColor() {
-		return decorationColor;
-	}
-	
-	public void setActiveDecorationColor(Color activeColor) {
-		this.activeColor = activeColor;
-	}
-	
-	public void setActiveCursor(Cursor activeCursor) {
-		this.activeCursor = activeCursor;
-	}
-	
-	public Color getActiveDecorationColor() {
-		return activeColor;
-	}
-	
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		int width, height;
-		
-		if (wHint!=SWT.DEFAULT) width = wHint; 
-		else 
-		   width = WIDTH + 2*marginWidth;
-		if (hHint!=SWT.DEFAULT) height = hHint;
-		else height = HEIGHT + 2*marginHeight;
-		return new Point(width, height);
-	}
-
-	/*
-	 * @see SelectableControl#paint(GC)
-	 */
-	protected void paint(GC gc) {
-		if (hover && activeColor!=null)
-			gc.setBackground(activeColor);
-		else if (decorationColor!=null)
-	   	   gc.setBackground(decorationColor);
-	   	else
-	   			gc.setBackground(getForeground());
-		int [] data;
-		Point size = getSize();
-		int x = (size.x - 9)/2;
-		int y = (size.y - 9)/2;
-		if (selection)
-			data = translate(onPoints, x, y);
-		
-		else 
-			data = translate(offPoints, x, y);
-		gc.fillPolygon(data);
-		gc.setBackground(getBackground());
-	}
-	
-	private int [] translate(int [] data, int x, int y) {
-		int [] target = new int [data.length];
-		for (int i=0; i<data.length; i+=2) {
-			target[i] = data[i]+ x;
-		}
-		for (int i=1; i<data.length; i+=2) {
-			target[i] = data[i]+y;
-		}
-		return target;
-	}
-
-	public boolean getSelection() {
-		return selection;
-	}
-	
-	public void setSelection(boolean selection) {
-		this.selection = selection;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/WebForm.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/WebForm.java
deleted file mode 100644
index cdedfc4..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/WebForm.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package org.eclipse.update.ui.forms.internal;
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.*;
-import org.eclipse.swt.events.*;
-import java.util.*;
-import org.eclipse.ui.*;
-import org.eclipse.jface.resource.*;
-import org.eclipse.jface.util.*;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.custom.*;
-
-/**
- * This form implementation assumes that it contains
- * children that do not have independent dimensions.
- * In other words, these widgets are not capable
- * of answering their preferred size. Instead,
- * desired width must be supplied to get the
- * preferred height. These forms are layed out
- * top to bottom, left to right and use
- * a layout algorithm very similar to
- * HTML tables. Scrolling is not optional
- * for this type of presentation - 
- * scroll bars will show up when needed.
- */
-
-public class WebForm extends AbstractSectionForm {
-	protected ScrolledComposite scrollComposite;
-	private Composite control;
-	private Composite client;
-	private final static int HMARGIN = 5;
-	private final static int VMARGIN = 5;
-	private Image headingUnderlineImage;
-
-	class WebFormLayout extends Layout {
-
-		protected void layout(Composite parent, boolean changed) {
-			Rectangle bounds = parent.getClientArea();
-			int x = 0;
-			int y = 0;
-			if (isHeadingVisible()) {
-				y = getHeadingHeight(parent);
-			}
-			Point csize;
-			Layout layout = client.getLayout();
-			if (layout != null && layout instanceof HTMLTableLayout) {
-				HTMLTableLayout hlayout = (HTMLTableLayout) layout;
-				csize = hlayout.computeSize(client, bounds.width, SWT.DEFAULT, true);
-				if (csize.x < bounds.width)
-					csize.x = bounds.width;
-				Rectangle trim = control.computeTrim(0, 0, csize.x, csize.y);
-				csize = new Point(trim.width, trim.height);
-			} else {
-				csize = client.computeSize(bounds.width, SWT.DEFAULT, changed);
-			}
-			client.setBounds(x, y, csize.x, csize.y);
-		}
-
-		protected Point computeSize(
-			Composite parent,
-			int wHint,
-			int hHint,
-			boolean changed) {
-			int width = wHint;
-			int height = 0;
-			if (isHeadingVisible()) {
-				height = getHeadingHeight(parent);
-			}
-			Point csize;
-			Layout layout = client.getLayout();
-			if (layout != null && layout instanceof HTMLTableLayout) {
-				HTMLTableLayout hlayout = (HTMLTableLayout) layout;
-				csize = hlayout.computeSize(client, width, SWT.DEFAULT, true);
-				if (csize.x < width)
-					csize.x = width;
-				Rectangle trim = control.computeTrim(0, 0, csize.x, csize.y);
-				csize = new Point(trim.width, trim.height);
-			} else {
-				csize = client.computeSize(width, SWT.DEFAULT, changed);
-			}
-			width = csize.x;
-			height += csize.y;
-			return new Point(width, height);
-		}
-	}
-
-	public WebForm() {
-	}
-
-	public Control createControl(Composite parent) {
-		scrollComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-		scrollComposite.setBackground(factory.getBackgroundColor());
-		final Composite form = factory.createComposite(scrollComposite);
-
-		scrollComposite.setContent(form);
-		scrollComposite.addListener(SWT.Resize, new Listener() {
-			public void handleEvent(Event e) {
-				updateSize();
-			}
-		});
-		WebFormLayout layout = new WebFormLayout();
-		form.setLayout(layout);
-		form.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		this.control = form;
-		client = factory.createComposite(form);
-		createContents(client);
-		initializeScrollBars(scrollComposite);
-		//form.setFocus();
-		return scrollComposite;
-	}
-	private void initializeScrollBars(ScrolledComposite scomp) {
-		ScrollBar hbar = scomp.getHorizontalBar();
-		if (hbar != null) {
-			hbar.setIncrement(H_SCROLL_INCREMENT);
-		}
-		ScrollBar vbar = scomp.getVerticalBar();
-		if (vbar != null) {
-			vbar.setIncrement(V_SCROLL_INCREMENT);
-		}
-		updatePageIncrement(scomp);
-	}
-
-	private int getHeadingHeight(Composite parent) {
-		int width = parent.getSize().x;
-		int height = 0;
-		int imageHeight = 0;
-		if (getHeadingImage() != null) {
-			Rectangle ibounds = getHeadingImage().getBounds();
-			imageHeight = ibounds.height;
-		}
-		GC gc = new GC(parent);
-		gc.setFont(titleFont);
-		int textWidth = width - 2 * HMARGIN;
-		height = FormLabel.computeWrapHeight(gc, getHeadingText(), textWidth);
-		height += 2 * VMARGIN;
-		height = Math.max(height, imageHeight);
-		if (headingUnderlineImage != null) {
-			Rectangle ibounds = headingUnderlineImage.getBounds();
-			height += ibounds.height;
-		}
-		return height;
-	}
-
-	protected void createContents(Composite parent) {
-	}
-
-	public Control getControl() {
-		return control;
-	}
-
-	public void setHeadingVisible(boolean newHeadingVisible) {
-		super.setHeadingVisible(newHeadingVisible);
-		if (control != null)
-			control.layout();
-	}
-
-	public Image getHeadingUnderlineImage() {
-		return headingUnderlineImage;
-	}
-
-	public void setHeadingUnderlineImage(Image image) {
-		this.headingUnderlineImage = image;
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		titleFont = JFaceResources.getHeaderFont();
-		if (control != null) {
-			control.layout();
-		}
-	}
-
-	public void updateSize() {
-		Rectangle ssize = scrollComposite.getClientArea();
-		int swidth = ssize.width;
-		WebFormLayout layout = (WebFormLayout) control.getLayout();
-		Point size = layout.computeSize(control, swidth, SWT.DEFAULT, true);
-		if (size.x < swidth)
-			size.x = swidth;
-		Rectangle trim = control.computeTrim(0, 0, size.x, size.y);
-		size = new Point(trim.width, trim.height);
-		control.setSize(size);
-		updatePageIncrement(scrollComposite);
-	}
-
-	private void paint(PaintEvent e) {
-		if (isHeadingVisible() == false)
-			return;
-		GC gc = e.gc;
-		if (headingImage != null) {
-			gc.drawImage(headingImage, 0, 0);
-		}
-		Point size = control.getSize();
-		if (getHeadingBackground() != null)
-			gc.setBackground(getHeadingBackground());
-		if (getHeadingForeground() != null)
-			gc.setForeground(getHeadingForeground());
-		gc.setFont(titleFont);
-		FormLabel.paintWrapText(gc, size, getHeadingText(), HMARGIN, VMARGIN);
-		if (headingUnderlineImage != null) {
-			int y =
-				getHeadingHeight((Composite) control)
-					- headingUnderlineImage.getBounds().height;
-			gc.drawImage(headingUnderlineImage, 0, y);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/BulletParagraph.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/BulletParagraph.java
deleted file mode 100644
index 2669443..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/BulletParagraph.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.GC;
-import java.util.Hashtable;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Color;
-
-public class BulletParagraph extends Paragraph implements IBulletParagraph {
-	private int style = CIRCLE;
-	private String text;
-	private int CIRCLE_DIAM = 5;
-	private int SPACING = 10;
-	private int indent = -1;
-	/**
-	 * Constructor for BulletParagraph.
-	 * @param addVerticalSpace
-	 */
-	public BulletParagraph(boolean addVerticalSpace) {
-		super(addVerticalSpace);
-	}
-
-	public int getIndent() {
-		if (indent != -1)
-			return indent;
-		switch (style) {
-			case CIRCLE :
-				return CIRCLE_DIAM + SPACING;
-		}
-		return 20;
-	}
-
-	/*
-	 * @see IBulletParagraph#getBulletStyle()
-	 */
-	public int getBulletStyle() {
-		return style;
-	}
-
-	public void setBulletStyle(int style) {
-		this.style = style;
-	}
-
-	public void setBulletText(String text) {
-		this.text = text;
-	}
-
-	public void setIndent(int indent) {
-		this.indent = indent;
-	}
-
-	/*
-	 * @see IBulletParagraph#getBulletText()
-	 */
-	public String getBulletText() {
-		return text;
-	}
-
-	public void paint(
-		GC gc,
-		int width,
-		Locator loc,
-		int lineHeight,
-		Hashtable objectTable,
-		IHyperlinkSegment selectedLink) {
-		paintBullet(gc, loc, lineHeight, objectTable);
-		super.paint(gc, width, loc, lineHeight, objectTable, selectedLink);
-	}
-
-	public void paintBullet(
-		GC gc,
-		Locator loc,
-		int lineHeight,
-		Hashtable objectTable) {
-		int x = loc.x - getIndent();
-		if (style == CIRCLE) {
-			int y = loc.y + lineHeight / 2 - CIRCLE_DIAM / 2;
-			Color bg = gc.getBackground();
-			Color fg = gc.getForeground();
-			gc.setBackground(fg);
-			gc.fillRectangle(x, y + 1, 5, 3);
-			gc.fillRectangle(x + 1, y, 3, 5);
-			gc.setBackground(bg);
-		} else if (style == TEXT && text != null) {
-			gc.drawText(text, x, loc.y);
-		} else if (style == IMAGE && text != null) {
-			Image image = (Image) objectTable.get(text);
-			if (image != null) {
-				int y = loc.y + lineHeight / 2 - image.getBounds().height / 2;
-				gc.drawImage(image, x, y);
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngine.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngine.java
deleted file mode 100644
index a4b9cba..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngine.java
+++ /dev/null
@@ -1,382 +0,0 @@
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.io.InputStream;
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.update.ui.forms.internal.HyperlinkSettings;
-
-public class FormEngine extends Canvas {
-	public static final String URL_HANDLER_ID = "urlHandler";
-	boolean hasFocus;
-	boolean paragraphsSeparated = true;
-	String text;
-	TextModel model;
-	Hashtable objectTable = new Hashtable();
-	public int marginWidth = 0;
-	public int marginHeight = 1;
-	IHyperlinkSegment entered;
-	boolean mouseDown = false;
-	Point dragOrigin;
-
-	public boolean getFocus() {
-		return hasFocus;
-	}
-	
-	public int getParagraphSpacing(int lineHeight) {
-		return lineHeight/2;
-	}
-
-	public void setParagraphsSeparated(boolean value) {
-		paragraphsSeparated = value;
-	}
-
-	/**
-	 * Constructor for SelectableFormLabel
-	 */
-	public FormEngine(Composite parent, int style) {
-		super(parent, style);
-		setLayout(new FormEngineLayout());
-		model = new TextModel();
-
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				model.dispose();
-			}
-		});
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		addListener(SWT.KeyDown, new Listener() {
-			public void handleEvent(Event e) {
-				if (e.character=='\r') {
-					activateSelectedLink();
-					return;
-				}
-			}
-		});
-		addListener(SWT.Traverse, new Listener() {
-			public void handleEvent(Event e) {
-				switch (e.detail) {
-					case SWT.TRAVERSE_PAGE_NEXT:
-					case SWT.TRAVERSE_PAGE_PREVIOUS:
-					case SWT.TRAVERSE_ARROW_NEXT:
-					case SWT.TRAVERSE_ARROW_PREVIOUS:
-					e.doit = false;
-					return;
-				}
-				if (!model.hasFocusSegments()) {
-					e.doit = true;
-					return;
-				}
-				if (e.detail == SWT.TRAVERSE_TAB_NEXT)
-					e.doit = advance(true);
-				else if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS)
-					e.doit = advance(false);
-				else if (e.detail != SWT.TRAVERSE_RETURN)
-					e.doit = true;
-			}
-		});
-		addFocusListener(new FocusListener() {
-			public void focusGained(FocusEvent e) {
-				if (!hasFocus) {
-					hasFocus = true;
-					handleFocusChange();
-				}
-			}
-			public void focusLost(FocusEvent e) {
-				if (hasFocus) {
-					hasFocus = false;
-					handleFocusChange();
-				}
-			}
-		});
-		addMouseListener(new MouseListener() {
-			public void mouseDoubleClick(MouseEvent e) {
-			}
-			public void mouseDown(MouseEvent e) {
-				// select a link
-				handleMouseClick(e, true);
-			}
-			public void mouseUp(MouseEvent e) {
-				// activate a link
-				handleMouseClick(e, false);
-			}
-		});
-		addMouseTrackListener(new MouseTrackListener() {
-			public void mouseEnter(MouseEvent e) {
-				handleMouseMove(e);
-			}
-			public void mouseExit(MouseEvent e) {
-				if (entered != null) {
-					exitLink(entered);
-					entered = null;
-					setCursor(null);
-				}
-			}
-			public void mouseHover(MouseEvent e) {
-				handleMouseHover(e);
-			}
-		});
-		addMouseMoveListener(new MouseMoveListener() {
-			public void mouseMove(MouseEvent e) {
-				handleMouseMove(e);
-			}
-		});
-	}
-
-	private void handleMouseClick(MouseEvent e, boolean down) {
-		if (down) {
-			// select a hyperlink
-			IHyperlinkSegment segmentUnder = model.findHyperlinkAt(e.x, e.y);
-			if (segmentUnder != null) {
-				IHyperlinkSegment oldLink = model.getSelectedLink();
-				model.selectLink(segmentUnder);
-				enterLink(segmentUnder);
-				paintFocusTransfer(oldLink, segmentUnder);
-			}
-			mouseDown=true;
-			dragOrigin = new Point(e.x, e.y);
-		} else {
-			IHyperlinkSegment segmentUnder = model.findHyperlinkAt(e.x, e.y);
-			if (segmentUnder != null) {
-				activateLink(segmentUnder);
-			}
-			mouseDown = false;
-		}
-	}
-	private void handleMouseHover(MouseEvent e) {
-	}
-	private void handleMouseMove(MouseEvent e) {
-		if (mouseDown) {
-			handleDrag(e);
-			return;
-		}
-		ITextSegment segmentUnder = model.findSegmentAt(e.x, e.y);
-		
-		if (segmentUnder == null) {
-			if (entered != null) {
-				exitLink(entered);
-				entered = null;
-			}
-			setCursor(null);
-		} else {
-			if (segmentUnder instanceof IHyperlinkSegment) {
-				IHyperlinkSegment linkUnder = (IHyperlinkSegment)segmentUnder;
-				if (entered == null) {
-					entered = linkUnder;
-					enterLink(linkUnder);
-					setCursor(model.getHyperlinkSettings().getHyperlinkCursor());
-				}
-			}
-			else {
-				setCursor(model.getHyperlinkSettings().getTextCursor());
-			}
-		}
-	}
-	
-	private void handleDrag(MouseEvent e) {
-	}
-	
-
-	public HyperlinkSettings getHyperlinkSettings() {
-		return model.getHyperlinkSettings();
-	}
-
-	public void setHyperlinkSettings(HyperlinkSettings settings) {
-		model.setHyperlinkSettings(settings);
-	}
-
-	private boolean advance(boolean next) {
-		IHyperlinkSegment current = model.getSelectedLink();
-		if (current!=null) exitLink(current);
-		
-		boolean valid = model.traverseLinks(next);
-		
-		if (valid)
-			enterLink(model.getSelectedLink());
-		paintFocusTransfer(current, model.getSelectedLink());
-		return !valid;
-	}
-
-	public IHyperlinkSegment getSelectedLink() {
-		return model.getSelectedLink();
-	}
-
-	private void handleFocusChange() {
-		if (hasFocus) {
-			model.traverseLinks(true);
-			enterLink(model.getSelectedLink());
-			paintFocusTransfer(null, model.getSelectedLink());
-		} else {
-			paintFocusTransfer(model.getSelectedLink(), null);
-			model.selectLink(null);
-		}
-	}
-
-	private void enterLink(IHyperlinkSegment link) {
-		if (link == null)
-			return;
-		HyperlinkAction action = link.getAction(objectTable);
-		if (action != null)
-			action.linkEntered(link);
-	}
-
-	private void exitLink(IHyperlinkSegment link) {
-		if (link == null)
-			return;
-		HyperlinkAction action = link.getAction(objectTable);
-		if (action != null)
-			action.linkExited(link);
-	}
-
-	private void activateSelectedLink() {
-		IHyperlinkSegment link = model.getSelectedLink();
-		if (link != null)
-			activateLink(link);
-	}
-
-	private void activateLink(IHyperlinkSegment link) {
-		setCursor(model.getHyperlinkSettings().getBusyCursor());
-		HyperlinkAction action = link.getAction(objectTable);
-		if (action != null)
-			action.linkActivated(link);
-		setCursor(model.getHyperlinkSettings().getHyperlinkCursor());
-	}
-
-	protected void paint(PaintEvent e) {
-		int width = getClientArea().width;
-		IParagraph[] paragraphs = model.getParagraphs();
-
-		GC gc = e.gc;
-		gc.setFont(getFont());
-		gc.setForeground(getForeground());
-		gc.setBackground(getBackground());
-
-		Locator loc = new Locator();
-		loc.marginWidth = marginWidth;
-		loc.marginHeight = marginHeight;
-		loc.x = marginWidth;
-		loc.y = marginHeight;
-
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-
-		IHyperlinkSegment selectedLink = model.getSelectedLink();
-
-		for (int i = 0; i < paragraphs.length; i++) {
-			IParagraph p = paragraphs[i];
-
-			if (i > 0 && paragraphsSeparated && p.getAddVerticalSpace())
-				loc.y += getParagraphSpacing(lineHeight);
-
-			loc.indent = p.getIndent();
-			loc.resetCaret();
-			loc.rowHeight = 0;
-			p.paint(gc, width, loc, lineHeight, objectTable, selectedLink);
-		}
-	}
-
-	public void registerTextObject(String key, Object value) {
-		objectTable.put(key, value);
-	}
-
-	public void load(String text, boolean parseTags, boolean expandURLs) {
-		try {
-			if (parseTags)
-				model.parseTaggedText(text, expandURLs);
-			else
-				model.parseRegularText(text, expandURLs);
-		} catch (CoreException e) {
-		}
-	}
-	public void load(InputStream is, boolean expandURLs) {
-		try {
-			model.parseInputStream(is, expandURLs);
-		} catch (CoreException e) {
-		}
-	}
-
-	public boolean setFocus() {
-		/*
-		if (!model.hasFocusSegments())
-			return false;
-		*/
-		return super.setFocus();
-	}
-	
-	private void paintFocusTransfer(IHyperlinkSegment oldLink, IHyperlinkSegment newLink) {
-		GC gc = new GC(this);
-		Color bg = getBackground();
-		Color fg = getForeground();
-		
-		gc.setFont(getFont());
-
-		if (oldLink!=null) {
-			gc.setBackground(bg);
-			gc.setForeground(fg);
-			oldLink.paintFocus(gc, bg, fg, false);
-		}
-		if (newLink!=null) {
-			gc.setBackground(bg);
-			gc.setForeground(fg);
-			newLink.paintFocus(gc, bg, fg, true);
-		}
-		gc.dispose();
-	}
-	/**
-	 * Gets the marginWidth.
-	 * @return Returns a int
-	 */
-	public int getMarginWidth() {
-		return marginWidth;
-	}
-
-	/**
-	 * Sets the marginWidth.
-	 * @param marginWidth The marginWidth to set
-	 */
-	public void setMarginWidth(int marginWidth) {
-		this.marginWidth = marginWidth;
-	}
-
-	/**
-	 * Gets the marginHeight.
-	 * @return Returns a int
-	 */
-	public int getMarginHeight() {
-		return marginHeight;
-	}
-
-	/**
-	 * Sets the marginHeight.
-	 * @param marginHeight The marginHeight to set
-	 */
-	public void setMarginHeight(int marginHeight) {
-		this.marginHeight = marginHeight;
-	}
-
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngineLayout.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngineLayout.java
deleted file mode 100644
index 1298e6a..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/FormEngineLayout.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.*;
-
-/**
- * @version 	1.0
- * @author
- */
-public class FormEngineLayout extends Layout {
-
-	/*
-	 * @see Layout#computeSize(Composite, int, int, boolean)
-	 */
-
-	public Point computeSize(
-		Composite composite,
-		int wHint,
-		int hHint,
-		boolean changed) {
-		FormEngine engine = (FormEngine) composite;
-		int innerWidth = wHint;
-		if (innerWidth != SWT.DEFAULT)
-			innerWidth -= engine.marginWidth * 2;
-		Point textSize = computeTextSize(engine, innerWidth);
-		int textWidth = textSize.x + 2 * engine.marginWidth;
-		int textHeight = textSize.y + 2 * engine.marginHeight;
-		Point result = new Point(textWidth, textHeight);
-		return result;
-	}
-
-	private Point computeTextSize(FormEngine engine, int wHint) {
-		IParagraph[] paragraphs = engine.model.getParagraphs();
-
-		GC gc = new GC(engine);
-		gc.setFont(engine.getFont());
-
-		Locator loc = new Locator();
-
-		int width = wHint != SWT.DEFAULT ? wHint : 0;
-
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-
-		for (int i = 0; i < paragraphs.length; i++) {
-			IParagraph p = paragraphs[i];
-
-			if (i > 0 && engine.paragraphsSeparated && p.getAddVerticalSpace())
-				loc.y += engine.getParagraphSpacing(lineHeight);
-
-			loc.rowHeight = 0;
-			loc.indent = p.getIndent();
-			loc.x = p.getIndent();
-
-			IParagraphSegment[] segments = p.getSegments();
-			if (segments.length > 0) {
-				for (int j = 0; j < segments.length; j++) {
-					IParagraphSegment segment = segments[j];
-					segment.advanceLocator(gc, wHint, loc, engine.objectTable);
-					width = Math.max(width, loc.width);
-				}
-				loc.y += loc.rowHeight;
-			} else {
-				// empty new line
-				loc.y += lineHeight;
-			}
-		}
-		gc.dispose();
-		return new Point(width, loc.y);
-	}
-
-	/*
-	 * @see Layout#layout(Composite, boolean)
-	 */
-	protected void layout(Composite composite, boolean flushCache) {
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HTTPAction.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HTTPAction.java
deleted file mode 100644
index b8a226f..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HTTPAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-import org.eclipse.swt.program.Program;
-
-/**
- * @version 	1.0
- * @author
- */
-public class HTTPAction extends HyperlinkAction {
-	public HTTPAction () {
-	}
-	
-	public void linkActivated(IHyperlinkSegment link) {
-		Program.launch(link.getText());
-	}
-	
-	public void linkEntered(IHyperlinkSegment link) {
-		setDescription(link.getText());
-		super.linkEntered(link);
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkAction.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkAction.java
deleted file mode 100644
index c509e72..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.update.ui.forms.internal.IHyperlinkListener;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @version 	1.0
- * @author
- */
-public class HyperlinkAction {
-	IStatusLineManager manager;
-	private String description;
-	
-	public HyperlinkAction() {
-	}
-	
-	public void linkActivated(final IHyperlinkSegment link) {
-	}
-	
-	public void linkEntered(IHyperlinkSegment link) {
-		if (manager!=null && description!=null) {
-			manager.setMessage(description);
-		}
-	}
-
-	public void linkExited(IHyperlinkSegment link) {
-		if (manager!=null && description!=null) {
-			manager.setMessage(null);
-		}
-	}
-	
-	public void setStatusLineManager(IStatusLineManager manager) {
-		this.manager = manager;
-	}
-	
-	public String getDescription() {
-		return description;
-	}
-	public void setDescription(String description) {
-		this.description = description;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkSegment.java
deleted file mode 100644
index 0fb0385..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/HyperlinkSegment.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.util.Hashtable;
-import org.eclipse.update.ui.forms.internal.*;
-import org.eclipse.swt.graphics.GC;
-
-/**
- * @version 	1.0
- * @author
- */
-public class HyperlinkSegment
-	extends TextSegment
-	implements IHyperlinkSegment {
-	private String actionId;
-	private HyperlinkSettings settings;
-
-	
-	public HyperlinkSegment(String text, HyperlinkSettings settings, String fontId) {
-		super(text, fontId);
-		this.settings = settings;
-		underline = true;
-	}
-	
-	/*
-	 * @see IHyperlinkSegment#getListener(Hashtable)
-	 */
-	public HyperlinkAction getAction(Hashtable objectTable) {
-		if (actionId==null) return null;
-		Object obj = objectTable.get(actionId);
-		if (obj==null) return null;
-		if (obj instanceof HyperlinkAction) return (HyperlinkAction)obj;
-		return null;
-	}
-	
-	/*
-		public boolean isSelectable() {
-		return true;
-	}
-	*/
-
-	/*
-	 * @see IObjectReference#getObjectId()
-	 */
-	public String getObjectId() {
-		return actionId;
-	}
-	
-	void setActionId(String id) {
-		this.actionId = id;
-	}
-	public void paint(GC gc, int width, Locator locator, Hashtable objectTable, boolean selected) {
-		setColor(settings.getForeground());
-		super.paint(gc, width, locator, objectTable, selected);
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IBulletParagraph.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IBulletParagraph.java
deleted file mode 100644
index faa8dbb..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IBulletParagraph.java
+++ /dev/null
@@ -1,15 +0,0 @@
-
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.GC;
-import java.util.Hashtable;
-
-public interface IBulletParagraph extends IParagraph {
-	int CIRCLE = 0;
-	int TEXT = 1;
-	int IMAGE = 2;
-	public int getBulletStyle();
-	public String getBulletText();
-
-	public void paintBullet(GC gc, Locator loc, int lineHeight, Hashtable objectTable);
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IHyperlinkSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IHyperlinkSegment.java
deleted file mode 100644
index d3cab0a..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IHyperlinkSegment.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.util.Hashtable;
-import org.eclipse.update.ui.forms.internal.IHyperlinkListener;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IHyperlinkSegment extends ITextSegment, IObjectReference {
-	HyperlinkAction getAction(Hashtable objectTable);
-	
-	boolean contains(int x, int y);
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IImageSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IImageSegment.java
deleted file mode 100644
index a1eda98..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IImageSegment.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-import org.eclipse.swt.graphics.Image;
-import java.util.Hashtable;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IImageSegment extends IParagraphSegment, IObjectReference {
-	public static final int TOP = 1;
-	public static final int MIDDLE = 2;
-	public static final int BOTTOM = 3;
-	
-	public int getVerticalAlignment();
-
-	Image getImage(Hashtable objectTable);
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IObjectReference.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IObjectReference.java
deleted file mode 100644
index 88d1c4e..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IObjectReference.java
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IObjectReference {
-	public String getObjectId();
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraph.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraph.java
deleted file mode 100644
index f748804..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraph.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-
-import org.eclipse.swt.graphics.GC;
-import java.util.Hashtable;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IParagraph {
-	public int getIndent();
-	public IParagraphSegment [] getSegments();
-	public void addSegment(IParagraphSegment segment);
-	public boolean getAddVerticalSpace();
-	public ITextSegment findSegmentAt(int x, int y);
-	public void paint(GC gc, int width, Locator loc, int lineHeight, Hashtable objectTable, IHyperlinkSegment selectedLink);
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraphSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraphSegment.java
deleted file mode 100644
index 0587b72..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/IParagraphSegment.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.GC;
-import java.util.Hashtable;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface IParagraphSegment {
-	
-	public void advanceLocator(GC gc, int wHint, Locator loc, Hashtable objectTable);
-	
-	public void paint(GC gc, int width, Locator loc, Hashtable objectTable, boolean selected);
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextModel.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextModel.java
deleted file mode 100644
index 0a6d5ba..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextModel.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface ITextModel {
-	IParagraph [] getParagraphs();
-	public void parseTaggedText(String taggedText, boolean expandURLs) throws CoreException;
-	public void parseRegularText(String regularText, boolean expandURLs) throws CoreException;
-	public void dispose();
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextSegment.java
deleted file mode 100644
index 7cdfac6..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ITextSegment.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * @version 	1.0
- * @author
- */
-public interface ITextSegment extends IParagraphSegment {
-	String getText();
-	Color getColor();
-	Font getFont();
-	boolean isWordWrapAllowed();
-	boolean isSelectable();
-	boolean contains(int x, int y);
-	void paintFocus(GC gc, Color bg, Color fg, boolean selected);
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ImageSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ImageSegment.java
deleted file mode 100644
index 4fa9c4d..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ImageSegment.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.*;
-import java.util.Hashtable;
-import org.eclipse.swt.SWT;
-
-/**
- * @version 	1.0
- * @author
- */
-public class ImageSegment extends ParagraphSegment implements IImageSegment {
-	private int alignment = BOTTOM;
-	private String imageId;
-	
-	public int getVerticalAlignment() {
-		return alignment;
-	}
-	
-	void setVerticalAlignment(int alignment) {
-		this.alignment = alignment;
-	}
-	
-	public Image getImage(Hashtable objectTable) {
-		if (imageId==null) return null;
-		Object obj = objectTable.get(imageId);
-		if (obj==null) return null;
-		if (obj instanceof Image) return (Image)obj;
-		return null;
-	}
-	
-	public String getObjectId() {
-		return imageId;
-	}
-	
-	void setObjectId(String imageId) {
-		this.imageId = imageId;
-	}
-	
-	public void advanceLocator(GC gc, int wHint, Locator loc, Hashtable objectTable) {
-		Image image = getImage(objectTable);
-		int iwidth = 0;
-		int iheight = 0;
-		if (image!=null) {
-			Rectangle rect = image.getBounds();
-			iwidth = rect.width;
-			iheight = rect.height;
-		}
-		if (wHint != SWT.DEFAULT && loc.x + iwidth > wHint) {
-			// new line
-			loc.x = loc.indent + iwidth;
-			loc.width = loc.x;
-			loc.y += loc.rowHeight;
-			loc.rowHeight = iheight;
-		}
-		else {
-			loc.x += iwidth;
-			loc.rowHeight = Math.max(loc.rowHeight, iheight);
-		}
-	}
-
-	public void paint(GC gc, int width, Locator loc, Hashtable objectTable, boolean selected) {
-		Image image = getImage(objectTable);
-		int iwidth = 0;
-		int iheight = 0;
-		if (image!=null) {
-			Rectangle rect = image.getBounds();
-			iwidth = rect.width;
-			iheight = rect.height;
-		}
-		else return;
-		loc.width = iwidth;
-		loc.height = iheight;
-		
-		int ix = loc.x;
-		int iy = loc.y;
-		
-		if (ix + iwidth > width) {
-			// new row
-			ix = loc.indent + loc.marginWidth;
-			iy += loc.rowHeight;
-			loc.rowHeight = 0;
-		}
-		
-		gc.drawImage(image, ix, iy);
-		loc.x = ix + iwidth;
-		loc.y = iy;
-		loc.rowHeight = Math.max(loc.rowHeight, iheight);
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java
deleted file mode 100644
index fb46567..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Locator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-/**
- * @version 	1.0
- * @author
- */
-public class Locator { 
-	public int indent;
-	public int x, y;
-	public int width, height;
-	public int rowHeight;
-	public int marginWidth;
-	public int marginHeight;
-	
-	public void newLine() {
-		resetCaret();
-		y += rowHeight;
-		rowHeight = 0;
-	}
-	
-	public void resetCaret() {
-		x = marginWidth + indent;
-	}
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Paragraph.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Paragraph.java
deleted file mode 100644
index f4de4c9..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/Paragraph.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.util.Vector;
-import java.util.StringTokenizer;
-import org.eclipse.update.ui.forms.internal.HyperlinkSettings;
-import java.util.Hashtable;
-import org.eclipse.swt.graphics.GC;
-
-/**
- * @version 	1.0
- * @author
- */
-public class Paragraph implements IParagraph {
-	public static final String HTTP = "http://";
-	private Vector segments;
-	private boolean addVerticalSpace = true;
-
-	public Paragraph(boolean addVerticalSpace) {
-		this.addVerticalSpace = addVerticalSpace;
-	}
-
-	public int getIndent() {
-		return 0;
-	}
-
-	public boolean getAddVerticalSpace() {
-		return addVerticalSpace;
-	}
-
-	/*
-	 * @see IParagraph#getSegments()
-	 */
-	public IParagraphSegment[] getSegments() {
-		if (segments == null)
-			return new IParagraphSegment[0];
-		return (IParagraphSegment[]) segments.toArray(
-			new IParagraphSegment[segments.size()]);
-	}
-
-	public void addSegment(IParagraphSegment segment) {
-		if (segments == null)
-			segments = new Vector();
-		segments.add(segment);
-	}
-
-	public void parseRegularText(
-		String text,
-		boolean expandURLs,
-		HyperlinkSettings settings,
-		String fontId) {
-		if (text.length() == 0)
-			return;
-		if (expandURLs) {
-			int loc = text.indexOf(HTTP);
-
-			if (loc == -1)
-				addSegment(new TextSegment(text, fontId));
-			else {
-				int textLoc = 0;
-				while (loc != -1) {
-					addSegment(new TextSegment(text.substring(textLoc, loc), fontId));
-					boolean added = false;
-					for (textLoc = loc; textLoc < text.length(); textLoc++) {
-						char c = text.charAt(textLoc);
-						if (Character.isSpaceChar(c)) {
-							addHyperlinkSegment(text.substring(loc, textLoc), settings, fontId);
-							added = true;
-							break;
-						}
-					}
-					if (!added) {
-						// there was no space - just end of text
-						addHyperlinkSegment(text.substring(loc), settings, fontId);
-						break;
-					}
-					loc = text.indexOf(HTTP, textLoc);
-				}
-				if (textLoc < text.length()) {
-					addSegment(new TextSegment(text.substring(textLoc), fontId));
-				}
-			}
-		} else {
-			addSegment(new TextSegment(text, fontId));
-		}
-	}
-
-	private void addHyperlinkSegment(
-		String text,
-		HyperlinkSettings settings,
-		String fontId) {
-		HyperlinkSegment hs = new HyperlinkSegment(text, settings, fontId);
-		hs.setWordWrapAllowed(false);
-		hs.setActionId(FormEngine.URL_HANDLER_ID);
-		addSegment(hs);
-	}
-
-	public void paint(
-		GC gc,
-		int width,
-		Locator loc,
-		int lineHeight,
-		Hashtable objectTable,
-		IHyperlinkSegment selectedLink) {
-		IParagraphSegment [] segments = getSegments();
-		if (segments.length > 0) {
-			if (segments[0] instanceof ITextSegment
-				&& ((ITextSegment) segments[0]).isSelectable())
-				loc.x += 1;
-			for (int j = 0; j < segments.length; j++) {
-				IParagraphSegment segment = segments[j];
-				boolean doSelect = false;
-				if (selectedLink != null && segment.equals(selectedLink))
-					doSelect = true;
-				segment.paint(gc, width, loc, objectTable, doSelect);
-			}
-			loc.y += loc.rowHeight;
-		} else {
-			loc.y += lineHeight;
-		}
-	}
-	public ITextSegment findSegmentAt(int x, int y) {
-		if (segments!=null) {
-			for (int i=0; i<segments.size(); i++) {
-				IParagraphSegment segment = (IParagraphSegment)segments.get(i);
-				if (segment instanceof ITextSegment) {
-					ITextSegment textSegment = (ITextSegment)segment;
-					if (textSegment.contains(x, y))
-						return textSegment;
-				}
-			}
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ParagraphSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ParagraphSegment.java
deleted file mode 100644
index 1458bc3..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/ParagraphSegment.java
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-/**
- * @version 	1.0
- * @author
- */
-public abstract class ParagraphSegment implements IParagraphSegment {
-
-}
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextModel.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextModel.java
deleted file mode 100644
index ebc2047..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextModel.java
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import java.util.Vector;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.update.ui.forms.internal.*;
-import org.apache.xerces.parsers.DOMParser;
-import org.xml.sax.*;
-import java.io.*;
-import org.w3c.dom.*;
-import org.eclipse.jface.resource.JFaceResources;
-
-/**
- * @version 	1.0
- * @author
- */
-public class TextModel implements ITextModel {
-	Vector paragraphs;
-	IHyperlinkListener urlListener;
-	IHyperlinkSegment[] hyperlinks;
-	int selectedLinkIndex = -1;
-	HyperlinkSettings hyperlinkSettings;
-	
-	class LocalHyperlinkSettings extends HyperlinkSettings {
-	}
-
-	/*
-	 * @see ITextModel#getParagraphs()
-	 */
-	public IParagraph[] getParagraphs() {
-		if (paragraphs == null)
-			return new IParagraph[0];
-		return (IParagraph[]) paragraphs.toArray(new IParagraph[paragraphs.size()]);
-	}
-
-	/*
-	 * @see ITextModel#parse(String)
-	 */
-	public void parseTaggedText(String taggedText, boolean expandURLs)
-		throws CoreException {
-		try {
-			InputStream stream = new ByteArrayInputStream(taggedText.getBytes("UTF8"));
-			parseInputStream(stream, expandURLs);
-		} catch (UnsupportedEncodingException e) {
-		}
-	}
-
-	public void parseInputStream(InputStream is, boolean expandURLs)
-		throws CoreException {
-		DOMParser parser = new DOMParser();
-		reset();
-		try {
-			InputSource source = new InputSource(is);
-			parser.parse(source);
-			/*
-			if (errorHandler.getErrorCount()>0 ||
-			errorHandler.getFatalErrorCount()>0) {
-				throwParseErrorsException();
-			*/
-			processDocument(parser.getDocument(), expandURLs);
-		} catch (SAXException e) {
-			// FIXME log instead 
-			System.out.println(e);
-		} catch (IOException e) {
-		}
-	}
-
-	private void processDocument(Document doc, boolean expandURLs) {
-		Node root = doc.getDocumentElement();
-		NodeList children = root.getChildNodes();
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			if (child.getNodeType() == Node.TEXT_NODE) {
-				// Make an implicit paragraph
-				String text = child.getNodeValue();
-				if (text != null && !isIgnorableWhiteSpace(text, true)) {
-					Paragraph p = new Paragraph(true);
-					p.parseRegularText(text, expandURLs, getHyperlinkSettings(), null);
-					paragraphs.add(p);
-				}
-			} else if (child.getNodeType() == Node.ELEMENT_NODE) {
-				String tag = child.getNodeName().toLowerCase();
-				if (tag.equals("p")) {
-					IParagraph p = processParagraph(child, expandURLs);
-					if (p != null)
-						paragraphs.add(p);
-				}
-				else if (tag.equals("li")) {
-					IParagraph p = processListItem(child, expandURLs);
-					if (p != null)
-						paragraphs.add(p);
-				}
-			}
-		}
-	}
-	private IParagraph processParagraph(Node paragraph, boolean expandURLs) {
-		NodeList children = paragraph.getChildNodes();
-		NamedNodeMap atts = paragraph.getAttributes();
-		Node addSpaceAtt = atts.getNamedItem("addVerticalSpace");
-		boolean addSpace = true;
-		
-		if (addSpaceAtt != null) {
-			String value = addSpaceAtt.getNodeValue();
-			addSpace = value.equalsIgnoreCase("true");
-		}
-		Paragraph p = new Paragraph(addSpace);
-		
-		processSegments(p, children, expandURLs);
-		return p;
-	}
-	private IParagraph processListItem(Node listItem, boolean expandURLs) {
-		NodeList children = listItem.getChildNodes();
-		NamedNodeMap atts = listItem.getAttributes();
-		Node addSpaceAtt = atts.getNamedItem("addVerticalSpace");
-		Node styleAtt = atts.getNamedItem("style");
-		Node valueAtt = atts.getNamedItem("value");
-		Node indentAtt = atts.getNamedItem("indent");
-		int style = IBulletParagraph.CIRCLE;
-		int indent = -1;
-		String text = null;
-		boolean addSpace = true;
-		
-		if (addSpaceAtt != null) {
-			String value = addSpaceAtt.getNodeValue();
-			addSpace = value.equalsIgnoreCase("true");
-		}
-		if (styleAtt!=null) {
-			String value = styleAtt.getNodeValue();
-			if (value.equalsIgnoreCase("text")) {
-				style = IBulletParagraph.TEXT;
-			}
-			else if (value.equalsIgnoreCase("image")) {
-				style = IBulletParagraph.IMAGE;
-			}
-		}
-		if (valueAtt!=null) {
-			text = valueAtt.getNodeValue();
-		}
-		if (indentAtt!=null) {
-			String value = valueAtt.getNodeValue();
-			try {
-				indent =Integer.parseInt(value);
-			}
-			catch (NumberFormatException e) {
-			}
-		}
-				
-		BulletParagraph p = new BulletParagraph(addSpace);
-		p.setIndent(indent);
-		p.setBulletStyle(style);
-		p.setBulletText(text);
-		
-		processSegments(p, children, expandURLs);
-		return p;
-	}
-
-	private void processSegments(
-		Paragraph p,
-		NodeList children,
-		boolean expandURLs) {
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			IParagraphSegment segment = null;
-
-			if (child.getNodeType() == Node.TEXT_NODE) {
-				String value = child.getNodeValue();
-
-				if (value != null && !isIgnorableWhiteSpace(value, false)) {
-					p.parseRegularText(value, expandURLs, getHyperlinkSettings(), null);
-				}
-			} else if (child.getNodeType() == Node.ELEMENT_NODE) {
-				String name = child.getNodeName();
-				if (name.equalsIgnoreCase("img")) {
-					segment = processImageSegment(child);
-				} else if (name.equalsIgnoreCase("a")) {
-					segment = processHyperlinkSegment(child, getHyperlinkSettings());
-				}
-				else if (name.equalsIgnoreCase("text")) {
-					processTextSegment(p, expandURLs, child);
-				}
-				else if (name.equalsIgnoreCase("b")) {
-					String text = getNodeText(child).trim();
-					String fontId = JFaceResources.BANNER_FONT;
-					p.parseRegularText(text, expandURLs, getHyperlinkSettings(), fontId);
-				}
-			}
-			if (segment != null) {
-				p.addSegment(segment);
-			}
-		}
-	}
-	
-	private boolean isIgnorableWhiteSpace(String text, boolean ignoreSpaces) {
-		for (int i=0; i<text.length(); i++) {
-			char c = text.charAt(i);
-			if (ignoreSpaces && c== ' ') continue;
-			if (c=='\n' || c=='\r' || c=='\f') continue;
-			return false;
-		}
-		return true;
-	}
-
-	private IParagraphSegment processImageSegment(Node image) {
-		ImageSegment segment = new ImageSegment();
-		NamedNodeMap atts = image.getAttributes();
-		Node id = atts.getNamedItem("href");
-		Node align = atts.getNamedItem("align");
-		if (id != null) {
-			String value = id.getNodeValue();
-			segment.setObjectId(value);
-		}
-		if (align != null) {
-			String value = align.getNodeValue().toLowerCase();
-			if (value.equals("top"))
-				segment.setVerticalAlignment(ImageSegment.TOP);
-			else if (value.equals("middle"))
-				segment.setVerticalAlignment(ImageSegment.MIDDLE);
-			else if (value.equals("bottom"))
-				segment.setVerticalAlignment(ImageSegment.BOTTOM);
-		}
-		return segment;
-	}
-	
-	private String getNodeText(Node node) {
-		NodeList children = node.getChildNodes();
-		String text = "";
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			if (child.getNodeType() == Node.TEXT_NODE) {
-				text += child.getNodeValue();
-			}
-		}
-		return text;
-	}
-
-	private IParagraphSegment processHyperlinkSegment(
-		Node link,
-		HyperlinkSettings settings) {
-		String text = getNodeText(link);
-		HyperlinkSegment segment = new HyperlinkSegment(text, settings, null);
-		NamedNodeMap atts = link.getAttributes();
-		Node href = atts.getNamedItem("href");
-		if (href != null) {
-			String value = href.getNodeValue();
-			segment.setActionId(value);
-		}
-		return segment;
-	}
-	
-	private void processTextSegment(Paragraph p, boolean expandURLs, Node textNode) {
-		String text = getNodeText(textNode).trim();
-
-		NamedNodeMap atts = textNode.getAttributes();
-		Node font = atts.getNamedItem("font");
-		String fontId = null;
-		if (font != null) {
-			fontId = font.getNodeValue();
-		}
-		p.parseRegularText(text, expandURLs, getHyperlinkSettings(), fontId);
-	}
-
-	public void parseRegularText(String regularText, boolean convertURLs)
-		throws CoreException {
-		reset();
-
-		Paragraph p = new Paragraph(true);
-		paragraphs.add(p);
-		int pstart = 0;
-
-		for (int i = 0; i < regularText.length(); i++) {
-			char c = regularText.charAt(i);
-			if (p == null) {
-				p = new Paragraph(true);
-				paragraphs.add(p);
-			}
-			if (c == '\n') {
-				String text = regularText.substring(pstart, i);
-				pstart = i + 1;
-				p.parseRegularText(text, convertURLs, getHyperlinkSettings(), null);
-				p = null;
-			}
-		}
-		if (p != null) {
-			// no new line
-			String text = regularText.substring(pstart);
-			p.parseRegularText(text, convertURLs, getHyperlinkSettings(), null);
-		}
-	}
-
-	public HyperlinkSettings getHyperlinkSettings() {
-		if (hyperlinkSettings == null) {
-			hyperlinkSettings = new LocalHyperlinkSettings();
-		}
-		return hyperlinkSettings;
-	}
-
-	public void setHyperlinkSettings(HyperlinkSettings settings) {
-		this.hyperlinkSettings = settings;
-	}
-
-	public void setURLListener(IHyperlinkListener urlListener) {
-		this.urlListener = urlListener;
-	}
-
-	private void reset() {
-		if (paragraphs == null)
-			paragraphs = new Vector();
-		paragraphs.clear();
-		selectedLinkIndex = -1;
-		hyperlinks = null;
-	}
-
-	IHyperlinkSegment[] getHyperlinks() {
-		if (hyperlinks != null || paragraphs == null)
-			return hyperlinks;
-		Vector result = new Vector();
-		for (int i = 0; i < paragraphs.size(); i++) {
-			IParagraph p = (IParagraph) paragraphs.get(i);
-			IParagraphSegment[] segments = p.getSegments();
-			for (int j = 0; j < segments.length; j++) {
-				if (segments[j] instanceof IHyperlinkSegment)
-					result.add(segments[j]);
-			}
-		}
-		hyperlinks =
-			(IHyperlinkSegment[]) result.toArray(new IHyperlinkSegment[result.size()]);
-		return hyperlinks;
-	}
-
-	public IHyperlinkSegment findHyperlinkAt(int x, int y) {
-		IHyperlinkSegment[] links = getHyperlinks();
-		for (int i = 0; i < links.length; i++) {
-			if (links[i].contains(x, y))
-				return links[i];
-		}
-		return null;
-	}
-	public ITextSegment findSegmentAt(int x, int y) {
-		for (int i=0; i<paragraphs.size(); i++) {
-			IParagraph p = (IParagraph)paragraphs.get(i);
-			ITextSegment segment = p.findSegmentAt(x, y);
-			if (segment!=null) return segment;
-		}
-		return null;
-	}
-
-	public IHyperlinkSegment getSelectedLink() {
-		if (selectedLinkIndex == -1)
-			return null;
-		return hyperlinks[selectedLinkIndex];
-	}
-
-	public boolean traverseLinks(boolean next) {
-		IHyperlinkSegment[] links = getHyperlinks();
-		if (links == null)
-			return false;
-		int size = links.length;
-		if (next) {
-			selectedLinkIndex++;
-		} else
-			selectedLinkIndex--;
-
-		if (selectedLinkIndex < 0 || selectedLinkIndex > size - 1) {
-			selectedLinkIndex = -1;
-		}
-		return selectedLinkIndex != -1;
-	}
-
-	public void selectLink(IHyperlinkSegment link) {
-		if (link==null) selectedLinkIndex = -1;
-		else {
-			IHyperlinkSegment[] links = getHyperlinks();
-			selectedLinkIndex = -1;
-			if (links==null) return;
-			for (int i=0; i<links.length; i++) {
-				if (links[i].equals(link)) {
-					selectedLinkIndex = i;
-					break;
-				}
-			}
-		}
-	}
-	
-	public boolean hasFocusSegments() {
-		IHyperlinkSegment [] links = getHyperlinks();
-		if (links.length>0) return true;
-		return false;
-	}
-
-	public void dispose() {
-		if (hyperlinkSettings instanceof LocalHyperlinkSettings)
-		   hyperlinkSettings.dispose();
-	}
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextSegment.java b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextSegment.java
deleted file mode 100644
index 0d4ef31..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/engine/TextSegment.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * (c) Copyright 2001 MyCorporation.
- * All Rights Reserved.
- */
-package org.eclipse.update.ui.forms.internal.engine;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.jface.resource.JFaceResources;
-import java.util.Hashtable;
-import org.eclipse.swt.SWT;
-import java.text.BreakIterator;
-import java.util.Vector;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @version 	1.0
- * @author
- */
-public class TextSegment extends ParagraphSegment implements ITextSegment {
-	private Color color;
-	private String fontId;
-	private String text;
-	protected boolean underline;
-	private boolean wrapAllowed = true;
-	private Vector areaRectangles = new Vector();
-
-	public TextSegment(String text, String fontId) {
-		this.text = cleanup(text);
-		this.fontId = fontId;
-	}
-
-	private String cleanup(String text) {
-		StringBuffer buf = new StringBuffer();
-		for (int i = 0; i < text.length(); i++) {
-			char c = text.charAt(i);
-			if (c == '\n' || c == '\r' || c=='\f') {
-				if (i > 0)
-					buf.append(' ');
-			} else
-				buf.append(c);
-		}
-		return buf.toString();
-	}
-
-	public void setWordWrapAllowed(boolean value) {
-		wrapAllowed = value;
-	}
-
-	public boolean isWordWrapAllowed() {
-		return wrapAllowed;
-	}
-	
-	public boolean isSelectable() {
-		return false;
-	}
-
-	public Color getColor() {
-		return color;
-	}
-
-	public Font getFont() {
-		if (fontId == null)
-			return JFaceResources.getDefaultFont();
-		else
-			return JFaceResources.getFontRegistry().get(fontId);
-	}
-
-	public String getText() {
-		return text;
-	}
-
-	void setText(String text) {
-		this.text = cleanup(text);
-	}
-
-	void setColor(Color color) {
-		this.color = color;
-	}
-
-	void setFontId(String fontId) {
-		this.fontId = fontId;
-	}
-
-	public boolean contains(int x, int y) {
-		for (int i = 0; i < areaRectangles.size(); i++) {
-			Rectangle ar = (Rectangle) areaRectangles.get(i);
-			if (ar.contains(x, y))
-				return true;
-		}
-		return false;
-	}
-
-	public void advanceLocator(
-		GC gc,
-		int wHint,
-		Locator locator,
-		Hashtable objectTable) {
-		Font oldFont = null;
-		if (fontId != null) {
-			oldFont = gc.getFont();
-			gc.setFont(getFont());
-		}
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-
-		if (wHint == SWT.DEFAULT || !wrapAllowed) {
-			Point extent = gc.textExtent(text);
-
-			if (locator.x + extent.x > wHint) {
-				// new line
-				locator.x = isSelectable()?locator.indent+1:locator.indent;
-				locator.y += locator.rowHeight;
-				locator.rowHeight = 0;
-			}
-			int width = extent.x;
-			if (isSelectable()) width+=2;
-			locator.x += width;
-			locator.width = width;
-			locator.height = extent.y;
-			locator.rowHeight = Math.max(locator.rowHeight, extent.y);
-			return;
-		}
-
-		BreakIterator wb = BreakIterator.getLineInstance();
-		wb.setText(text);
-
-		int saved = 0;
-		int last = 0;
-
-		int width = 0;
-
-		Point lastExtent = null;
-
-		for (int loc = wb.first(); loc != BreakIterator.DONE; loc = wb.next()) {
-			String word = text.substring(saved, loc);
-			Point extent = gc.textExtent(word);
-
-			if (locator.x + extent.x > wHint) {
-				// overflow
-				String savedWord = text.substring(saved, last);
-				if (lastExtent==null)
-				   lastExtent = gc.textExtent(savedWord);
-				int lineWidth = locator.x + lastExtent.x;
-				if (isSelectable()) lineWidth+=2;
-
-				saved = last;
-				locator.rowHeight = Math.max(locator.rowHeight, lastExtent.y);
-				locator.x = isSelectable()?locator.indent+1:locator.indent;
-				locator.y += locator.rowHeight;
-				locator.rowHeight = 0;
-				width = Math.max(width, lineWidth);
-			}
-			last = loc;
-			lastExtent = extent;
-		}
-		String lastString = text.substring(saved, last);
-		Point extent = gc.textExtent(lastString);
-		int lineWidth = extent.x;
-		if (isSelectable()) lineWidth += 2;
-		locator.x += lineWidth;
-		locator.width = width;
-		locator.height = lineHeight;
-		locator.rowHeight = Math.max(locator.rowHeight, extent.y);
-		if (oldFont != null) {
-			gc.setFont(oldFont);
-		}
-	}
-	
-	public void paint(
-		GC gc,
-		int width,
-		Locator locator,
-		Hashtable objectTable,
-		boolean selected) {
-		Font oldFont = null;
-		Color oldColor = null;
-
-		areaRectangles.clear();
-
-		if (fontId != null) {
-			oldFont = gc.getFont();
-			gc.setFont(getFont());
-		}
-		if (color != null) {
-			oldColor = gc.getForeground();
-			gc.setForeground(color);
-		}
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		int descent = fm.getDescent();
-
-		if (!wrapAllowed) {
-			Point extent = gc.textExtent(text);
-			int ewidth = extent.x;
-			if (isSelectable()) ewidth += 2;
-
-			if (locator.x + ewidth > width) {
-				// new line
-				locator.resetCaret();
-				if (isSelectable()) locator.x += 1;
-				locator.y += locator.rowHeight;
-				locator.rowHeight = 0;
-			}
-			gc.drawString(text, locator.x, locator.y);
-			if (underline) {
-				int lineY = locator.y + lineHeight - descent + 1;
-				gc.drawLine(locator.x, lineY, locator.x + extent.x, lineY);
-			}
-			Rectangle br =
-				new Rectangle(locator.x - 1, locator.y, extent.x + 2, lineHeight - descent + 3);
-			areaRectangles.add(br);
-			if (selected) {
-				if (color != null)
-					gc.setForeground(oldColor);
-				gc.drawFocus(br.x, br.y, br.width, br.height);
-			}
-
-			locator.x += ewidth;
-			locator.width = ewidth;
-			locator.height = lineHeight;
-			locator.rowHeight = Math.max(locator.rowHeight, extent.y);
-			if (oldFont != null) {
-				gc.setFont(oldFont);
-			}
-			if (oldColor != null) {
-				gc.setForeground(oldColor);
-			}
-			return;
-		}
-
-		BreakIterator wb = BreakIterator.getLineInstance();
-		wb.setText(text);
-
-		int saved = 0;
-		int last = 0;
-
-		for (int loc = wb.first(); loc != BreakIterator.DONE; loc = wb.next()) {
-			if (loc == 0)
-				continue;
-			String word = text.substring(saved, loc);
-			Point extent = gc.textExtent(word);
-			int ewidth = extent.x;
-			if (isSelectable()) ewidth += 2;
-
-			if (locator.x + ewidth > width) {
-				// overflow
-				String prevLine = text.substring(saved, last);
-				gc.drawString(prevLine, locator.x, locator.y, true);
-				Point prevExtent = gc.textExtent(prevLine);
-				int prevWidth = prevExtent.x;
-				if (isSelectable()) prevWidth += 2;
-
-				if (underline) {
-					int lineY = locator.y + lineHeight - descent + 1;
-					gc.drawLine(locator.x, lineY, locator.x + prevWidth, lineY);
-				}
-				Rectangle br =
-					new Rectangle(
-						locator.x - 1,
-						locator.y,
-						prevExtent.x + 2,
-						lineHeight - descent + 3);
-				if (selected) {
-					if (color != null)
-						gc.setForeground(oldColor);
-					gc.drawFocus(br.x, br.y, br.width, br.height);
-					if (color != null)
-						gc.setForeground(color);
-				}
-				areaRectangles.add(br);
-				locator.rowHeight = Math.max(locator.rowHeight, prevExtent.y);
-				locator.resetCaret();
-				if (isSelectable()) locator.x +=1;
-				locator.y += locator.rowHeight;
-				locator.rowHeight = 0;
-				saved = last;
-			}
-			last = loc;
-		}
-		// paint the last line
-		String lastLine = text.substring(saved, last);
-		gc.drawString(lastLine, locator.x, locator.y, true);
-		Point lastExtent = gc.textExtent(lastLine);
-		int lastWidth = lastExtent.x;
-		if (isSelectable()) lastWidth += 2;
-		Rectangle br =
-			new Rectangle(
-				locator.x - 1,
-				locator.y,
-				lastExtent.x + 2,
-				lineHeight - descent + 3);
-		areaRectangles.add(br);
-		if (underline) {
-			int lineY = locator.y + lineHeight - descent + 1;
-			gc.drawLine(locator.x, lineY, locator.x + lastExtent.x, lineY);
-		}
-		if (selected) {
-			if (color != null)
-				gc.setForeground(oldColor);
-			gc.drawFocus(br.x, br.y, br.width, br.height);
-		}
-		locator.x += lastWidth;
-		locator.rowHeight = Math.max(locator.rowHeight, lastExtent.y);
-		if (oldFont != null) {
-			gc.setFont(oldFont);
-		}
-		if (oldColor != null) {
-			gc.setForeground(oldColor);
-		}
-	}
-	
-	public void paintFocus(GC gc, Color bg, Color fg, boolean selected) {
-		if (areaRectangles==null) return;
-		for (int i=0; i<areaRectangles.size(); i++) {
-			Rectangle br = (Rectangle)areaRectangles.get(i);
-			if (selected) {
-				gc.setBackground(bg);
-				gc.setForeground(fg);
-				gc.drawFocus(br.x, br.y, br.width, br.height);
-			}
-			else {
-				gc.setForeground(bg);
-				gc.drawRectangle(br.x, br.y, br.width-1, br.height-1);
-			}
-		}
-	}	
-}
\ No newline at end of file
diff --git a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/index.xml b/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/index.xml
deleted file mode 100644
index 3d04923..0000000
--- a/update/org.eclipse.update.ui.forms/src/org/eclipse/update/ui/forms/internal/index.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<form>
-<p>
-To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.
-</p>
-<li style="text" value="1.">To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.</li>
-<li style="text" value="2.">This is the item number 2.</li>
-<li style="text" value="3.">This is the item number 3.</li>
-</form>
\ No newline at end of file
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
